Re:

感銘高き名言は「1%のひらめきがなければ99%の努力は無駄である」(トーマス・エジソン)

タグ:cocos2d

CCSprite 継承してクラス作ってたら、replaceScene するたびにメモリリークしてた。

拡張して onEnter で touchDispatcher 処理だけ書いてたんだけど、onExit で removeDelegate してなかったら dealloc 呼ばれてなかった。


3時間くらい格闘してたー。


レベルが1あがった。


(´・ω・`)

 

cocos2d-x ではなく、cocos2d-iphone の場合です。

-x も基本的に一緒?


HelloWorldLayer を例に取れば、プロジェクト作成時はサブクラスが CCLayer になっているので、まずはそれを変えます。

HelloWorldLayer.h

@interface HelloWorldLayer : CCLayer
@interface HelloWorldLayer : CCLayerColor

↑この +, - は変更前(-)、変更後(+) を意味します。バージョン管理等でお馴染みですが、プログラムを初めて浅い方や慣れ親しんでないときは何のことやら!と思ったものです(余談)。 


CCLayerColor は CCLayer を継承している拡張クラスなので、同じメソッドは使えますし基本的に振る舞いは変わりません。

”拡張されてる”ところがポイントですね!

その拡張により、初期化時に背景色を指定できるようになります。 Yeah!



HellowWorldLayer.m に移ります。

init メソッドで初期化している部分があるので、背景色を指定して初期化するように直せばOKです。


HelloWorldLayer.m

- if( (self=[super init]) ) {
+ if( (self=[super initWithColor:ccc4(255, 255, 255, 255)]) ) {



こんな感じで背景色を白にすることができます。

0-255 で割合を指定。最後は透明度で、0ほど透明になります。


そんなわけで、今頃 cocos2d-iphone 

なんかエラーが出てしまう未来のわたくしへ…

Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES'


Xcode 4.6.1
cocos2d-iphone-2.1-rc1

10

Landscape Left, Right がデフォルトのcocos2dアプリなんて作らん!と、Portrait設定にしてビルド実行するとエラーが出てしまう場合があります。

それもこれも、iOS6からの画面の向きを監視するメソッドが変更されているせいで、シミュレータのバージョン6以上を使ってるとなう。


cocos2dプロジェクトを新規作成してAppDelegate.mを見れば一目瞭然の説明が記述されています。


これはiOS6だけ有効で、4/5では無効だからね

supportedInterfaceOrientations

これはiOS4/5だけ有効で、6では無効だからね
shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 



-(NSUInteger)supportedInterfaceOrientations {


    return UIInterfaceOrientationMaskPortrait;


}



上記のようにOrientationsで指定した縦画面をリターンするように修正するか、これまたiOS6からのメソッドshouldAutorotateでNOを返せばsupportedInterfaceOrientationsは呼ばれないので、向きが固定のアプリケーションならこれでいいんじゃないですかね?

// iOS 6+ only

- (BOOL)shouldAutorotate

{

    return NO;

}

Universalにデザイン・コーディングするのはもちろん理想だけど、俺は縦画面がいいw





↑このページのトップヘ