2012-02-09 3 views
0

Menu.hの最初のメソッド"StartGame:"が起動されると、ゲームは完璧に機能します。ユーザーが戻ってメニュー - に行けば Cocos2d:2回目の呼び出し時にreplacesを呼び出した後にメソッドが応答しないようにする

は、しかし、プレイタイムの間に、私はアニメーションフリーズの

[[CCDirector sharedDirector]replaceScene:[Menu scene]];

すべてのタイプを使用して、スケジュール機能が応答しません。

何が起こっているのですか?

答えて

2

これらの方法をオーバーライドしましたか?

-(void) onEnter; 
-(void) onEnterTransitionDidFinish; 
-(void) onExit; 
-(void) cleanup; 

そうであれば、そうでない場合は奇妙なもののすべての種類が発生する可能性があり、各メソッド内で(すなわち[super onEnter];)あなたはスーパー実装を呼び出すことを確認してください。

2

私はこれが同じ問題であるかどうかはわかりませんが、最近私が見つけたのは、replaceSceneを使用して、 "古い"シーンをシングルトン後で交換することができます。replaceSceneの呼び出しは、そのシーンで "クリーンアップ"を呼び出して終了します。ただし、ブロックまたはセレクタの形のハンドラを持つボタン(内部でブロックで囲まれたもの)はハンドラを失います「古い」場面に戻ったときに反応しなくなります。

これは、ユーザーがメインメニューからアプリの別の部分に移動するたびに、常に新しいシーンオブジェクト(すべての子どもと共に)を作成するとは限りません。この問題を回避するには

は、私はどちらかのシーンが常にあるの移行だ、またはCCDirectorに微調整を追加するたびに改めて作成されるように再設計する必要がありました:

私がこれまでで何をやったか
-(void) replaceScene:(CCScene*) scene andCleanup:(BOOL)andCleanup 

(他のremoveAndCleanupメッセージと同様に)クリーンアップパラメータを受け入れるCCDirector.replaceSceneにオーバーライドを追加します。これにより、問題のアプリは、アプリがそれらをきれいにしたくないときに、それを掃除せずにシーンを保持することができます。

このため実装は次のとおりです。誰かが、これは行くためのダムの方法であると考えている場合

-(void) replaceScene: (CCScene*) scene 
{ 
    [self replaceScene:scene andCleanup:YES]; 
} 

-(void) replaceScene:(CCScene*) scene andCleanup:(BOOL)andCleanup 
{ 
    NSAssert(scene != nil, @"Argument must be non-nil"); 

    NSUInteger index = [scenesStack_ count]; 

    sendCleanupToScene_ = andCleanup; 
    [scenesStack_ replaceObjectAtIndex:index-1 withObject:scene]; 
    nextScene_ = scene; // nextScene_ is a weak ref 
} 

、私に知らせてください。

+0

だから私は、iPhoneのためのCocos2d、vで同じ問題について得た。2.0。 'CCMenuItem'オブジェクトのコールバックブロックは、ブロックを解放するクリーンアップメソッドの実装のために失われました。 (v。1.0では起こらなかった)。とにかく 'dealloc'でリリースされるので、これらのコード行を' cleanup'メソッドから削除するのはかなり安全だと感じました。 –

+0

@AndreyLushnikov私のCocos2Dコードがgit repoから変更されていないので、私はそれが治療法であることを発見し、両方の方法でシーンの遷移を行う能力を私に残す。 – PKCLsoft

+0

それは素晴らしいです、アイデアのおかげで! –

0

私は、問題があった(バージョン3.1.1)ので、onEventハンドラをオーバーライドしていないので、スーパーコール(@ LearnCocos2Dの示唆)はここでは適用されません。

私は修正を見つけましたが、 directorSceneの呼び出しの前または後に、ディレクターのレジューム関数を呼び出すと、問題が解決されます。

[[CCDirector sharedDirector] replaceScene:scene]; 
[[CCDirector sharedDirector] resume]; 
関連する問題