我CCMoveTo
对精灵有动作,它将它从一个点移动到另一个点。当用户点击按钮时,精灵应该会轻松放慢速度并继续以新的速度移动到目标位置。我不知道如何做到这一点。
更新。实际上我替换CCMoveTo
为CCMoveBy
但问题仍然相同。
我CCMoveTo
对精灵有动作,它将它从一个点移动到另一个点。当用户点击按钮时,精灵应该会轻松放慢速度并继续以新的速度移动到目标位置。我不知道如何做到这一点。
更新。实际上我替换CCMoveTo
为CCMoveBy
但问题仍然相同。
使用当前的CCEaseIn/CCEaseOut
操作实现,您只能将操作速率从零降低到零。这意味着,如果您放开CCMoveBy/CCMoveTo
它们,它们将降低从/到静止的移动速度。
但是,从 cocos2d 2.1 开始CCMoveBy/CCMoveTo
是 stackable。使用此功能,您可以实施一种变通方法,从而产生您想要的效果。
CCMoveBy
为精灵设置并同时运行两个动作:actionA
按下按钮后将具有较慢的移动速度。actionB
将具有对应于较快速度和较慢速度之差的速度。
然后,当用户按下按钮时,您可以CCEeaseOut
actionB
(停止CCMoveBy
,然后使用所需的按钮再次启动它CCEaseOut
)。这看起来像精灵从移动速度缓和actionA + actionB
到速度actionA
。
尽管有这种解释,但如果您正在实现想要精确微调的游戏控件,最好避免CCActions
并通过实现自定义移动代码逐帧更新精灵位置。
您可以使用 EaseIn/Out 操作来获得该效果:
id action = [CCMoveTo actionWithDuration:2 position:ccp(100,100)];
id ease = [CCEaseIn actionWithAction:action rate:2];
[sprite runAction: ease];
取自这里
您可以找到不同类型的缓动来满足您的需要。
要动态更改 CCMoveBy/CCMoveTo 的速度,您可以实施 CCSpeed 操作。
首先,在添加 CCMoveBy 动作时,将其包装在 CCSpeed 动作中,如下所示:
CCSpeed *action = [CCSpeed actionWithAction:[CCMoveBy actionWithDuration:myDuration position:ccp(xPos,yPos)] speed:1];
action.tag = 42;
[mySprite runAction:action];
然后,当你想修改速度时,获取 CCSpeed 动作并修改它:
CCSpeed *action = (CCSpeed*)[mySprite getActionByTag:42];
[action setSpeed:6];
CGPoint startPoint = ccp(10,100);
CGPoint endPoint = ccp(300,100);
float fastTime = 5.f;
CCSprite *sp = [CCSprite spriteWithFile:@"sprite.png"];
sp.position = ccp(10,100);
[self addChild:sp];
[sp runAction:[CCMoveTo actionWithDuration:fastTime position:endPoint]];
//on hit
float slowTime = 10.f;
[sp stopAllActions];
float newSlowTime = ccpDistance(sp.position, endPoint)*slowTime/ccpDistance(startPoint, endPoint);
[sp runAction:[CCMoveTo actionWithDuration:newSlowTime position:endPoint]];
您可以通过 ccactionmoveto 替换 ccmoveto 操作,例如:
CCActionMoveTo *mAction = [CCActionMoveTo actionWithDuration:0.2f position:_selectedSpritePos];
[_selectedSprite stopAllActions];
[_selectedSprite runAction:mAction];