0

我被困在为我的俄罗斯方块克隆实现一些 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. 通过使用 CCSequence 完成和设置标志的 CCCallFunc 操作来监视操作何时完成。就像是...

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

  2. 使用刻度或更新函数中的速度变量滚动您自己的解决方案,您可以获得自上次更新以来的增量时间/刻度数

希望其中一些有所帮助。

于 2011-10-07T15:20:03.223 回答
0

谢谢各位,这些答案对我帮助很大!

我在这里发布之前尝试过 CCSequences,但没有成功。问题如下:

在删除一行的 CCSequence 中,我有 2 个操作:第一个操作淡出整行块(持续 x 秒),第二个操作将所有块放在行上方(持续 y 秒)。

如果只需要删除一行,这很好用,因为如果有多行,下一个 CCSequence 几乎与前一个相同的时间开始,读取上面块的不正确位置,导致块级联不正确。

我使用更长的 CCSequence 解决了这个问题,它将 CCCallFuncND 作为最后一个参数:

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 回答