CCMoveTo导致跳跃

时间:2014-01-30 22:28:03

标签: ios cocos2d-iphone

我正在使用Cocos2D和Kobold2D制作游戏。在我的游戏中,我有一艘船,我想移动到玩家点击的位置,使用以下代码:

KKInput * input = [KKInput sharedInput];
CGPoint tap = [input locationOfAnyTouchInPhase:KKTouchPhaseBegan];
if (tap.x != 0 && tap.y != 0)
{
    [ship stopAllActions]; // Nullifies previous actions
    int addedx = tap.x - ship.position.x;
    int addedy = tap.y - ship.position.y;
    int squaredx = pow(addedx, 2);
    int squaredy = pow(addedy, 2);
    int addedSquares = squaredx + squaredy;
    int distance = pow(addedSquares, 0.5);
    [ship runAction: [CCMoveTo actionWithDuration:distance/100 position:tap]];//makes ship move at a constant speed
}

船舶通常会按照我的预期移动。但是,如果我在船的附近轻敲,而不是平稳地移动到水龙头位置,它会跳到那个位置。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

首先,您可以使用cocos2d的ccpDistance函数来计算两点之间的距离。 并且它会跳跃,因为如果你太靠近距离太小,假设2 or 10 ...你将它划分为100 例如5/100 = 0.05太低了,这就是它跳跃的原因。 您需要手动处理它我认为if(speed<1) speed++;添加1等速度。快捷方案解决方案:)

答案 1 :(得分:0)

你的逻辑是正确的,但你的计算缺乏精确性。 特别是当您将飞行时间计算为距离/ 100时。这意味着当距离<1时100结果是0,所以船只跳到目的地。

基本上,在处理cocos2d中的位置时,应该使用float而不是int。并且有几个函数可以很好地完成工作。

您可以将代码更改为:

[ship stopAllActions]; // Nullifies previous actions
float distance = ccpDistance(tap, ship.position);
[ship runAction: [CCMoveTo actionWithDuration:distance/100.0f position:tap]];