Cocos2d iphone 按行为分类

Cocos2d iphone 按行为分类,cocos2d-iphone,tetris,ccaction,Cocos2d Iphone,Tetris,Ccaction,我一直在为我的俄罗斯方块克隆实现一些Cocos2D动画(工作非常完美,没有逻辑错误,我只想在删除行时执行一些平滑的动画) 当前代码(无动画)仅删除块位置,如下所示: block.position = ccp(block.position.x, block.position.y - kBlockSize); id move = [CCMoveBy actionWithDuration:0.5f position:(0, -kBlockSize)]; [block runAction:mov

我一直在为我的俄罗斯方块克隆实现一些Cocos2D动画(工作非常完美,没有逻辑错误,我只想在删除行时执行一些平滑的动画)

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

   block.position = ccp(block.position.x, block.position.y - kBlockSize);
id move = [CCMoveBy actionWithDuration:0.5f position:(0, -kBlockSize)];
[block runAction:move];
这在for循环中发生,经典的俄罗斯方块编程。但当我尝试制作动画时,就像这样:

   block.position = ccp(block.position.x, block.position.y - kBlockSize);
id move = [CCMoveBy actionWithDuration:0.5f position:(0, -kBlockSize)];
[block runAction:move];
有些块只向下移动一次,甚至同一块的动作可能会被调用多次(例如,当打断多行时)

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


谢谢

我非常确定操作是并行操作,因此您可以在前一个操作完成之前调用CCMoveBy操作。我用过的一些选择是

  • 通过使用设置标志的CCCallFunc操作的CCSequence finishing来监视操作完成的时间。类似于

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

  • 在tick或update函数中使用速度变量滚动您自己的解决方案,在该函数中,您可以获得自上次更新以来tick的增量时间/#


  • 希望这些能对我有所帮助。

    谢谢你们,这些答案对我帮助很大

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

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

    如果只需要删除一行,这种方法很好,因为如果有多行,下一个CCSequence几乎与上一个CCSequence同时启动,读取上面块的错误位置,导致错误的块级联

    我解决了使用较长的CCSequence,将CCCallFunnd作为最后一个参数的问题:

    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.
    

    现在开始实施重力模式,再次感谢!

    您是否尝试过放置id move=[CCMoveBy Action WithDuration:0.5f位置:(0,-kBlockSize)];[block runAction:move];在更新方法中,是否经常调用它?我会尝试使用CCMoveTo而不是CCMoveBy,如果在移动完成之前多次调用它,至少最终MoveTo会将其移动到正确的最终位置。