Разжигание пули в направлении спрайта

0

Как именно это было бы достигнуто? Вот код, который у меня есть до сих пор, который просто вращает корабль на основе мыши, а также пули:

xPos = ship.getPosition().x, yPos = ship.getPosition().y, mousex = sf::Mouse::getPosition(window).x, mousey = sf::Mouse::getPosition(window).y;
if (mousex > 800) mousex = 800; if (mousey > 600) mousey = 600; if (mousex < 0) mousex = 0; if (mousey < 0) mousey = 0;
double angle = atan2(mousey - yPos, mousex - xPos) * (180/3.14159);
ship.setRotation(90+angle);
bullet.setRotation(-90+angle);

Итак, как бы я сравнил скорость пули, чтобы она была такой же, как направление, с которым сталкивается корабль? Чтобы я стрелял пулей, он должен стрелять точно туда, куда смотрит корабль.

То, что я пробовал до сих пор, - это создать вектор расстояния от пули до положения мыши и перемещать пулю по этому вектору расстояния, но, конечно, это мгновенно переместит пулю в положение мыши всего за 1 кадр. Он должен быть похож на нормальную скорость, которая все еще идет в направлении мыши.

  • 1
    Похоже, базовая тригонометрия для меня. Либо делайте velocity_x = cos(angle)*speed; velocity_y = sin(angle)*speed; или нормализуйте вектор [mousex-xPos,mousey-yPos] и умножьте его компоненты со скоростью
Теги:
sfml

1 ответ

1

Итак, поскольку вы правильно описали, что вам нужно, это нормализованная дельта в направлении угла.

Либо вы используете свойства круга единства, либо вычисляете его как

velocity_x = cos(angle)*speed;
velocity_y = sin(angle)*speed;

или вы используете подход, который вы начали и делаете

diff_x = mousex - xPos;
diff_y = mousey - yPos;
magnitude = sqrt(diff_x*diff_x + diff_y*diff_y);
velocity_x = diff_x/magnitude * speed; 
velocity_y = diff_y/magnitude * speed; 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню