我正在写一个简单的塔防,而且我被困在我的塔必须射击敌人的位置。
使用此代码:
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;
}
}
方法参数是目标位置和速度。它应该沿着向量移动子弹直到它到达目标但是向量会因目标移动而改变。现在子弹就这样结束了(黑色是塔,蓝色是子弹,红色是敌人)
而且我知道问题是我的子弹针对已经移动的内容所以我的问题是 - 如何改进此代码以使其正常工作?我不知道如何围绕矢量和balistics包围我们,所以提前感谢它保持简单。
答案 0 :(得分:3)
我之前见过的这个问题的合理解决方案如下:
这样一来,如果你的数学很聪明,它会很好看。但除此之外,游戏仍能正常运作。
如果敌人可能会在你射击之后改变速度(例如,他们会被特殊地形或一个效果区炮塔放慢速度),这种方法也会更加强大。
答案 1 :(得分:2)
如果您正在拍摄移动目标,则需要定位子弹到达目标时的位置,然后您有两个已知位置,以便您知道矢量。
答案 2 :(得分:0)
好吧,我在gamedev论坛上看了一下,我得到了解决方案(我甚至设法理解)。这一切都与正确计算有关(如所有人所说,转换为浮动是必要的)。这是懒惰的代码:
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;
}