アクションゲーム開発日誌[iphone]

iphone向けゲームの開発日誌を徒然なるままに。
ドット絵描いたりもします。開発TIPSも時々は。

※読者登録・ペタ・コメント歓迎しております。
※画像は基本開発に使いますので、著作権は手放せません。個人使用以外の使用はお控えください。


テーマ:

はい。今日の記事は久々のcocos2dです。
以前、sceneというのは紙芝居でいう木の枠だ、というお話と
sceneの実装処理をやりました(前回記事)


紙芝居では基本的に同じ枠で別のお話をする
(今日は桃太郎、明日は金太郎をやるとしても、使う木の枠は同じ)と思うのですが、

プログラム的には、一つのお話は一つの枠にいれておいて、
ささっと別のお話を演じる事が出来るようにしておきます。



ゲーム的に言えば、タイトル画面のscene、ゲーム画面のscene、オプション画面のsceneなどでしょうか。
他にも色々。

要は基本的に一つのsceneには一つの画面を入れておいて、
画面切り替えとか簡単に出来るようにしてしまおう!って事ですね。

あまり一つのsceneにごちゃごちゃつめ込み過ぎると処理が見づらくなってしまいますしね。
1機能に1画面、1画面に1sceneです。





では前置きが長くなりましたが、scene切り替えの実装処理を。



まず、scene切り替えには大きく分けで4種類の方法があります。

(runWithScene)プログラム起動後、最初のsceneを起動する処理。
(replaceScene)直前のsceneはもう使わないから捨ててしまう方法。基本はこれになります。

(pushScene)直前のsceneに戻る予定があるので、メモリに取っておく方法です。

(popScene)pushしたsceneを消して、元のsceneに戻る処理。



pushとpopは、ゲーム中にオプション画面を開いてまた戻ってくる時などに使用します。



各コードはこんな感じです。



・runWithScene


一番最初に実行するシーンはこいつで実行しましょう。

-(void)run{

  //シーンの実体化
  CCScene *scene = [CCScene node];

  //レイヤーの実体化

  Layer1 *layer = [Layer1 node]

  //シーンにレイヤーを設置

  [scene addChild: layer z:0];

  //作成したシーンを実行
  [[CCDirector sharedDirector] runWithScene: scene];

}


・replaceScene


今のシーンはもう使わないので、メモリからも削除します。
タイトル画面→ゲーム画面など、一方通行の場合はこの呼び出し方で。

-(void)replace{

  CCScene *scene = [CCScene node];
  Layer1 *layer = [Layer1 node]
 
 [scene addChild: layer z:0];

  //作成したシーンを実行
  [[CCDirector sharedDirector] replaceScene: scene];

}

・pushScene

・popScene


一時的に別のシーンを呼び出すけど、すぐにまた戻ってくる場合の呼び出し方。
ゲーム画面→オプション画面や、
ゲーム画面→ポーズ画面など、一時停止したい場合にも使えます。

プッシュして別シーンの呼び出し
-(void)push{
CCScene * scene = [CCScene node];
[scene addChild: [Layer2 node] z:0];
[[CCDirector sharedDirector] pushScene: scene];
}

プッシュされたシーンを消す場合
-(void)pop{
[[CCDirector sharedDirector] popScene];
}



とまあ以上がシーンの遷移方法です。
用途によって、遷移の方法も使い分けてください。


ちなみに、sceneの実体化には2種類の方法があります。

①sceneとlayerのクラスをそれぞれ実体化する方法。


こちらの方が分かりやすいと思います。
先ほども書きましたが、

-(void)runScene{

  //シーンの実体化

  CCScene *scene = [CCScene node];

  //レイヤーの実体化

  Layer1 *layer = [Layer1 node]

  //シーンにレイヤーを設置

  [scene addChild: layer z:0];

  //作成したシーンを実行
  [[CCDirector sharedDirector] runWithScene: scene];

}


順番にシーンを実体化して、レイヤーを実体化して、
実体化したレイヤーをシーンに貼付けてシーンの完成!

そして作成したシーンを実行する、というパターン。



②:Sceneクラスの+(CCScene *) sceneを使用する方法


実行元のクラス
-(void)runscene{

 

  TitleScene(レイヤー)クラスの+sceneの返り値(CCScene)をsceneとしてrun。

  [[CCDirector sharedDirector] runWithScene: [TitleScene scene]];
  
}

呼び出すscene(実際はレイヤー)クラス
(ヘッダ)
@interface TitleScene : CCLayer {
}
+(CCScene *) scene;


(ボディ)
@implementation TitleScene
+(CCScene *) scene
{
// sceneクラスを実体化
CCScene *scene = [CCScene node];

// レイヤーを実体化(レイヤークラスのinit処理でオブジェクト設置)
TitleScene *layer = [TitleScene node];

// レイヤーをsceneに設置
[scene addChild: layer];

// レイヤーをくっつけたsceneクラスを返り値として出力
return scene;
}


これは、レイヤークラスの+(CCScene *)scene処理から返ってくる返り値を
sceneの実体としてrunする処理です。

-ではなく+で描かれた処理のみ「クラスを実体化しなくても実行出来る」事を利用します。

分からない人は分からないままで問題ないです。
私も分からないままコードを書いていて、理解したのは最近です。




コード読んで意味は分からないまでも、
とりあえず動かし方が分かっていればなんとかなるものですね。

そのうち理解出来るときがくると思います。

 

AD
いいね!した人  |  コメント(0)  |  リブログ(0)

ハシモトさんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります

最近の画像つき記事  もっと見る >>

AD

ブログをはじめる

たくさんの芸能人・有名人が
書いているAmebaブログを
無料で簡単にはじめることができます。

公式トップブロガーへ応募

多くの方にご紹介したいブログを
執筆する方を「公式トップブロガー」
として認定しております。

芸能人・有名人ブログを開設

Amebaブログでは、芸能人・有名人ブログを
ご希望される著名人の方/事務所様を
随時募集しております。