2015-12-06 4 views
0

Я пытаюсь реализовать метод стрельбы из пули в направлении мыши. Я не знаю математики или логики для нее. Это 2D-нисходящая игра. У меня пуля стреляет вправо и заканчивается в определенный момент. Мне нужно знать логику стрельбы в направлении положения мыши, а не просто добавление 1 к позиции x.Съемка пули в направлении мыши в Java/Slick2D

ответ

3

Используйте atan2, чтобы найти угол между началом пули и курсором мыши. Затем используйте Sin и Cos для вычисления скорости x и y пули.

псевдо-код

public void ShootBullet() 
    { 
     double bulletVelocity = 1.0; //however fast you want your bullet to travel 
     //mouseX/Y = current x/y location of the mouse 
     //originX/Y = x/y location of where the bullet is being shot from 
     double angle = Math.Atan2(mouseX - originX, mouseY - originY); 
     double xVelocity = (bulletVelocity) * Math.Cos(angle); 
     double yVelocity = (bulletVelocity) * Math.Sin(angle); 
    } 
+0

Любовь к простоте вашего ответа lol. Я собираюсь попробовать это rn – Phippre

+0

Это не работает. Он будет стрелять только в пуле в определенном положении, и когда он стреляет в xvel, и yvel будет меняться, если я передвигаю мышь в определенном месте. – Phippre

+0

Isnt Cos и Sin для 2-х сторонних игроков? – Phippre

0

Это мой код для нереста снарядов.

public void spawnProjectile(Input input) { 

    double mouseX = 0; 
    double mouseY = 0; 
    double xVel; 
    double yVel; 
    double angle; 

    if (timer > 0) { 
     timer--; 
    } 

    if (input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON)) { 
     mouseX = input.getMouseX(); 
     mouseY = input.getMouseY(); 
     if (projectiles.size() < 1 && timer <= 0) { 
      projectiles.add(new Projectile((int) x + 8, (int) y + 8, 8, 8)); 
     } 
    } 

    if (projectiles.size() > 0) { 
     for (int i = 0; i < projectiles.size(); i++) { 
      projectiles.get(i).update(input); 
      double originX = x; 
      double originY = y; 

      angle = Math.atan2(mouseX - originX, mouseY - originY); 
      xVel = (bulletVel) * Math.cos(angle); 
      yVel = (bulletVel) * Math.sin(angle); 

      projectiles.get(i).x += xVel; 
      projectiles.get(i).y += yVel; 

      if (projectiles.get(i).timer == 0) { 
       projectiles.remove(); 
      } 
     } 
    } 
} 
Смежные вопросы