4

CCMoveTo对精灵有动作,它将它从一个点移动到另一个点。当用户点击按钮时,精灵应该会轻松放慢速度并继续以新的速度移动到目标位置。我不知道如何做到这一点。

更新。实际上我替换CCMoveToCCMoveBy但问题仍然相同。

4

5 回答 5

3

使用当前的CCEaseIn/CCEaseOut操作实现,您只能将操作速率从零降低到零。这意味着,如果您放开CCMoveBy/CCMoveTo它们,它们将降低从/到静止的移动速度。

但是,从 cocos2d 2.1 开始CCMoveBy/CCMoveTo是 stackable。使用此功能,您可以实施一种变通方法,从而产生您想要的效果。

CCMoveBy为精灵设置并同时运行两个动作:actionA按下按钮后将具有较慢的移动速度。actionB将具有对应于较快速度和较慢速度之差的速度。

然后,当用户按下按钮时,您可以CCEeaseOut actionB(停止CCMoveBy,然后使用所需的按钮再次启动它CCEaseOut)。这看起来像精灵从移动速度缓和actionA + actionB到速度actionA


尽管有这种解释,但如果您正在实现想要精确微调的游戏控件,最好避免CCActions并通过实现自定义移动代码逐帧更新精灵位置。

于 2013-08-08T09:32:55.353 回答
2

您可以使用 EaseIn/Out 操作来获得该效果:

id action = [CCMoveTo actionWithDuration:2 position:ccp(100,100)];
id ease = [CCEaseIn actionWithAction:action rate:2];
[sprite runAction: ease];

取自这里

您可以找到不同类型的缓动来满足您的需要。

于 2013-08-07T19:40:46.940 回答
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];
于 2013-08-09T14:23:48.717 回答
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]];
于 2013-08-08T14:56:28.007 回答
0

您可以通过 ccactionmoveto 替换 ccmoveto 操作,例如:

 CCActionMoveTo *mAction = [CCActionMoveTo actionWithDuration:0.2f position:_selectedSpritePos];

    [_selectedSprite stopAllActions];
    [_selectedSprite runAction:mAction];
于 2014-03-20T09:05:34.950 回答