2009-07-10 89 views
2

我想在iPhone上使用Cocos2d来绘制一辆2D汽车,并以自然的方式从左到右转向。汽车转弯圈和移动精灵

这里是我的尝试:

  1. 计算车轮的角度,只是将其移动到目标点的车轮指向。但是这会产生一种非常不自然的感觉。汽车漂移一半的时间

  2. 之后,我开始研究如何从汽车获得转弯圈,这意味着我需要一些常数,如轴距和汽车宽度。

了大量的研究后,我创建了下面的代码:

float steerAngle = 30; // in degrees 
float speed = 20; 
float carWidth = 1.8f; // as in 1.8 meters 
float wheelBase = 3.5f; // as in 3.5 meters 

float x = (wheelBase/abs(tan(steerAngle)) + carWidth/ 2); 
float wheelBaseHalf = wheelBase/2; 
float r = (float) sqrt(x * x + wheelBaseHalf * wheelBaseHalf); 

float theta = speed * 1/r; 
if (steerAngle < 0.0f) 
    theta = theta * -1; 

drawCircle(CGPointMake(carPosition.x - r, carPosition.y), 
      r, CC_DEGREES_TO_RADIANS(180), 50, NO); 

第几行是我的常量。 carPosition属于CGPoint类型。之后,我试着画出一个圆圈来显示我的汽车的转弯圆圈,但它画的圆圈太小了。我可以使我的常量更大,使圆圈更大,但是我仍然需要知道如何将我的精灵移动到这个圆上。

我试过下面的.NET tutorial我在这个主题上找到了,但是我不能完全转换它,因为它使用了Matrixes,它不被Cocoa支持。

有人可以给我几个关于如何开始这个指针吗?我一直在寻找代码示例,但我找不到任何代码。

EDIT下面 我纠正我的常数给出的注释后,我的轴距现在为50(子画面是50像素高),我的carWidth为30(子画面在宽度30PX)。

但是现在我遇到了这样的问题,即当我的赛车第一次“嘀嗒”时,旋转是正确的(也是位置),但在此之后计算看起来是错误的。

转动圈的中间移动而不是保持在原来的位置。我需要的(我认为)是在汽车的每个角度,我需要重新计算转弯圆圈的原始中心。我认为这很容易,因为我有半径和转弯角度,但我似乎无法弄清楚如何让赛车保持良好的循环。

任何更多的指针?

+0

矩阵只是多维数组。你应该能够适应/工作的参考代码。 – EightyEight 2009-07-10 21:41:01

回答

1

你有正确的想法。常量是这种情况下的问题。您需要以与您的视图大小相匹配的单位指定wheelBasecarWidth。例如,如果屏幕上的汽车图像的轮距为30像素,则可以使用30作为WheelBase变量。

这解释了为什么你的屏幕圈子太小。可可试图画一个只有1.8像素宽的小型车的圈子!现在

,沿圆移动你的车的事:

theta变量,你在上面的代码计算的转速,这是你会用什么动车周围的中心点该圆圈:

我们假设您的speed变量以像素/秒为单位,以使计算更容易。有了这个假设,只需将执行以下代码每秒一次:

// calculate the new position of the car 
newCarPosition.x = (carPosition.x - r) + r*cos(theta); 
newCarPosition.y = carPosition.y + r*sin(theta); 

// rotate the car appropriately (pseudo-code) 
[car rotateByAngle:theta]; 

注:我不知道正确的方法是旋转你的车的形象是什么,所以我只是用rotateByAngle:获得指向对面。我希望它有帮助!

更新(评论后):

我从来没有想过的转弯半径与汽车运动的中心。原始代码没有考虑到汽车已经旋转到的角度。我会改变它如下:

... 
if (steerAngle < 0.0f) 
    theta = theta * -1; 

// calculate the center of the turning circle, 
// taking int account the rotation of the car 
circleCenter.x = carPosition.x - r*cos(carAngle); 
circleCenter.y = carPosition.y + r*sin(carAngle); 

// draw the turning circle 
drawCircle(circleCenter, r, CC_DEGREES_TO_RADIANS(180), 50, NO); 

// calculate the new position of the car 
newCarPosition.x = circleCenter.x + r*cos(theta); 
newCarPosition.y = circleCenter.y + r*sin(theta); 

// rotate the car appropriately (pseudo-code) 
[car rotateByAngle:theta]; 
carAngle = carAngle + theta; 

这应该保持回转圆的中心在适当的点,即使汽车已经被旋转。

+0

我试图整合你的评论,但它仍然无法正常工作。我试图在我原来的帖子中解释这一点。希望你能给我更多的提示? – 2009-07-11 13:03:38