cocos2dでシューティングゲームを作る:cocos2d for iPhone レッスンノート(4章)

IMG_0825
前回、「cocos2d for iPhone レッスンノート」の第2章で神経衰弱ゲームの作成を学習しました。今回は、第4章で

アクションゲームの作り方を学びます。

第3章に、シーン管理を学習するためのノベルゲーム作りがありましたが、ノベルゲームよりもアクションゲームが作りたかったので飛ばしました。

今回は、第2章のようにスンナリとは行かず、躓きまくりました。
サンプルコードと睨めっこしながら、少しずつ進めたので自分にとっては勉強になりました。

■第1節~第2節:
どんなゲームにするかの仕様を決めます。
また、XcodeのTipsとして、ファイルをグループで管理する方法を学びます。プロジェクトが大規模になったときは便利だと思います。

■第3節:
プロジェクトファイルを作って準備します。cocos2dのHelloWorldクラスを消したりする作業は、第2章を見直してしっかりやった方が良いですね。
あと、使用する画像素材を用意します。
シングルトンというものについてコラムがありましたが、ちょっと私には未知の世界だったので今回はスルーしました。

■第3節-1:
AssWbinCQAAG4ca
パーティクル(CCParticleSystem)で背景に流れる星を表示する方法を学びます。cocos2dには、パーティクルの機能が提供されているので、すぐに使えて便利ですね。

ここで1度目の躓きがありました。
まず、GameScene.mの@implementation GameSceneで、//背景を配置する処理を追加のところで、~=[BackgroundLayer layer];とありましたが、~=[BackgroundLayer node];でした。
これは、サンプルコードと比べて違っていたので、すぐに気付いて特に問題はありませんでした。

あと、第3節-2の方(P.189)で「プロジェクトを実行する」とあるのですが、第3節-1の時点のGameScene.hに、P.181.の通りにenemyLayerとbeamLayerについて書いてしまうとエラーが起きます。後の方で、両者の実装があるので、それが済むまではコメントアウトしておくと良いです。

P.183でanchorPointについて図入りで説明があって分かりやすかったです。Flashで言うところの、ムービークリップの中心点みたいなものです。

