我有一个动画方法,可以根据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;
有效。
我做错了什么?
答案 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]];
}