2009-07-10 5 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を見つけましたが、実際に完全に変換することはできません。これは、CocoaでサポートされていないMatrixesを使用しているためです。

誰かが私にこれを始める方法についてのいくつかの示唆を与えることができますか?私はサンプルコードを探していますが、何も見つかりません。私は私の定数を修正 の下に与えられたコメントの後、私のホイールベースは今50です

はEDIT(スプライトが高いは50pxです)、私のcarWidthは(スプライトの幅が30pxれる)30です。

しかし、私の車には最初のティックがあり、ローテーションは正しい(そして配置も)という問題がありますが、その後は計算が間違っているようです。

回転円の中央が元の位置に保持されずに移動されます。私が必要とするのは、車の各角度において、回転円の元の中心を再計算する必要があるということです。私は半径と回転角度を持っているので、これは簡単だと思うだろうが、どうやって車を素晴らしいサークルで動かし続けるのか分からないようだ。

これ以上のポインタはありますか?

+0

行列は単なる多次元配列です。あなたは、参照コードの適応/作業が可能でなければなりません。 – EightyEight

答えて

1

あなたは正しいアイデアがあります。この場合、定数が問題になります。表示サイズに一致する単位でwheelBasecarWidthを指定する必要があります。たとえば、画面上の車の画像のホイールベースが30ピクセルの場合は、WheelBase変数に30を使用します。

これは、画面上の円が小さすぎる理由を説明しています。ココアはわずか1.8ピクセルの小さな小さな車のために円を描こうとしています!

今、円に沿ってあなたの車を移動することについて:

あなたは上記のコードで計算theta変数はあなたがの中心点の周りに車を移動するために使用するものです回転速度であり、その円:

speed変数が計算を簡単にするために、1秒あたりのピクセル数であるとします。代わりにと仮定して、あなたは単に1秒ごとに次のコードを実行します:

// 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

あなたのコメントを統合しようとしましたが、まだ動作していません。私は元の記事でこれを説明しようとしました。あなたは私にいくつかのヒントを与えることを望みますか? –

+0

私は周りを動く円の中心で問題を解決するためにいくつかのコードを追加しました。試してみます! –

+0

ありがとう、それはまだいくつかの調整が必要ですが、これは非常に良いスタートのように思えます。 –