touchMoved方法中的动画不起作用

时间:2014-09-15 12:16:48

标签: ios cocos2d-iphone ccsprite

我有一个动画方法,可以根据touchMoved方法中的用户触摸将CCSprite移动到某个位置。

 -(void)touchMoved:(UITouch *)touch withEvent:(UIEvent *)event{

//Some misc code then ...

CGPoint newposition = (ccpAdd(spritePosition, moveVec));
[sprite runAction:[CCActionMoveTo actionWithDuration:0.3 position:newposition]];

当我运行此方法时,它会在整个屏幕上移动精灵,而不是CGPoint NewPosition。

但是,如果我将其更改为不包含动画

sprite.position = newposition;

有效。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您可能希望将代码放在-(void) touchEnded:(UITouch *)touch withEvent:(UIEvent *)event方法中。 touchMoved在触摸移动时被调用,因此不止一次被调用,这意味着对于不同的newPosition值,您的精灵上的runAction方法被多次调用,这几乎同时触发了不同的runAction命令。出乎意料的行为。

但是,runAction方法检查操作是否已在运行。但是在您的情况下,每次调用都会创建一个CCActionMoveTo的新实例,因此该检查不会保护您。 我相信将touchMoved代码转换为touchEnded可以解决问题。

编辑:

如果你无法将代码移动到touchEnded,另一种方法是使用布尔标志,然后自己进行精灵动画检查。

使用全局BOOL isSpriteAnimating = NO;

并在您的touchMoved函数中

if(!isSpriteAnimating){
    isSpriteAnimating = YES;
    [sprite runAction:[CCActionSequence actions:[CCActionMoveTo actionWithDuration:0.3 position:newposition],[CCActionCallBlock actionWithBlock:^{
    isSpriteAnimating = NO; 
    }],nil]];
}