開発環境
・Cocos2d-JS v.3.0
・Cocos Code IDE
Happy Birdからの改善点
・リセットボタンの設置
res(サンプル画像データ/音データ)
・ダウンロード(ZiPファイル)
app.js
// グローバル変数
var bird;
var scoreLabel;
var bg1;
var bg2;
var block1;
var block2;
var bgm;
var vSpeed = 0;
var score = 0;
// ゲームのレーヤー
var Game = cc.Layer.extend({
// (1)初期化の命令ブロック
init:function(){
this._super();
var size = cc.winSize;
// キャラクターを登場させる
bird = cc.Sprite(res.bird_png);
bird.setPosition(800/2, 450/2);
this.addChild(bird, 10);
// アニメーションしながら登場させる
// 0.01秒で4倍の大きさにする(1)
var scaleTo = cc.scaleTo(0.01, 4.0, 4.0);
// 0.3秒で360度回転させる(2)
var rotateBy = cc.rotateBy(0.3, 360);
// 0.3秒で元の大きさにする(3)
var scaleTo2 = cc.scaleTo(0.3, 1.0, 1.0);
// (2)と(3)を同時に実行する(4)
var spawn = cc.spawn(rotateBy,scaleTo2);
// (1)→(4)の順番で実行する
var sequence = cc.sequence(scaleTo,spawn);
bird.runAction(sequence);
// 背景画面を作る
bg1 = cc.Sprite(res.bg_star_png);
bg1.setAnchorPoint(0, 0);
bg1.setPosition(0, 0);
this.addChild(bg1, 1);
bg2 = cc.Sprite(res.bg_star_png);
bg2.setAnchorPoint(0, 0);
bg2.setPosition(800, 0);
this.addChild(bg2, 1);
// ブロックを作る(上に設置)
block1 = cc.Sprite(res.block_png);
block1.setAnchorPoint(0, 0);
block1.setPosition(600, 0);
this.addChild(block1, 2);
// ブロックを作る(下に設置)
block2 = cc.Sprite(res.block_png);
block2.setAnchorPoint(0, 1);
block2.setPosition(700, 450);
block2.setScale(1.0, 0.8)
this.addChild(block2, 2);
// BGMを再生する
bgm = cc.audioEngine;
bgm.playMusic(res.bgm_mp3, true);
// 点数ラベルを作る
scoreLabel = cc.LabelTTF("SCORE", "Arial", 20);
scoreLabel.setAnchorPoint(0, 0);
scoreLabel.setPosition(50, 400);
this.addChild(scoreLabel, 8);
// このレーヤーでタッチイベントを実行できるようにする
cc.eventManager.addListener({
event:cc.EventListener.TOUCH_ONE_BY_ONE,
swallowTouches:true,
onTouchBegan:this.onTouchBegan,
onTouchMoved:this.onTouchMoved,
onTouchEnded:this.onTouchEnded,
}, this);
// updateの命令ブロックを呼び出す
this.scheduleUpdate();
return true;
},
// (2)updateの命令ブロック(毎フレームごとに呼び出される)
update:function(){
// 背景画面を横に動かす
bg1.setPosition(bg1.getPosition().x - 1, bg1.getPosition().y);
bg2.setPosition(bg2.getPosition().x - 1, bg2.getPosition().y);
// 背景画面をループさせる
if (bg1.getPosition().x < -800) {
bg1.setPosition(800, 0);
}
if (bg2.getPosition().x < -800) {
bg2.setPosition(800, 0);
}
// ブロックを横に動かす
block1.setPosition(block1.getPosition().x - 2, block1.getPosition().y);
block2.setPosition(block2.getPosition().x - 2, block2.getPosition().y);
// ブロックをループさせる
if (block1.getPosition().x < -50) {
block1.setPosition(900, 0);
}
if (block2.getPosition().x < -50) {
block2.setPosition(1100, 450);
}
// キャラクターを動かす
var pos = bird.getPosition();
vSpeed -= 0.1;
// 落下スピードを加速させる
bird.setPosition(pos.x, pos.y + vSpeed);
// 点数を動かす
score++;
scoreLabel.setString("SCORE:" + score + "m");
// 衝突したらゲームオーバー
// キャラクターの枠を取得する
var birdRect = bird.getBoundingBox();
// ブロックの枠を取得する
var block1Rect = block1.getBoundingBox();
var block2Rect = block2.getBoundingBox();
// もし枠同士がぶつかったら、
if (cc.rectIntersectsRect(birdRect, block1Rect)) {
// ゲームオーバーの命令ブロックを呼び出す
this.gameOver();
}
if (cc.rectIntersectsRect(birdRect, block2Rect)) {
// ゲームオーバーの命令ブロックを呼び出す
this.gameOver();
}
// もし地面とぶつかったら、
if (pos.y <= 40) {
// ゲームオーバーの命令ブロックを呼び出す
this.gameOver();
}
},
// (3)タッチイベントの命令ブロック
onTouchBegan:function(touch,event){
// タッチすると羽の音が鳴る
var sound = cc.audioEngine;
sound.playEffect(res.swing_mp3);
// タッチするとキャラクターが上昇する
vSpeed = 5;
// キャラクターにアニメーションを付ける
var rotate = cc.rotateTo(0.01, -10);
var rotate2 = cc.rotateTo(1.0, 20);
var sequence = cc.sequence(rotate, rotate2);
bird.runAction(sequence);
return true;
},
// (4)ゲームオーバーの命令ブロック
gameOver:function(){
// update命令ブロックを停止する
this.unscheduleUpdate();
// 衝突音を出す
var sound = cc.audioEngine;
sound.playEffect(res.hit_sound_mp3);
// BGMを停止する
bgm.stopMusic();
// タッチイベントを除去してジャンプしないようにする
cc.eventManager.removeAllListeners();
// ゲームオーバーを表示する
var gameover = cc.Sprite(res.gameover_png);
gameover.setPosition(800/2, 450/2);
this.addChild(gameover, 20);
// リセットボタンを作成する
// 「もう一度」が押されると、リセットの命令ブロックが呼び出される
var resetButton = cc.MenuItemFont("もう一度", this.onReset);
// リセットボタンのサイズを決める
resetButton.setFontSize(30);
// menuの中にリセットボタンを代入する
var menu = cc.Menu(resetButton);
// menuの表示位置を決める
menu.setPosition(800/2, 100);
// menuを画面に追加する
this.addChild(menu, 20);
},
// (5)リセットの命令ブロック
onReset:function(){
// グローバル変数を初期化する(nullは空っぽの意味)
bird = null;
scoreLabel = null;
bg1 = null;
bg2 = null;
block1 = null;
block2 = null;
bgm = null;
vSpeed = 0;
score = 0;
// 再度、GameSceneを呼び出してゲームスタート!
cc.director.replaceScene(new GameScene);
}
});
// ゲームのシーン
var GameScene = cc.Scene.extend({
onEnter:function(){
this._super();
var layer = new Game();
layer.init();
this.addChild(layer);
}
});
resource.js
var res = {
bg_star_png : "res/bg_star.png",
bgm_mp3 : "res/bgm.mp3",
bird_png : "res/bird.png",
block_png : "res/block.png",
gameover_png : "res/gameoverIMG.png",
hit_sound_mp3 : "res/hit_sound.mp3",
swing_mp3 : "res/swing.mp3"
};
var g_resources = [];
for (var i in res) {
g_resources.push(res[i]);
}
main.js
cc.game.onStart = function(){
cc.view.adjustViewPort(true);
cc.view.setDesignResolutionSize(800, 450, cc.ResolutionPolicy.SHOW_ALL);
cc.view.resizeWithBrowserSize(true);
//load resources
cc.LoaderScene.preload(g_resources, function () {
cc.director.runScene(new GameScene());
}, this);
};
cc.game.run();