0

Tetris クローンにいくつかの Cocos2D アニメーションを実装するのに行き詰まっています (これは完全に機能し、ロジックのバグはありません。行を削除するときにスムーズなアニメーションを実行したいだけです)。

現在のコード (アニメーションなし) は、次のようにブロックの位置をドロップするだけです。

   block.position = ccp(block.position.x, block.position.y - kBlockSize);

これは、従来のテトリス プログラミングの for ループで発生します。しかし、アニメーション化しようとすると、次のようになります。

id move = [CCMoveBy actionWithDuration:0.5f position:(0, -kBlockSize)];
[block runAction:move];

一部のブロックは一度だけ下に移動しますが、同じブロックに対してアクションが複数回呼び出される可能性があります (たとえば、複数の行を分割する場合)...

なぜそれが起こるのですか?少し紛らわしいことはわかっていますが、要点は、同じことを行って異なる結果を得ているということです...明確にするためにさらにコードを投稿できます!

ありがとう!

4

2 に答える 2

0

アクションは並列操作であると確信しているため、前のアクションが完了する前に CCMoveBy アクションを呼び出すことができます。私が使用したいくつかの代替手段は...

  1. フラグを設定する CCCallFunc アクションで終了する CCSequence を使用して、アクションがいつ完了するかを監視します。何かのようなもの...

    id myAction = [[CCSequence runWithActions:[CCMoveBy actionWithDuration:0.5f position:(0, -kBlockSize)], [CCCallFunc actionWithTarget:self selector:@selector(myFunc)], nil]

  2. 最後の更新以降のデルタ時間/ティック数を取得できるティックまたは更新関数で速度変数を使用して、独自のソリューションを展開します

その一部が役立つことを願っています。

于 2011-10-07T15:20:03.223 に答える
0

みんなありがとう、それらの答えは私を大いに助けてくれます!

ここに投稿する前に CCSequences を試しましたが、成功しませんでした。問題は次のとおりでした。

行を削除するCCSequence内には、2つのアクションがあります。最初のアクションはブロックの行全体をフェードアウトし(x秒の期間)、2番目のアクションは行の上のすべてのブロックをドロップします(y秒の期間)。

削除する必要がある行が 1 つだけの場合、これは問題なく機能します。行が複数ある場合、次の CCSequence が前の行とほぼ同じ時間に開始され、上のブロックの誤った位置が読み取られ、ブロックの誤ったカスケードが発生するためです。

最後の引数として CCCallFuncND を取る、より長い CCSequence を使用して解決しました。

id fadeOutSequence = [CCSequence actions:fadeout, destroyBlocks, notifyFadeFinish, nil];

//inside method specified for notifyFadeFinish:
id dropAbove = [CCSequence actions: dropBlocks, notifyDropFinish, nil];

//inside method specified for notifyDropFinish
//start a new delete sequence, if there is more rows to delete.

グラビティ モードを実装します。ありがとうございます。

于 2011-10-07T22:56:19.773 に答える