2011-10-31 5 views
14

私はC++でゲームを作っていますが、ステージ上で動くことができるタンクがあります。タンクには角度(浮動小数点数、私はタンクが0°のとき、大砲が右を指しているとします)、速度(浮動小数点数)、時定数 "deltaT"(浮動小数点数)があります。C++ gamedev:floatをintに切り捨て

プレイヤーがタンクを前方に動かすと、私は三角法と時間の関数としての物理方程式を使用します(私はX(t)を意味します、私はそれが英語で言う方法を知らない)ステージのタンクの座標。

これは私の問題です:floatからintへの通過により、ゼロに最も近い値は考慮されません。したがって、ある角度では、タンクは回転したように見えますが、異なる方向に動きます。

これは私のコードは何である:

1 - まず、私はタンクが移動しているWICH角度を用いて、その成分Xに速度を分離し、Y:

float speedX = this->speed * cos(this->angle); 
    float speedY = this->speed * sin(this->angle); 

2 - その後、新しい座標を取得するために私は上記の式を使用します。

this->x = (int) ceil(this->x + (speedX * deltaT)); 
    this->y = (int) ceil(this->y - (speedY * deltaT)); 

問題は、最初のステップから始まる:一定の角度で、COSの値または罪はゼロに非常に近いです。 したがって、スピードXを得るためにスピードを掛けると、私はまだ非常に低い数値が得られます。そして、デルタTに対してそれを掛けると、それはまだ低すぎます。最後にceilを適用すると、その量は完全に失われます。 94ºで例えば

、デルタT = 1.5、およびスピード= 2、及びXの初期値を仮定して400で、我々は持っている:

speedX = -0.1395... 
this->x = 400 //it must be 399.86..., but stays in 400 due to the ceiling 

だから、私のゲームでは、タンクが回転して表示されますが、まっすぐ進むまた、時にはそれは後ろ向きに動くが間違って前進し、逆行する。

❑タンクの方向をより正確にするにはどうすればよいですか? deltaTの速度や値を上げるには、式1ではなく、タンクについてのオプションではありません。P

+4

+1:あなたの質問を説明し、関連性の低いコードを提供しています。 – ObscureRobot

+1

角度を度で保存することはほとんど役に立ちません。 C++はネイティブラジアンで動作します。あなたは前後に変換を終了します。ラジアンを使用しない場合の例外は、タンクの回転ごとにスプライトの配列がある場合です。その場合、代わりに配列インデックスを使用すると便利です。しかし誰も360スプライトを作ることはできません。 128(4x32)ははるかに一般的です。 – MSalters

+0

@MSaltersはい、私はラジアンについてあまりにも遅れて再確認しました。しかし、実際には、少し単純化したコードを投稿しました。私は数学ライブラリからsin関数とcos関数を使用しませんが、計算を避けるために、ある角度のcosとsinの値を集計しましたそれらは実行時に また、回転イメージの場合、私は128のスプライトを持っていませんが、私はただ1つしか持っていないので、度で動作する "rotozoomSurface"(SDL_gfxライブラリのSDLのアドオン)という関数を使用します。 – Granjero

答えて

9

タンクの方向をより正確にするにはどうすればよいですか?それは、タンクについてですので、速度やデルタTの値を上げるためにオプションではありませんではない式1:Pあなたは、彼らが最終的にのためとしてint Sを使用しているにもかかわらず、float sとあなたの位置の値を格納する必要があり

画面上での位置決め。そうすれば、あなたはあなたのポジションの非整数部分を失うことはありません。ちょうどあなたがあなたの図面を行うときに最後にintにキャストしてください。

+1

ああ、ありがとう!私はちょうどコードの変更を行ったし、それは動作します!私はそれがとてもシンプルだったとは信じられない – Granjero

5

いつもタンクの場所はfloatにしてください。あるいは、タンクを45度単位で回転させるだけです。あなたのゲームがおおよその位置と見出しまたは正確なものを使用するかどうかを決める。

+0

_それ以外の場合は、タンクを45度ずつ回転させてください._ はい、これまでに試みたことがありますが、タンクの回転が速すぎたり、流動的ではありません。 – Granjero

関連する問題