CCMoveBy的行为

时间:2011-10-07 05:48:50

标签: cocos2d-iphone tetris ccaction

我很难为我的俄罗斯方块克隆实现一些Cocos2D动画(效果很好,没有逻辑错误,我只是想在删除行时执行一些平滑的动画)。

当前代码(无动画)只会删除块位置,如下所示:

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

这发生在经典的俄罗斯方块编程的for循环中。但是,当我尝试动画时,像这样:

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

有些块只会向下移动一次,即使是相同的块也可能会多次调用该行为(例如,当打破多行时)...

为什么会这样?我知道这有点令人困惑,但关键是我正在做同样的事情并得到不同的结果......我可以发布更多代码来帮助澄清!

谢谢!

2 个答案:

答案 0 :(得分:0)

我非常确定操作是并行操作,因此您可以在前一个操作完成之前调用CCMoveBy操作。我使用的一些替代方案是......

  1. 使用CCSequence完成设置标志的CCCallFunc操作,监视操作何时完成。有点像...

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

  2. 在勾选或更新功能中使用速度变量滚动您自己的解决方案,您可以获得自上次更新以来的增量时间/滴答数#

  3. 希望其中一些有用。

答案 1 :(得分: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.

现在要实施引力模式,再次感谢!