読者です 読者をやめる 読者になる 読者になる

プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

cocos2d 初めてのゲーム

cocos2dで作るiPhone&iPadゲームプログラミング4章

今回はゲームを作る章なのでxcode上での作業が中心になる。
かの有名なDoobleJumpをひっくりかえしたバージョンと書かれているが、DoobleJumpってなんだろう。
※デバイスを回転させてプレイヤースプライトを移動することにより落下物を避けるゲームらしい。

作り始めてみたところ、cocos2d v2のデフォルトプロジェクトには本に書かれていないIntroLayerというクラスがあった。どうやらスプラッシュ画面からHelloWorldLayerへのトランジションを行うシーンらしい。
とりあえず、GameSceneへのトランジションに差し替える。
v2の仕様はほとんど調べていないので動かない部分があったら調節する。

早速縦向きを使う場面があったのでググる
http://mettoboshi.com/cocos2d/cocos2d-portrait

実機で起動しようとしたらCould not launch〜エラーが出たのでDerivedDataを削除。以下引用

  1. デバイスをケーブルから抜く
  2. デバイスからアプリを削除する
  3. Xcode を終了する(⌘ + q)
  4. DerivedData を削除する(/Users/ユーザー名/Library/Developer/Xcode/DerivedData/アプリ名-ほにゃらら/)
  5. Xcode を起動して、もう一度ビルドする


プレイヤーの移動のように頻繁に発生するものにアクションは使わない。
アクションは若干ヘビーなため頻繁に発生させるのはパフォーマンスの低下を招く。

updateで除算を使わず乗算を使っているのはiOSデバイスのARMはハードウェアでの除算演算をサポートしていないため、通常は乗算のほうが高速だから。速度を重視する場面では除算を乗算に置き換える。

cocos2dには配列を扱うためのCCArrayというクラスが用意されている。NSArrayとNSMutableArrayのサブセットを実装していてそれらのクラスから初期化もできる。
P93にリファレンス

float actualDistance = ccpDistance(player.position, spider.position);//距離を算出

ccpDistanceは距離を算出する。他にもCGPointExtensionファイルの中に便利な数学関数がある。

CCLabelTTFの更新は重い。頻繁に更新する場合はCCLabelBMFont
付録Aに日本語フォントの使い方が書かれている。
ビットマップフォントを用意するにはHieroというツールを使う。他にもWindows用のBMFontというツールもある。
どうもうちの環境ではHieroがすぐ落ちてしまうので、そのうち他のツールを試してみよう。

cocos2dのツールリスト

http://www.learn-cocos2d.com/2011/06/complete-list-cocos2d-tools/
http://narudesign.com/devlog/etc-shoebox-bitmap-font/
キーワード「cocos2d ビットマップフォント」

オーディオファイルはMP3とCAF

iPad対応

http://rakuishi.com/iossdk/3733/

旧バージョンからの変更により、contentSize.heightとwinSizeの違いによって大きさに不備が出るのでそれぞれのデバイス用の画像を用意するかなんやかんやする必要がある。
ちょっとこの辺あとで詳しく調べる必要ある。

あと、サンプルに載ってた当たり判定の描画転載
これを見るとtagが一意じゃなくても取得しようと思えば取得できるっぽい。

chapter04/DoodleDrop05/ClassesGameScene.mより
// Only draw this debugging information in, well, debug builds.
#if DEBUG
-(void) draw
{
// Iterate through all nodes of the layer.
for (CCNode* node in [self children])
{
// Make sure the node is a CCSprite and has the right tags.
if ([node isKindOfClass:[CCSprite class]] && (node.tag == 1 || node.tag == 2))
{
// The sprite's collision radius is a percentage of its image width. Use that to draw a circle
// which represents the sprite's collision radius.
CCSprite* sprite = (CCSprite*)node;
float radius = [sprite texture].contentSize.width * 0.4f;
float angle = 0;
int numSegments = 10;
bool drawLineToCenter = NO;
ccDrawCircle(sprite.position, radius, angle, numSegments, drawLineToCenter);
}
}
}
#endif

参考:

cocos2dで作る iPhone&iPadゲームプログラミング

cocos2dで作る iPhone&iPadゲームプログラミング