2011-01-24 17 views
0

iPhoneアプリでUIViewベースのビューに切り替える前に、iPhoneでCocos2Dを「クリーンアップ」しようとしていますしかし、それは過消去です(または、私はです)何かがクラッシュし、私はそれを頭や尾にすることはできません。アニメーションの途中で停止しようとすると、ゾンビがクラッシュする

これはやや長いですが、私はそれを整理するために気を付けようとしました。

マイノード階層は次のようになり、そしてカッコは、各ノード "に何があるか" を示す:

  1. CCScene(メニュー)
  2. CCLayer(文字)
  3. CCLayer(アニメーション全体)
  4. CCSprite, CCSpriteBatchNode(アニメーションの各部、各タイプが多数あります)

「キャラクター」は異なるアニメーションを実行するので、「キャラクター」CCLayerから「アニメーション」CCLayerを削除し、新しい「アニメーション」CCLayerを作成し、それを子として追加します。これまでのところ、問題は生じていません。

最後に、CCSceneには、アプリのCocos部分を「終了」するボタンがあります。 「終了」ボタンをタップするとUIKit-landに戻りたいです。

しかし、私はUIView-landに戻る前に、Characterで1つの最終アニメーションを実行したいと思います。終了したら、終了してください。これを行うために、私はキャラクターCCLayerにこのようにハンドラーを "登録"します。バック「移動する」NOになったときに呼ばれる私の観察コード、(その後、

- (void) doEndWithHandler:(id<LWECharacterDelegate>)handler 
{ 
    // Handler is the CCScene, "self.parent" could work but I want it loosely coupled 
    self.endOfSessionHandler = handler; 

    // Tell character to start final animation -- this creates a new CCLayer, 
    // starts the animation, and assigns that CCLayer into self.animatedSequence 
    [self changeCharacterActionTo:END_ANIMATION key:nil]]; 

    // The "animation" CCLayer has a property called "moving" -- observe it 
    [self.animatedSequence addObserver:self forKeyPath:@"moving" options:NSKeyValueObservingOptionNew context:NULL]; 
} 

そして:私は「最終」のアニメーションを呼び出して、最終的なアニメーションが(KVOを使用して)実行されたときに、その後CCSceneへのコールバック=アニメーション)終了:あなたは言うかもしれない、今

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"moving"]) 
    { 
    BOOL movingStatus = [[change objectForKey:NSKeyValueChangeNewKey] boolValue]; 
    if (movingStatus == NO) 
    { 
     // Stop observing 
     [object removeObserver:self forKeyPath:@"moving"]; 

     // Stop all animations on this level 
     [self.animatedSequence stopAnimation]; 
     [self removeChild:self.animatedSequence cleanup:YES]; 
     [self removeFromParentAndCleanup:YES]; 

     // Handler callback 
     if (self.endOfSessionHandler && [self.endOfSessionHandler respondsToSelector:@selector(characterDidFinishSession)]) 
     { 
     [self.endOfSessionHandler characterDidFinishSession]; 
     } 
    } 
    } // if key = moving 
} 

を、

、あなただけの最後にあなたのアニメーションのアクションとしてCCCallFuncを使用してコールバックを追加できることを知らなかったのであなたが終わった時を知るg?

はい、私は知っていますが、ポイントは、CCSceneは終了ボタンが押されたときに「知っている」ということです。特定のアニメーションは1つもありません。終了ボタンを押すとCCActionが動いているので、すべてのスプライトにアニメーションを停止して破壊するように指示したいと思います。

私のアニメーションCCLayerには、スプライトの移動が止まったときに教えてくれる特別なコードがあります。そのコードは正常に動作しています。すべてのアニメーションの最後にCCCallFuncコールバックを使用して、「アニメーション」CCLayerクラスに完了したことを伝えます。

しかし、なぜ問題があるように見えるのですが、Cocos2Dのアクションスタックトレースが解消される前に「移動中」が変更されたというKVO通知が表示されます。 KVOの通知が来たら、私はすべてを止めようとしているからです(上記のコードを見てください)。それでも、Cocos2Dフレームワークがスタックトレースを "ラップアップ"しようとすると、クラッシュ(オーバーリリース)するため、すべてが停止するわけではありません。

同じスプライトをアニメートするアクションであるCCCallFuncコールバックからアニメーションを停止することはできませんか?

そこにあなたの本当のココス・ヘッドの場合は、クラッシュした正確なラインは次のとおりです。

if(currentTarget->currentActionSalvaged) { 
    // The currentAction told the node to remove it. To prevent the action from 
    // accidentally deallocating itself before finishing its step, we retained 
    // it. Now that step is done, it's safe to release it.  
    [currentTarget->currentAction release]; 

... CCActionManager.mのライン327上にあります。

答えて

0

すべての権利を、私は自分で解決しました。あなたはココスセッションを「クリーンアップ」している場合、あなたはココスコールバック(CCCallFunc)からそれを行うには問題ないはずですが、あなたのココスコールバックスタックトレースた後まで[[CCDirector sharedDirector] end]を呼び出すことはありません

:ここで重要な教訓は、このました解かれる。

これがすべてです。

関連する問題