2013-01-12 39 views
4

我正在写一个简单的塔防和我卡上有点在我的塔内有射击敌人的移动。一起在C 2D矢量(塔防)+

有了这个代码:

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; 
    } 
} 

Where方法参数是目标位置和速度。它应该沿着矢量移动子弹直到它到达目标,但矢量因目标移动而改变。对于现在的子弹结束了这样的(黑塔,蓝色是子弹和红色是敌人)

error

我知道的问题是,我的子弹瞄准的东西已经搬到所以我的问题是 - 如何改进这个代码,使其正常工作?我不知道如何将自己的头部包裹在向量和乐观之中,所以在此先感谢您保持简单。

+1

对于gamedev可能是一个更好的问题。 – chris

+0

你为什么使用整数算术? 'x','子弹:: x','delta.x'和'speed'均为整数,这可能会导致意想不到的结果:如果'这个 - > speed'比'delta.x'和'增量更大。 y',即使它没有达到目标,你的子弹也会停止移动! – us2012

+0

SDL轴是整数,我不能使用浮点数,或者我可以吗? – Deith

回答

3

一个合理的解决这个问题,我已经看到了使用之前如下:

  1. 尽你所能地预测哪里好碰撞点将会是子弹和敌人。一种天真的做法是让你的预测简单地成为当前的敌人位置。
  2. 火子弹在预测的位置
  3. 当子弹到达预测的位置,让子弹消失,起到损害的动画,并降低敌人的健康 - 不管是否子弹竟打

这种方式,如果你足够聪明与你的数学,它会看起来不错。但除此之外,游戏仍然可以正常工作。

如果敌人在发射后可能会改变速度(例如特殊地形或区域效应炮塔减速),这种方法也更加稳健。

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; 
}