cocos2d

[cocos2d]CCLabelTTF

cocos2dで文字列を表示させたい時はCCLabelTTFを使います。
FlashのTextFieldみたいなものです。
使い方はこう

CCLabelTTF*sizelabel=[CCLabelTTF labelWithString:@"ImageSize" fontName:@"HiraKakuProN-W6" fontSize:12];
[sizelabel setAnchorPoint:ccp(0.0,1.0)];
sizelabel.positionInPixels=ccp(100.0,200.0);
[self addChild:sizelabel z:19];

[sizelabel setString:@"hoge"];

[cocos2d]線を引く

cocos2dで線を引くのはこうやる。
メソッド名は「draw」じゃないとダメ。
[self draw];とか書かなくてよい。
メソッド名を「drawLine」にして[self drawLine];で実行してもダメ。

-(void)draw{
    glColor4f(1.0, 0.0, 0.0, 1.0);
    glLineWidth(1.0f);
    CGPoint p1,p2;
    p1=CGPointMake(0.0,0.0);
    p2=CGPointMake(100.0,100.0);
    ccDrawLine(p1, p2);
}

[cocos2d]CCSequence#02 CCCallFuncND

iPhone Game「社畜!ナカムラくん」の制作で実践していた方法です。
CCSequenceを使ってメソッドを実行するとき
前のエントリーではCCCallFuncを使っていましたが
メソッドに値を渡したいときはCCCallFuncNDを使うとよい。
使い方はこんな感じ。
下記の例だとdataに渡す値をretainしないとEXC_BAD_ACCESSになる。

id act_func0,act_func1,act_func2;
CCSequence* seq;
act_func0=[CCCallFuncND actionWithTarget:self selector:@selector(playSE:data:) data:[[NSNumber numberWithInt:15]retain]];
act_func1=[CCCallFuncND actionWithTarget:self selector:@selector(playSE:data:) data:[[NSNumber numberWithInt:13]retain]];
act_func2=[CCCallFuncND actionWithTarget:self selector:@selector(playSE:data:) data:[[NSNumber numberWithInt:14]retain]];
seq=[CCSequence actions:act_func0,[CCDelayTime actionWithDuration:0.6f],act_func1,[CCDelayTime actionWithDuration:0.9f],act_func2,nil];
[se runAction:seq];

-(void)playSE:(id)n data:(id)v{
    NSNumber* dt=(NSNumber*)v;
    int seno=[dt intValue];
    switch (seno) {
        case 0:
            [[SimpleAudioEngine sharedEngine] playEffect:@"girigiri.mp3"];
            break;
        default:
            break;
    }
    [v release];
    v=nil;
}

[cocos2d]CCMenu

cocos2dでボタンを作るときはCCMenuが便利です。
使い方はこう

CCNode*setting=[CCNode alloc]init];
[self addChild:setting];

CCMenu*settingmenu=[[CCMenu alloc]initWithItems:nil vaList:nil];
[setting addChild:settingmenu z:21];
settingmenu.positionInPixels=CGPointZero;

CCMenuItemImage*item=[CCMenuItemImage itemFromNormalImage:@"ボタンの画像" selectedImage:@"タッチした時のボタンの画像" target:self selector:@selector(whenSettingTap:)];
[item setAnchorPoint:CGPointMake(0.0, 1.0)];
item.positionInPixels=ccp(195.0, 480.0-0.0);
[settingmenu addChild:item z:22 tag:5];

上記の例ではCCMenuを作ってからCCMenuItemを追加していますが、

CCNode*setting=[CCNode alloc]init];
[self addChild:setting];

CCMenuItemImage*item=[CCMenuItemImage itemFromNormalImage:@"ボタンの画像" selectedImage:@"タッチした時のボタンの画像" target:self selector:@selector(whenSettingTap:)];
[item setAnchorPoint:CGPointMake(0.0, 1.0)];
item.positionInPixels=ccp(195.0, 480.0-0.0);
item.tag=5;

CCMenu*settingmenu=[CCMenu menuWithItems:item, nil];
[setting addChild:settingmenu z:21];
settingmenu.positionInPixels=CGPointZero;
settingmenu reorderChild:item z:22];

というクラスメソッドを使った書き方も出来ます。
私は上のほうが好きです。

[cocos2d]サウンド

iPhone Game「社畜!ナカムラくん」で実践した方法。

initメソッドあたりでmp3ファイルをpreloadしておきます。

#import "SimpleAudioEngine.h"
[[SimpleAudioEngine sharedEngine] preloadBackgroundMusic:@"bgm.mp3"];//BGM
[[SimpleAudioEngine sharedEngine] preloadEffect:@"clock.mp3"];//サウンドエフェクト

