2011-12-16 11 views
3

私はEntity(A bullet)を、xとyに向かって動かす方法を探しています。これは、弾丸が発射されたときのプレイヤーの位置です。ので、私のエンティティクラスでは私が持っている -xとyに向かってエンティティを移動させる方法は?

float xSpeed = 1.0F; 
    float ySpeed = 0.0F; 

私はどのように私はそれが別のxとyのdirの中に移動するだろう、私はxSpeedとySpeed = 1.0F になるだろうdiaganalライン内のエンティティを移動したい場合?

助けてくれてありがとう EDIT - が解決、助け のヘルプを必要とするこの質問を見つけた誰のおかげで、ここでは、私はそれを作るためにいくつかの数学を持っている私のコード -

float xSpeed = 0; 
    float ySpeed = 0; 

ですそう、彼らはあなたが

に向かって移動したい斧とyに基づいて、同じ速度

ySpeed = ySpeed * (float) (2.5/Math.sqrt(xSpeed * xSpeed + ySpeed * ySpeed)); 
    xSpeed = xSpeed * (float) (2.5/Math.sqrt(xSpeed * xSpeed + ySpeed * ySpeed)); 

とxSpeedとySpeedを設定するには、このコードで移動します

xSpeed = (Game.PlayerX - x)/3; 
    ySpeed = (Game.Playery - y)/3; 

、次いで、finaly、

this.x += xSpeed; 
    this.y += ySpeed; 

答えて

7

エンティティのxおよびyにxSpeedとySpeedを追加する通常の方法は、必要なxとyの距離のを覆うように相対xとyの速度を設定することです割り当てられた所要時間:

float xSpeed = (targetLocation.x - currentLocation.x)/travelTime; 
float ySpeed = (targetLocation.y - currentLocation.y)/travelTime; 

あなたができるよう、むしろ所定の走行時間に比べて、所定の速度で移動するいくつかの任意の値にtravelTime設定して上記の計算を行う(1.0fが正常に動作しますしたい場合単に排除する 分裂)。そして、この係数計算する:

float factor = desiredSpeed/Math.sqrt(xSpeed * xSpeed + ySpeed * ySpeed); 

は(xSpeedySpeedは両方0ですが、それは単に現在およびターゲットの位置が同一であることを示している場合は、ゼロ除算されますことに注意してくださいそれが可能状態なら、あなた。 。1travelTimeを設定することによって、これは所定のSPEEの乗算だけ卑劣な方法であること

xSpeed *= factor; 
ySpeed *= factor; 

注:適切なチェックを含むべきである)。最後に、因子によってxSpeedySpeedを再調整トラベル方向がx軸となす角度を正弦および余弦で表し、d軸を三角法とは全く言わずに表します。 :)

+0

は完璧に動作し、助けのための感謝:2を遅らせるためにあるようDは、所望の速度は、フロートすることができ、 3は速くすることです:D。このサイトで最初に投稿しますが、このような素敵なコミュニティを再び使用することはできません。 –

+0

@ JackPatrick - 私はすべてがフロートであると仮定していました。ところで、コミュニティへようこそ。 –

+0

助けてくれてありがとう、他の人を助けるための最初の投稿に解決策を追加しました。 –

0

オブジェクトの速度と方向を定義する必要があります。次に、単純なtrigを使用して、1ステップあたりのx/y変位を求めることができます。

現在のアルゴリズムを使用すると、オブジェクトは方向に応じて速度が変わりますが、これはおそらくあなたがしたいことではありません。

リニア方向: 速度X = 1 速度y = 0

合計速度= 1つの

Diagnol方向: 速度X = 1 速度y = 2 = 1つの

合計速度

を参照してください。 あなたの速度は方向に関係なく一定でなければなりません。

Vectorと呼ばれるものを使用して、オブジェクトの方向と速度を記述します。

クラスVector { int x; int y;浮き角;浮動大小; }

X、Y、角度および大きさは、三角形を記述する。あなたが望む動きは、あなたのエンジンが使用している時間ステップで修正された三角形の斜辺の線上の点になります。

編集 - それは0で原点だと

、1つの単位の半径を有する円を想像して、0

左側に原点から線を引きます。あなたは、円のエッジに45度の角度で原点から線を引く、今(1,0)で円を交差するライン1つの単位長く、

を取得します。

また、ラインは円が(0.7,0.7)NOT(1,1)になります交差するライン1単位の長い、しかし、X/Y座標を取得します。

私は私の数学はここに間違っているのであれば、誰かが編集してください、私の前にIDEを持っていないが、私はあなたがこのような何かをお勧めしますbeilive:

newPositionX = currentX +(COS(角度) *スピード*タイムステップ)

newPositionY = currentY +(罪(角度)*スピード*タイムステップ)

+0

実際、2番目のケースでは、合計速度はsqrtです)、ではない2. –

+0

@TedHoppそれはsqrt(2)でなければなりません、それは問題です。ジャックがコードを記述する方法は速度が2です。オブジェクトが左右に移動し、同じ時間枠内で上下に移動すると、左右に移動するだけです。 – asawyer

+0

@TedHoppまたは私はもっとコーヒーが必要かもしれません。あなたは正解ですが、1辺の長さが2辺の三角形は、sqrt(2)の反対側にあります。 – asawyer