■第3節-2:
次にプレーヤーを作成します。最初の方は、特に問題なくすんなりいきました。
P.184のCannon.hで、@interface Cannon:CCNode{の下にBoot started;が足りてなかったのは、サンプルコードと比べたら分かりました。
また、登場する物体によってクラスを作るという考え方が勉強になりました。ActionScriptでは、勉強が面倒でクラスの使い方を覚えなかったので、少しレベルアップです。

ところが、P.192で1度は学習の続行を諦めようかと思うほどの壁がありました。自機がタップに反応しないのです。
まずは、サンプルコードと見比べて、本のコードに足りない以下を補っていきました。

●GameScene.h
#improt"InterfaceLayer.h"
@InterfaceのInterfaceLayer *interfaceLaer;
@property (nonatomic, ・・・・*interfaceLyaer;

●GameScene.m
@synthesizeのinitのaddChild;
deallocのself.interfaceLayer;

それでも、まだ自機は動きません。サンプルコードの一部のファイルを、自分で入力してきたプロジェクトのファイルと交換したりしましたが、前にも見たSIGABRTってエラーやら、cocos2d:couldn’t add image:fire.png in CCTextureCacheと言うエラー(後で、このエラーは関係ないことが分かりました)も出てしまったので、章の最初からコードを入力し直してみました。それでも、ここから先へ進めません。
そんなこんなで、諦めようとtwitterで呟いたところ、本の執筆者の方から「タップの効かない不具合については、UIを担当しているレイヤーがaddTargetedDelegateで自分を登録しているかなど確認してみてください」とアドバイスを頂きました。
そこで、NSLog(@"myLog:%s", __func__);をonEnter、ccTouchBeganと怪しいところに仕掛けて、どこまで処理が進んでいるかを絞り込んでいきました。結果、タップを検知するためのCannon.mのstartが動いていないことが分かりました。
そこで、GameScene.mのinitのplayer関連の一番下に[self.player start];と入れたらタップに反応しました!
ここで壁を乗り越えて一気に先へ進むことになりました。
ちなみに、P.189のInterfaceLayer.mにinitが書かれていましたが、サンプルコードには無かったので不要なようです。
あと、ここではonEnter/onExitメソッド、ccTouchDispatcherクラス、convertToGLメソッドについて、本で少し掘り下げてくれます。

■第3節-3:
AtQ4-gfCQAEHNZP
敵キャラクターを作ります。 ここは、本の通りで問題なくできました。敵が画面の上からワラワラと登場してきた時、モチベーションが一気に上がってきました。
ここでは、ccMovetoとccRotateByなどでスプライトを動かすことを学びました。特に、ActionScriptではフレームでアニメーションを表現していたので、scheduleでテキストだけで動きを決めるのは新鮮でした。
また、配列に必要な敵を予め格納しておくことも勉強になりました。

■第3節-4:
AtV2906CEAEEOvK
ここでは、自機から発射される弾を作ります。その流れで、簡単な衝突判定を学びました。また、先ほどのcocos2d:couldn’t add image:fire.png in CCTextureCacheの回避方法については、ここで書かれていました。
ちなみに、ここでも本だけでは足りないコードを、サンプルコードで見つけました。

●GameScene.h
Interface GameSceneにCCLayer *beamLayer;
@propertyにbeamLayer

●GameScene.m
@synthesizeにbeamLayer

●enemyController.h
– (BOOL)checkCollision:(CGPoint)position;

■第3節-5:
ここでは、隕石が自機の弾幕を突破した後の判定と、その際に使うパーティクルシステムの演出を学びます。
特に、演出のアクション順を設定するCCSequenceは大変参考になります。

■第3節-6:
ここでは、スコア表示を付けます。CCLabelTTFという文字の表示方法を学びます。
ちなみに、本に無いコードとしては、GameScene.hの@interface GameScene:CCSceneの下に、CCLabelTTF *scoreLabel;が必要です。
あと、~;vとなっているところの「v」は不要です。
ここまでで、かなりゲームらしくなってきました。

■第3節-7:
Atltyk6CIAEkl5I
ゲームにポーズ機能を付けます。ポーズ機能の考え方についても学びます。
ここで本に足りないコードは、GameScene.mへの追加で#import "PauseLayer.h"が必要です。

■第3節-8:
AtrQsk5CMAEbUVy
ゲームオーバーを追加します。ここで、第3節-2で躓いた[self.player start] の本来の機能を果たす、[self startGame]がGameScene.mに追加されます。
ちなみに、本で少しおかしかったのは、GameScene.mがGameScene.hの中に書かれてしまっていたことです。これはスグに気付くと思います。
それ以外には、GameScene.mやGameScene.hの中に、gameoverに関することが本に書かれていませんが、サンプルコードと見比べればスグに分かります。
本に足りない部分をサンプルコードから探すのは、もう慣れっこなので苦ではありません。w

■第3節-9:
最後に音を付けて完成です。SimpleAudioEngineの使い方を学びます。本の付録にcocosDenshionについて書かれているので、とても参考になります。
ちなみに、最後の本の間違いは、P.227でGameScene.mと書かれていますが、Enemy.mです。これは、本文を見ればスグに気付きます。

AtzPJLbCEAAcHID
これで完成したゲームがこちらです。

■第4節:
使用したテクニックについて、しっかりと説明されています。
タッチイベントのハンドリング方法、アニメーションによる動きの表現、パーティクルシステム、ゲームを作るノウハウについて、3節でピックアップされていたことが掘り下げられています。
最後に、箇条書きで章のまとめを見ることができます。

と言う感じで、いろいろありましたが、結果的に有意義なレッスンになりました。もし壁が無いままに済んでいたら、コードを凝視することも無いので、また写して終わりとなるところでした。
今回、コード上で処理を追いかけてデバッグしていたことで、@propertyや@synthesize、-(id)initなどの書き方がどういう意味で書かれているのかが気になってきました。
サンプルコードを写すような学習は今回で終わりにして、次は自分のオリジナルアプリを作るべく(ワケあってCoreAnimationを使うことにしたので、もう1度「15歳からはじめる iPhone わくわくゲームプログラミング教室」へ戻りました。)、今回気になったObjective-Cのコーディングについての本を買って学ぶことにします。

★★★自作iPhoneアプリをAppStoreでリリースするまでの道のり★★★

cocos2dでシューティングゲームを作る:cocos2d for iPhone レッスンノート(4章)」への1件のフィードバック

  1. ピンバック: cocos2d for iPhoneレッスンノートを読み終わった! | 夜行帳

コメントは停止中です。