2013-02-16 155 views
0

一些帮助将不胜感激。雪碧运动基于从屏幕上的触摸获得的标题。 Sprite按预期移动,但我无法改变速度,无论我用于currentSpeed的值如何。这是在精灵的更新方法中。提前致谢。CCMoveTo持续时间/速度问题

// Distance between two points (Distance formula, Pythagorean Theorem c^2=a^2+b^2, so d=sqrt((x2-x1)^2+(y2-y1)^2) 
    // Duration (time = distance/rate) 

    CGPoint adjustedPosition; 
    adjustedPosition.x = position_.x - sinf(heading); 
    adjustedPosition.y = position_.y - cosf(heading); 

    float distance = CGPointDistanceBetweenTwoPoints(adjustedPosition, position_); 
    float duration = distance/currentSpeed; 

    position_ = adjustedPosition; 

    [self runAction:[CCMoveTo actionWithDuration:duration position:position_]]; 
+0

这是在“更新”方法(或ccTouchMoved)中,还是直到下一次触摸才会发生的一种遗忘方法? – YvesLeBorg 2013-02-17 20:59:30

+0

它在精灵的更新方法中。 – 2013-02-17 21:20:31

回答

1

不要在更新方法使用通过MoveTo或与此有关的任何行动。相反,计算位置,像这样:

-(void) update:(ccTime) dt { 

    // _velocity in points per second. 
    // heading should be in ccw notation, 0 on x axis, RHS 

    float deltaX = dt * _velocity * cosf(heading); 
    float deltaY = dt * _velocity * sinf(heading); 
    CGPoint adjustedPosition = ccpAdd(self.position, ccp(deltaX,deltaY)); 
    self.position = adjustedPosition; 
} 

或类似的东西。这将缓解任何方差id dt,对此你​​唯一可以打赌的是它不会是恒定的;但物理学应该是对的。

+0

所以我最终使用了你的实现的变体(你的更清洁,而且,它工作:)),但它仍然不能解释为什么我的工作不起作用。我从来没有读过,你不能在预定的更新程序中使用操作。有兴趣知道背后的“为什么”。非常感谢。 – 2013-02-18 21:17:06

0

尝试此距离:

float distance = ccpLength(ccpSub(adjustedPosition, position_)); 
+0

没有快乐。你的方法和我的距离非常相似。我认为CCMoveTo有一个最小持续时间,因为提高速度确实缩短了持续时间,对精灵没有任何影响。谢谢你的回应。 – 2013-02-17 20:08:42