2012-07-09 54 views
0

我正在尝试为我的播放器设置行走方向的动画(如在鸟瞰RPG中),所以我拥有它if (joystick.velocity. y > 0){ [player runAction: walkUpAction] }当然这会导致Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'runAction: Action already running问题得到解决。我没有得到的是一种解决这个问题的方法。我尝试添加一些变量(isRunning,如果正在运行,那么不要调用类型的东西),但似乎没有任何工作。我在cocos2d论坛上问过这个问题,但没有运气。有任何想法吗?Cocos2d CCAction已经运行应用程序终止

回答

1

尝试这种情况:

首先在.H其中您检测的方向变化声明一些IVARS

BOOL _isWalkingUp; 
BOOL _isWalkingDown; 
BOOL _isWalkingLeft; 
BOOL _isWalkingRight; 

然后,在每个代码段:

if(!_isWalkingUp && (joystick.velocity.y >0)) { 
    [player stopAllActions]; 
    [player runAction:walkUpAction]; 
    _isWalkingUp=YES; 
    _isWalkingDown=NO; 
    _isWalkingLeft=NO; 
    _isWalkingRight=NO; 
} 

等。 ..你可能会想添加一些'状态'来避免一个不稳定的运动控制。但这会是一个开始。

+0

发誓我可以试试,谢谢。 – stenger96 2012-07-09 11:23:12

+0

刚刚发现这不起作用,因为它在动作完成之前停止了动作。这个动作是一个永远重复的动画,所以这个解决方案将不起作用。 – stenger96 2012-07-09 20:40:38

+0

所以如果它永远运行,再次运行它的意义何在? – YvesLeBorg 2012-07-09 20:53:46

1

在cocos2d中,您必须在运行前重新创建动作,即不能多次运行同一动作。因此,如果您不想仅停止此操作,则不需要将操作保存在变量中,而不需要其他操作。这是关于你的错误。如果你告诉更多的细节,你想用你的方法做什么,我可以尝试给你一些关于如何做你想要的建议。

实际上,我不知道这个操纵杆是如何工作的,但是如果它没有存储以前的状态,你可以手动存储它,并在以前的速度为0并且当前速度大于0的情况下运行你的动作。无论如何,您必须在重新运行之前重新创建操作。所以,你会有这样的事情

- (void) update:(ccTime)dt 
{ 
    BOOL needRunWalkUpAnimation = (prevVelocity == 0) && (curVelocity > 0); 
    if(needRunWalkUpAnimation) 
    { 
     id walkUpAction = \\create your action here 
     [player runAction: walkUpAction]; 
    } 

    prevVelocity = curVelocity; 
} 
+0

这是walkUpAction:'self.walkUpAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkUpAnim restoreOriginalFrame:NO]];' – stenger96 2012-07-09 11:17:51

+0

更新了我的文章 – Morion 2012-07-09 11:27:14

+0

我正在使用偷偷摸摸的操纵杆。 – stenger96 2012-07-09 11:34:01

相关问题