4

私は単純なタワーディフェンスを書いています、そして私は私のタワーが敵を撃たなければならないところに少し立ち往生しています。

このコードで:

void Bullet::move(int x, int y, int speed) 
{

    Punkt delta = {(x + speed) - this->x, (y + speed) - this->y};
    if (abs(delta.x) > 1 && abs(delta.y) > 1)
    {
        this->x += delta.x / this->speed;
        this->y += delta.y / this->speed;
    }
    else
    {
        this->dead = true;
    }
}

ここで、メソッド引数はターゲットの位置と速度です。弾丸はターゲットに到達するまでベクトルに沿って移動するはずですが、ターゲットが移動しているため、ベクトルが変化します。今のところ、弾丸はこのようになります(黒は塔、青は弾丸、赤は敵です)

エラー

そして、問題は、私の弾丸がすでに移動したものをターゲットにしていることです。私の質問は、このコードを改善して正しく機能させる方法です。ベクトルや弾道学に頭を包む方法がわからないので、シンプルにしてくれてありがとう。

4

3 に答える 3

3

私が以前に使用したことがあるこの問題の合理的な解決策は次のとおりです。

  1. 弾丸と敵にとって適切な衝突点がどこにあるかを予測するために最善を尽くしてください。素朴なアプローチは、あなたの予測を単に現在の敵の位置にすることです。
  2. 予測された位置で弾丸を発射します
  3. 弾丸が予測された位置に到達したら、弾丸が実際に当たるかどうかに関係なく、弾丸を非表示にし、ダメージアニメーションを再生し、敵の体力を下げます。

このように、あなたがあなたの数学に十分賢いなら、それはよく見えるでしょう。それ以外の場合、ゲームは引き続き正常に動作します。

このアプローチは、敵に発砲した後に敵が速度を変更できる場合(たとえば、特殊な地形や効果範囲の砲塔によって速度が低下する場合)にも、より堅牢になります。

于 2013-01-12T15:39:54.850 に答える
2

移動するターゲットを撃っている場合は、弾丸が到達するまでの時間内にターゲットを設定する必要があります。2つの既知の位置があるため、ベクトルがわかります。

于 2013-01-12T15:40:09.010 に答える
0

さて、私はgamedevフォーラムを少し見て、解決策を手に入れました(私はなんとか理解することさえできました)。それはすべて適切に計算することでした(誰もが言ったように、floatへの変換が必要でした)。怠惰なコードは次のとおりです。

float dx = x - this->x;
float dy = y - this->y;
float dx2, dy2;
float distance;
float vx, vy;

distance = sqrt(dx * dx + dy * dy);
dx2 = dx / distance;
dy2 = dy / distance;

vx = dx2 * this->speed;
vy = dy2 * this->speed;

if (distance > 10) // 10 is hitbox size
{
    this->x += vx; // still float, its converted to int when applying to surface
    this->y += vy;
}
else
{
    this->dead = true;
}
于 2013-01-12T19:08:16.817 に答える