cocos2d-html5で画面遷移
|cocos2d-JS 3.0シリーズの続きです。
コードメインなので少し長くなりますが、スプライトシートの使い方や画面遷移、メニューオブジェクトの利用など雛形として利用できるように記述しているので、参考にしてみてください。
*自分の雛形なので綺麗では無い箇所もあると思います。
画面遷移を実装する
メニューボタンとヘルプボタンを表示して、ゲーム画面、結果画面への遷移を実装してみたいと思います。
素材準備
背景が単色だと気分が乗らないのでTOP画面だけ背景を準備しました。
*適当に準備して下さい
メニューはスプライトシートから読み込んで横に並べます。
利用したスプライトシート
利用したplist
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>frames</key> <dict> <key>sprite_sheet0000</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,100}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{0,0},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet0001</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,100}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{100,0},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet0002</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,100}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{200,0},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet0003</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,100}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{300,0},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet0004</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,100}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{400,0},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet0005</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,100}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{0,100},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet0006</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,100}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{100,100},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet0007</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,100}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{200,100},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet0008</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,100}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{300,100},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet0009</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,100}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{400,100},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_button0000</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{162,62}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{162,62}</string> <key>spriteSourceSize</key> <string>{162,62}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{0,200},{162,62}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_button0001</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{162,62}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{162,62}</string> <key>spriteSourceSize</key> <string>{162,62}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{162,200},{162,62}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_button0002</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{162,62}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{162,62}</string> <key>spriteSourceSize</key> <string>{162,62}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{324,200},{162,62}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_button0003</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,0},{162,62}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{162,62}</string> <key>spriteSourceSize</key> <string>{162,62}</string> <key>spriteTrimmed</key> <false/> <key>textureRect</key> <string>{{0,262},{162,62}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_drag0000</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,1},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,101}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <true/> <key>textureRect</key> <string>{{162,262},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_drag0001</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,1},{100,100}}</string> <key>spriteOffset</key> <string>{0,-1}</string> <key>spriteSize</key> <string>{100,101}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <true/> <key>textureRect</key> <string>{{262,262},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_drag0002</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,1},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,101}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <true/> <key>textureRect</key> <string>{{362,262},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_drag0003</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,1},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,101}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <true/> <key>textureRect</key> <string>{{0,362},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_drag0004</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,1},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,101}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <true/> <key>textureRect</key> <string>{{100,362},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_drag0005</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,1},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,101}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <true/> <key>textureRect</key> <string>{{200,362},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_drag0006</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,1},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,101}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <true/> <key>textureRect</key> <string>{{300,362},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_drag0007</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,1},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,101}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <true/> <key>textureRect</key> <string>{{400,362},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_drag0008</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,1},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,101}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <true/> <key>textureRect</key> <string>{{0,462},{100,100}}</string> <key>textureRotated</key> <false/> </dict> <key>sprite_sheet_drag0009</key> <dict> <key>aliases</key> <array/> <key>sourceColorRect</key> <string>{{0,1},{100,100}}</string> <key>spriteOffset</key> <string>{0,0}</string> <key>spriteSize</key> <string>{100,101}</string> <key>spriteSourceSize</key> <string>{100,100}</string> <key>spriteTrimmed</key> <true/> <key>textureRect</key> <string>{{100,462},{100,100}}</string> <key>textureRotated</key> <false/> </dict> </dict> <key>metadata</key> <dict> <key>format</key> <integer>3</integer> <key>size</key> <string>{512,1024}</string> <key>target</key> <dict> <key>name</key> <string>spritesheets.png</string> <key>textureFileName</key> <string>spritesheets</string> <key>textureFileExtension</key> <string>png</string> <key>premultipliedAlpha</key> <true/> </dict> </dict> </dict> </plist>
利用準備
リソースに追加します。
var res = { i_bg_home : "res/image/bg_home.png", i_sprite_sheets : "res/image/spritesheets.png", i_sprite_sheets_plist : "res/image/spritesheets.plist" }; var g_resources = [ //image res.i_bg_home, res.i_sprite_sheets, //plist res.i_sprite_sheets_plist //fnt //tmx //bgm //effect ];
スプライトシートに画像をキャッシュします。
cc.game.onStart = function(){ cc.view.setDesignResolutionSize(640, 960, cc.ResolutionPolicy.SHOW_ALL); cc.view.resizeWithBrowserSize(true); //load resources cc.LoaderScene.preload(g_resources, function () { //スプライトシートの準備 cc.spriteFrameCache.addSpriteFrames(res.i_sprite_sheets_plist,res.i_sprite_sheets); //ホームの表示 cc.director.runScene(new HomeScene()); }, this); }; cc.game.run();
src/scene/ResultScene.jsを追加する予定なので、project.jsonに追加します。
{ "project_type": "javascript", "debugMode" : 1, "showFPS" : false, "frameRate" : 60, "id" : "gameCanvas", "renderMode" : 0, "engineDir":"frameworks/cocos2d-html5", "modules" : ["cocos2d"], "jsList" : [ "src/resource.js", "src/scene/homeScene.js", "src/scene/gameScene.js", "src/scene/resultScene.js" ] }
コード記述
スプライトシートからの読込ですが、main.jsでキャッシュしたスプライト画像からplistに定義されている名称で切り取り位置を取得し、frameとして切り出します。
切り出したframeからspriteを生成することで画像を取り出すことが出来ます。
//サンプルコード var frame = cc.spriteFrameCache.getSpriteFrame('sprite_sheet_button0000').getRect(); var sprite = cc.SpriteFrame.create(frame);
それではMenuItemSpriteを生成してMenuの追加を行ってみましょう。
//ホームシーンの定義 var HomeScene = (function(){ //画面レイヤーの定義 var Layer = cc.Layer.extend({ //初期化 init : function () { /********* * 共通処理 * *********/ this._super(); var size = cc.director.getWinSize(); /********** * 背景の描画 * **********/ var bg_img = cc.Sprite.create(res.i_bg_home); bg_img.setAnchorPoint(cc.p(0,0)); bg_img.setPosition(0,0); this.addChild(bg_img,1); /************* * メニューの描画 * *************/ //メニューの表示 var menu = cc.Menu.create( //スタートボタン cc.MenuItemSprite.create( cc.Sprite.create( cc.SpriteFrame.create(res.i_sprite_sheets,cc.spriteFrameCache.getSpriteFrame('sprite_sheet_button0000').getRect()) ), cc.Sprite.create( cc.SpriteFrame.create(res.i_sprite_sheets,cc.spriteFrameCache.getSpriteFrame('sprite_sheet_button0001').getRect()) ), null, 'onGame', this ), //ヘルプボタン cc.MenuItemSprite.create( cc.Sprite.create( cc.SpriteFrame.create(res.i_sprite_sheets,cc.spriteFrameCache.getSpriteFrame('sprite_sheet_button0002').getRect()) ), cc.Sprite.create( cc.SpriteFrame.create(res.i_sprite_sheets,cc.spriteFrameCache.getSpriteFrame('sprite_sheet_button0003').getRect()) ), null, 'onHelp', this ) ); menu.alignItemsHorizontallyWithPadding (30); menu.setPosition(size.width / 2, size.height/2); this.addChild(menu,2); return true; }, //ゲーム開始 onGame : function(){ //ゲーム開始画面へ遷移 var transition = cc.TransitionFade.create(1.0,new GameScene()); cc.director.pushScene(transition); //追加済みのイベントを削除 cc.eventManager.removeAllListeners(); //追加済みのオブジェクトを解除 this.removeAllChildren(); }, //ヘルプの表示 onHelp : function(){ // TODO ヘルプ画面への遷移 } }); //画面定義の返却 return cc.Scene.extend({ onEnter:function () { this._super(); var layer = new Layer(); layer.init(); this.addChild(layer); } }); })();
ゲームロジックは後々記述するとして、特定位置にドラッグしたらゲームクリアになるようにしてみました。
//ゲームシーンの定義 var GameScene = (function(){ //画面レイヤーの定義 var Layer = cc.Layer.extend({ //プロパティ obj : null, touched : null, trap : null, //初期化 init : function () { /********* * 共通処理 * *********/ this._super(); var size = cc.director.getWinSize(); /********** * ゲーム画面 * **********/ //罠の位置 this.trap = cc.p(100,100); //TODO ゲームの実装 this.obj = cc.LabelTTF.create("GoMove!", "Arial", 38); this.obj.setPosition(size.width / 2, size.height/2); this.addChild(this.obj,1); //タッチイベント var self = this; var touch = cc.EventListener.create({ event: cc.EventListener.TOUCH_ALL_AT_ONCE, swallowTouches: true, //タッチ開始 onTouchesBegan:function (touches, event) { self.touched = touches[0].getLocation(); }, //タッチ移動 onTouchesMoved:function (touches, event) { self.touched = touches[0].getLocation(); }, //タッチ終了 onTouchesEnded:function (touches, event) { self.touched = null; }, //タッチキャンセル onTouchesCancelled:function (touches, event) { self.touched = null; } }); cc.eventManager.addListener(touch,this); this.scheduleUpdate(); return true; }, //フレーム更新 update : function(dt){ //メッセージの移動 var pos = this.obj.getPosition(); pos = cc.p(pos.x,pos.y); if(this.touched){ pos.x = this.touched.x; pos.y = this.touched.y; this.obj.setPosition(pos); } //クリア判定 if(cc.pDistance(pos,this.trap)<30){ this.onResult(); } }, //クリア画面 onResult : function(){ //ゲーム開始画面へ遷移 var transition = cc.TransitionFade.create(1.0,new ResultScene()); cc.director.pushScene(transition); //追加済みのイベントを削除 cc.eventManager.removeAllListeners(); //追加済みのオブジェクトを解除 this.removeAllChildren(); }, }); //画面定義の返却 return cc.Scene.extend({ onEnter:function () { this._super(); var layer = new Layer(); layer.init(); this.addChild(layer); } }); })();
ゲームクリア後はトップ画面へ戻れるようにします。
//結果シーンの定義 var ResultScene = (function(){ //画面レイヤーの定義 var Layer = cc.Layer.extend({ //初期化 init : function () { /********* * 共通処理 * *********/ this._super(); var size = cc.director.getWinSize(); //画面タップでHomeへ移動 var self = this; this.scheduleOnce(function(){ var goGameLabel = cc.LabelTTF.create("画面をタップして下さい!","Arial",20); goGameLabel.setPosition(cc.p(size.width/2,size.height/2 - 80)); self.addChild(goGameLabel); //タッチイベント var touch = cc.EventListener.create({ event: cc.EventListener.TOUCH_ALL_AT_ONCE, swallowTouches: true, //タッチ終了 onTouchesEnded:function (touches, event) { cc.director.pushScene(new HomeScene()); //追加済みのイベントを削除 cc.eventManager.removeAllListeners(); } }); cc.eventManager.addListener(touch,self); },2.0); return true; } }); //画面定義の返却 return cc.Scene.extend({ onEnter:function () { this._super(); var layer = new Layer(); layer.init(); this.addChild(layer); } }); })();
この状態で確認してみましょう!