info

category : App Develop
[cocos2d]CCMoveTo 座標を移動させる  @ App Develop , cocos2d 2012年5月23日
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  @ App Develop , cocos2d 2012年5月22日
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 タイリングする  @ App Develop , cocos2d 2012年5月20日
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  @ App Develop , cocos2d 2012年5月19日
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

[Xcode]アプリ名のローカライズ  @ App Develop , Xcode 2012年5月18日
よく忘れるのでメモ。

1. Resourceなどを右クリックして「New File」
2. Strings Fileを選択
3. ファイル名をInfoPlist.stringsに
4. InfoPlist.stringsを選択して右カラムのLocalizationの「+」で言語を追加
5. 出来たInfoPlist.strings(English)を選択し下記を記述
CFBundleName = "hoge";
CFBundleDisplayName = "hoge";


参考画像



[objective-c]NSUserDefaults  @ App Develop , objective-c 2012年5月17日
NSUserDefaultsは一時的に情報を記録出来るクラスです。
アプリをアップデートしたりすると消えます。多分。FlashのSharedObjectのようなものです。

使い方
-(void)saveData{
    NSUserDefaults *me=[NSUserDefaults standardUserDefaults];
    [me setFloat:prop1 forKey:@"prop1"];
    [me setFloat:prop2 forKey:@"prop2"];
    [me setFloat:prop3 forKey:@"prop3"];
    [me setFloat:prop4 forKey:@"prop4"];
    [me setFloat:prop5 forKey:@"prop5"];
    [me synchronize];
}
-(void)loadData{
    NSUserDefaults *me=[NSUserDefaults standardUserDefaults];
    NSArray*obj=[NSArray arrayWithObjects:@"0.05",@"-0.5",@"0.4",@"0.1",@"1.0", nil];//各変数の初期値
    NSArray*key=[NSArray arrayWithObjects:@"prop1",@"prop2",@"prop3",@"prop4",@"prop5", nil];
    NSDictionary *appDefaults = [NSDictionary dictionaryWithObjects:obj forKeys:key];
    [me registerDefaults:appDefaults];
    
    prop1=[me floatForKey:@"prop1"];
    prop2=[me floatForKey:@"prop2"];
    prop3=[me floatForKey:@"prop3"];
    prop4=[me floatForKey:@"prop4"];
    prop5=[me floatForKey:@"prop5"];
}
-(void)removeData{
    NSUserDefaults *me=[NSUserDefaults standardUserDefaults];
    [me removeObjectForKey:@"prop1"];
    [me removeObjectForKey:@"prop2"];
    [me removeObjectForKey:@"prop3"];
    [me removeObjectForKey:@"prop4"];
    [me removeObjectForKey:@"prop5"];
    [me synchronize];
}


initメソッドあたりでloadDataする。
saveDataで保存して、removeDataで消す。簡単。


[cocos2d]シーンの切り替えで使用メモリが増えていく  @ App Develop , cocos2d 2012年5月14日
iPhone Game「社畜!ナカムラくん」の制作で解決したのでメモ。

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

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

[cocos2d]アニメーション  @ App Develop , cocos2d 2012年5月13日
iPhone Game「社畜!ナカムラくん」で実践していた方法です。
おおまかな作業の流れは下記のようにしていました。
1. Flashでアニメーションを制作
2. pngシーケンスで書き出す
3. Zwoptex(有料)で一枚のpngに出力
4. CCSpriteに表示


1. Flashでアニメーションを制作
30fpsでアニメーションを作ります
作ったものがこれ


2. pngシーケンスで書き出す
Flashにて「ファイル」→「書き出し」→「ムービーの書き出し」
でフォーマットを「pngシーケンス」にして任意のフォルダへ書き出す。


3. Zwoptex(有料)で一枚のpngに出力
Zwoptexで一枚にしてplistファイルを書き出します。
Zwoptexはcocos2dで使用するSpriteSheetを書き出すツールです。
公式サイトはこちらZwoptex
15ドルでMacAppStoreからも買えます。
・Zwoptexを起動
・「File」→[New]
・pngシーケンスをドロップ
・「Layout」クリック
・「Publish」
で一枚pngとplistファイルが書き出されます。



4. CCSpriteに表示
XcodeのResourceフォルダあたりに一枚pngとplistファイルをドロップします。
そして下記コードからCCSpriteに表示します。
-(NSString*)pzero:(int)a keta:(int)keta{
    NSString *b=[NSString stringWithFormat:@"%d",a];
    while ([b length]=enno; a--) {
            NSString* file=[NSString stringWithFormat:@"%@%@.png",frame,[self pzero:a keta:4]];
            CCSpriteFrameCache* frameCache=[CCSpriteFrameCache sharedSpriteFrameCache];
            CCSpriteFrame* sframe=[frameCache spriteFrameByName:file];
            [frames addObject:sframe];
        }
    }
    return [[[CCAnimation alloc]initWithFrames:frames delay:delay]autorelease];
}
-(void)initAnimeFrames:(NSString*)key animename:(NSString*)animename stno:(int)stno enno:(int)enno delay:(float)delay{
    CCAnimation* ani=[[CCAnimationCache sharedAnimationCache] animationByName:animename];
    if(ani!=nil)return;
    
    CCAnimation* anim = [self animationWithFrame:key stno:stno enno:enno delay:delay];
    [[CCAnimationCache sharedAnimationCache] addAnimation:anim name:animename];
}
-(void)initPlist:(NSString*)plistkey{
    CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
    NSString *s=[NSString stringWithFormat:@"%@.plist",plistkey];
	[frameCache addSpriteFramesWithFile:s];
}
-(void)initAnime{
    [self initPlist:@"walk"];
    [self initAnimeFrames:@"walk" animename:@"walk" stno:1 enno:33 delay:0.05f];
}
-(id)init{
    self=[super init];
    if (self) {
        [self initAnime];
    }
    return self;
}


-(CCAnimation*)getAnime:(NSString*)key{
    return [[CCAnimationCache sharedAnimationCache] animationByName:key];
}
-(void)setAnime:(CCSprite*)sp animename:(NSString*)animename repeat:(BOOL)repeat{
    NSString* n=animename;
    CCAnimation* anim =[self getAnime:n];
    if(anim==nil){
        return;
    }
    CCAnimate* animate=[CCAnimate actionWithAnimation:anim];
    if (repeat) {
        CCRepeatForever* ccrepeat = [CCRepeatForever actionWithAction:animate];
        [sp runAction:ccrepeat];
        [sp setDisplayFrameWithAnimationName:n index:0];
    }else{
        id act=[CCSequence actions:animate, nil];
        [sp runAction:act];
        [sp setDisplayFrameWithAnimationName:n index:0];
    }
}


CCSpriteに表示するときはこう
CCSprite*sp=[[CCSprite alloc]init];
[anime setAnime:sp animename:@"walk" repeat:YES];
[mynode addChild:sp z:22];


[self initAnimeFrames:@"walk" animename:@"walk" stno:1 enno:33 delay:0.05f];
このコードのdelayの値が1フレームの表示時間なので早くするなら小さい値を
遅くするなら大きい値を入れましょう。

以上cocos2dのアニメーションでした。面倒くさいですね。