[cocos2d]の使い方とか超雑多なメモ

半年くらい前のメモなので、現在はいろいろ違うかも。

たとえば背景スプライトをセットする

// ディスプレイのサイズを取得
CGSize winSize = [CCDirector sharedDirector].winSize;

// 画像ファイル名を指定してCCSpriteを生成
CCSprite *bgImage;
bgImage = [[CCSprite spriteWithFile:@"imagefile.png"
  rect:CGRectMake(winSize.width / 2, winSize.height / 2, winSize.width, winSize.height)] retain];

// self(CCLayer)にスプライトを追加
[self addChild: bgImage];

こういうスプライトは スプライト.anchoPoint = CGPointZero にする方が楽。以下のようにすれば済むから

CCSprite *bgImage;
bgImage = [[CCSprite spriteWithFile:@"imagefile.png"] retain];
bgImage.anchorPoint = CGPointZero;
[self addChild: bgImage];

画面を縦画面にする

GameConfig.h を

#define GAME_AUTOROTATION kGameAutorotationCCDirector

RootViewController.m を

#elif GAME_AUTOROTATION==kGameAutorotationCCDirector

  if( interfaceOrientation == UIInterfaceOrientationPortrait ) {
    [[CCDirector sharedDirector] setDeviceOrientation: kCCDeviceOrientationPortrait];
  } else if ( interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
    [[CCDirector sharedDirector] setDeviceOrientation: kCCDeviceOrientationPortraitUpsideDown];
  }

UIView を使う

CCUIViewWrapper - wrapper for manipulating UIViews using Cocos2D ≪ cocos2d for iPhone が便利

次のシーンにデータを受け渡す

// CCSceneを生成
CCScene *nextScene = [NextScene scene];

// 次のシーンの一番下位のレイヤーを取得
NextScene *nextSceneLayer = [nextScene.children objectAtIndex:0];

// レイヤーのプロパティからデータを受け渡ししたり
nextSceneLayer.dataA = @"データえー";
nextSceneLayer.dataB = @"データびー";

// レイヤーのメソッドを実行したりできる
[nextSceneLayer execMethod];

// で、データを変更したりしたあとに画面遷移
[[CCDirector sharedDirector]
 replaceScene: [CCTransitionCrossFade transitionWithDuration:0.8f scene:nextScene]];

[生成したシーン.children objectAtIndex:0] で レイヤーを取得できるので、 replaceSceneする前に 値を渡したりメソッドを実行させておけばいい

CCSprite などの CCNodeサブクラスのメモリ解放

- (void)dealloc {
  [bgImage removeFromParentAndCleanup:YES];
  [bgImage release];

  [super dealloc];
}

こんな感じで removeFromParentAndCleanup:YES を実行する。 CCSprite を retain しているのなら release も忘れずに。

タッチが効かない?

「どうした!?動け…動けアシュタロン!!」

タッチが効かなくてハマったんだけど動かない原因はとてもくだらなかった

レイヤー.isTouchEnabled = YES;

を忘れてた。あるいは、

- (void)registerWithTouchDispatcher {
  [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
}

を忘れていた。

2Dゲームならこれやっとかないと余分な線が描画されてしまう

[director setProjection:kCCDirectorProjection2D];

cocos2d とか cocos2dじゃないリンクのメモ

cocos2d についての本

cocos2dをやるなら必読といっても過言ではない良書。cocos2d-xしか触らない人でもキチンと学習したいなら読むべきかと思う。

入門用。必読ってほどではないけれど導入にサラッとやってみたい場合は買っても損はないかなって感想。

Share
関連記事