BGMを鳴らすときは

[[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"bgm.mp3" loop:YES];

サウンドエフェクトを鳴らすときは

[[SimpleAudioEngine sharedEngine] playEffect:@"clock.mp3"];

ボリュームの調整

[SimpleAudioEngine sharedEngine].backgroundMusicVolume=1.0;
[SimpleAudioEngine sharedEngine].effectsVolume=0.5;

BGM一時停止

[[SimpleAudioEngine sharedEngine] pauseBackgroundMusic];

BGM再開

[[SimpleAudioEngine sharedEngine] resumeBackgroundMusic];

[cocos2d]CCMoveTo 座標を移動させる

CCSpriteなどの座標を移動させる方法です。

CCMoveTo,CCRotateToなどがあり、FlashのTweenクラスのようなものです。
CCSpriteを今の座標から110.0,110.0へイーズインアウトで移動させる時

CCSprite*sp=[CCSprite spriteWithFile:@"sc02.png"];
[self addChild:sp];
id moveto=[CCMoveTo actionWithDuration:0.4 position:ccp(110.0,110.0)];
id ease=[CCEaseInOut actionWithAction:moveto rate:2.0];
[sp runAction:ease];

止める時

[sp stopAllActions];

参考サイト
cocos2d for iPhone: Class List

[cocos2d]CCSequence#01

CCSpriteなどを「移動して5秒待って回転してメソッド実行」のような複合アクションさせる方法です。
よく忘れるのでメモ

-(void)testFunc{
    NSLog(@"hello");
}
CCSprite*sp=[CCSprite spriteWithFile:@"sc02.png"];
[self addChild:sp];
id moveto=[CCMoveTo actionWithDuration:0.4 position:ccp(110.0,110.0)];
id ease=[CCEaseInOut actionWithAction:moveto rate:2.0];
id roll=[CCRotateTo actionWithDuration:1.0 angle:74.0];
id act_func=[CCCallFunc actionWithTarget:self selector:@selector(testFunc)];
CCSequence*seq=[CCSequence actions:ease,[CCDelayTime actionWithDuration:5.0f],roll,act_func,nil];
[sp runAction:seq];

参考サイト
CCSequence Class Reference

[cocos2d]CCSprite#02 タイリングする

CCSpriteについて#02

タイリングする方法。下記コードでできる。

CCSprite* s=[CCSprite spriteWithFile:@"bridge.png":];
[s setAnchorPoint:CGPointMake(0.0, 0.5)];
ccTexParams params = {GL_LINEAR,GL_LINEAR,GL_REPEAT,GL_REPEAT};
[s.texture setTexParameters:¶ms];
[s setTextureRect:CGRectMake(0.0,0.0,42.0*4.0,62.0)];

と、思ったらうまくいかない。


この画像をタイリングしようとすると
本当は下記のようになって欲しい

理想

現実

何故か隙間が出来る。どうやらOpenGLESとやらは2の累乗ピクセルおきにタイリングするらしい。
widthが20pxなら32pxおきにタイリング。今回の画像はwidthが42pxだから64pxおきにタイリングされる。

これはどうにもならないらしい。うまいこと2の累乗ピクセルの画像にするしかないのか。
何かいい方法がわかったら追記します。

[cocos2d]CCSprite#01

CCSpriteについて#01

ファイルから

CCSprite*sp=[CCSprite spriteWithFile:@"image.png"];

中心点を設定する。デフォルトは(0.5,0.5)になっています。

[sp setAnchorPoint:ccp(0.0,0.0)];

画像の十字のところが中心点です。ここを中心に拡大したり、回転したりします。


  • [sp setAnchorPoint:ccp(0.0,0.0)];

  • [sp setAnchorPoint:ccp(0.5,0.5)];

  • [sp setAnchorPoint:ccp(1.0,1.0)];

参考サイト
CCSprite Class Reference

[cocos2d]シーンの切り替えで使用メモリが増えていく

iPhone Game「社畜!ナカムラくん」の制作で解決したのでメモ。

deallocメソッドでしっかりreleaseするのはもちろんですが
cocos2dだとそれをやっててもreplaceSceneを繰り返すと使用メモリが増えていきます。
色々試した結果、下記コードをdeallocメソッドに入れると解決しました。

[CCAnimationCache purgeSharedAnimationCache];
[[CCTextureCache sharedTextureCache] removeAllTextures];

cocos2dが画像やらアニメやらをキャッシュしてるみたいですね。