我对精灵有CCMoveTo
个动作,它正在从一个点移动到另一个点。当用户点击按钮时,精灵应该轻松减速并继续以新的速度移动到目标位置。我不知道如何实现这一目标。
更新。实际上我将CCMoveTo
替换为CCMoveBy
,但问题仍然相同。
答案 0 :(得分:3)
使用当前实施的CCEaseIn/CCEaseOut
操作,您只能将操作速率从零减少到零。这意味着如果你放松CCMoveBy/CCMoveTo
,它们会使移动速度从静止状态变为缓慢。
但是,从cocos2d 2.1 CCMoveBy/CCMoveTo
are stackable开始。使用此功能,您可以实施一种可以产生所需效果的变通方法。
为精灵设置并同时运行两个CCMoveBy
个动作:actionA
将会在按下按钮后获得较慢的移动速度。 actionB
的速度对应于速度越快和速度越慢的差异。
然后,当用户按下按钮时,您可以CCEeaseOut
actionB
(停止CCMoveBy
,然后使用所需的CCEaseOut
再次启动它。这看起来像精灵从actionA + actionB
的移动速度到actionA
的速度变得缓和。
尽管有这样的解释,如果您要实现想要精确调整的游戏控件,最好避免使用CCActions
并通过实现自定义移动代码逐帧更新精灵位置。
答案 1 :(得分:2)
您可以使用EaseIn / Out操作来获得该效果:
id action = [CCMoveTo actionWithDuration:2 position:ccp(100,100)];
id ease = [CCEaseIn actionWithAction:action rate:2];
[sprite runAction: ease];
取自here
您可以找到不同类型的宽松空间以满足您的需求。
答案 2 :(得分:2)
要动态更改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];
答案 3 :(得分:0)
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]];
答案 4 :(得分:0)
您可以通过ccactionmoveto替换ccmoveto操作,如:
CCActionMoveTo *mAction = [CCActionMoveTo actionWithDuration:0.2f position:_selectedSpritePos];
[_selectedSprite stopAllActions];
[_selectedSprite runAction:mAction];