CCRepeatForever は CCSequence の中では使えない
やろうとしたら BAD_ACCESS になった。
prog_guide:actions_composition - cocos2d for iPhone
IMPORTANT: CCRepeatForever is not a valid CCIntervalAction. You can't use a CCRepeatForever inside a CCSequence action.
らしい。
導入アニメしたあと、ループさせたいような場合はよくあるからこれできないと不便なきもする。
そう言うことがしたい場合は CCCallFunc
でアニメーションの終了をもらいそこで CCRepeatForever
する。CCCallBlock
っていう Blocks インタフェースあるからそれ使えばメソッド増やさなくてもいいようだ。
cocos2d の Spritesheet の Retina 対応
cocos2d ではメモリ効率よく画像リソースをあつかうために以下のような CSS Sprite っぽい画像に複数リソースを格納して使うことができる。
cocos2d 自体は 0.99.5 から Retina 対応するようで、通常の画像ファイルなら -hd.png
のような suffix で画像を置いておけば自動的にそいつが使われるようになった。
スプライトシートでの対応方法が見つけられなかったので、いろいろ試してみた。
結論から書くと、
- time_num.png
- time_num-hd.png
- time_num.plist
- time_num-hd.plist
とそれぞれファイルを作成する。plist のなかのファイル名は -hd
ありなしに関わらずどちらもおなじ物を指定する必要がある。
そのうえで、
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"time_num.plist"];
CCSpriteBatchNode* time_num = [CCSpriteBatchNode batchNodeWithFile:@"time_num.png"];
[self addChild:time_num];
CCSprite* time = [CCSprite spriteWithSpriteFrameName:@"time_num1.png"];
time.position = ccp(160, 240);
[self addChild:time];
などとすればいいようだ。座標系をただ倍にすればいいような単純な高解像度画像のためにもわざわざ別途plistを用意してあげなければいけないのが若干めんどくさい。
plist 作成が面倒な場合、
CCTexture2D* texture = [[CCTextureCache sharedTextureCache] addImage:@"time_num.png"];
CCSpriteFrame *frame = [CCSpriteFrame frameWithTexture:texture rect:CGRectMake(0, 0, 10, 14)];
というような感じでテクスチャを自前で切り出して使うことも可能のようだが、こっちのほうがコードが煩雑になりそう。
(0.99.5-rc1 でためしてます)