Как заставить мои пули двигаться в направлении курсора мыши с одинаковой скоростью? - PullRequest
0 голосов
/ 29 апреля 2019

У меня проблема с моей игрой. Это стрелок сверху вниз, и если я нажимаю на мышь, пуля должна выстрелить в направлении, где была мышь. Проблема в том, что с моей попыткой пуля будет быстрее, когда расстояние между игроком и мышью больше, и медленнее, когда расстояние меньше. Я хочу, чтобы эта скорость была постоянной, несмотря ни на что.

Вот как выглядит моя логика:

В конструкторе я даю пулю xDir и yDir: b.xDir = (float64(mouseX) - b.x) b.yDir = (float64(mouseY) - b.y)

Затем в функции обновления я умножаю его на deltaTime и bulles MovementSpeed ​​и добавляю к соответствующей оси положения: b.x += b.movementSpeed * dt * b.xDir b.y += b.movementSpeed * dt * b.yDir

При такой логике скорость пули зависит от расстояния между мышью и игроком. Буду признателен за ответ, который не повлияет на скорость, но все равно будет идти в направлении щелчка мыши.

Заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Проблема в том, что ваши значения b.xDir и b.yDir рассчитываются напрямую из расстояния, поэтому чем дальше щелкнет мышка от игрока, тем выше будут значения.Когда они умножаются на dt, это заставляет их двигаться быстрее.

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

magnitude := math.Sqrt(b.XDir * b.xDir + y.xDir * y.xDir)
b.xDir /= magnitude
b.yDir /= magnitude

В этот момент значение ваших переменных является чисто направлением, иумножение на скорость и dt будет иметь ожидаемые эффекты.

0 голосов
/ 29 апреля 2019

Работает ли что-то подобное? Идея состоит в том, чтобы создать значение от 0 до 1 для направления. Для этого вы делите оба значения на наибольшее из двух. Затем вы можете умножить это на скорость пули. Я не подробно описал функцию playerPosition, но, надеюсь, вы сможете сделать вывод, что она будет делать.

func Max(x, y float64) float64 {
    if x < y {
        return y
    }
    return x
}
type Bullet struct {
  x, y, xDir, yDir float64
}
func getDirection(b *Bullet) {
  directionX = float64(mouseX) - playerPosition().x
  directionY = float64(mouseY) - playerPosition().y
  greatest = Max(mouseX, mouseY)
  b.xDir = directionX / greatest
  b.yDir = directionY / greatest
}

Синтаксис может быть немного отключен, я в основном JS Dev; (

...