Как я делаю снаряды? - PullRequest
       4

Как я делаю снаряды?

0 голосов
/ 31 января 2011

Я в полном недоумении.Я использую C ++ и SFML 1.6 для игры, которую разрабатываю, и не имею ни малейшего представления.Как я делаю снаряды (например, пули)?Я просто не понимаю этого.Это может быть мой недостаток сна, но я не знаю.

Итак, мой вопрос: как мне создать Sprite, который движется в определенном направлении в зависимости от того, где находится мышь?(Подумайте о стрелке сверху вниз с наведением мыши)

Ответы [ 2 ]

2 голосов
/ 31 января 2011

Самое простое решение: если мышь находится в точке Mx, My, а корабль в точке Sx, Sy, то рассчитайте направление от корабля к мыши: Dx = Sx-Mx Dy = Sy-My

Теперьнормализуйте D (это означает, что масштабируйте его так, чтобы его длина была одна):

DLen=sqrt(Dx*Dx + Dy*Dy)
Dx/=DLen;
Dy/=DLen;

Теперь Dx - это расстояние, на которое вы хотите переместить пулю по оси x, чтобы получить скорость пули, равную 1.

Таким образом, каждый кадр, в котором вы перемещаете маркер, выглядит следующим образом (позиция маркера: Bx, By Speed ​​of Bullet: Bs [в пикселях на миллисек]. Время кадра Ft [в миллисекунах])дать вам пулю, которая движется к положению мыши со скоростью, не зависящей от направления мыши или частоты кадров в игре.

РЕДАКТИРОВАТЬ: Как @MSalters говорит, что вы должны проверить для случая DLen == 0, когда мышь находится прямо над кораблем, чтобы избежать деления на ноль ошибок при нормализации

0 голосов
/ 30 апреля 2016

Один из способов сделать это - сделать пулю лицом к мыши, а затем переместить ее по осям x и y, используя тригонометрию, чтобы найти гипотенузу под углом. Не думаю, что я объяснил это очень хорошо, поэтому вот код, который заставляет спрайт двигаться от вращения:

void sMove(sf::Sprite& input,float toMove, int rotation){
bool negY = false;
bool negX = false;
int newRot = rotation;
if (rotation <= 90){
    negY = true;
}
else if (rotation <= 180){
    //newRot -= 90;
    negY = true;
}
else if (rotation <= 360){
    newRot -= 270;
    negY = true;
    negX = true;
}
float y = toMove*cos(newRot*PI/180);
float x = toMove*sin(newRot*PI/180);
if (negY){
    y = y*-1;
}
if (negX){
    x = x*-1
}
input.move(x, y);
}
...