Как я могу исправить небольшое отклонение от вектора движения в java (2D-игра)

Я делаю 2D-шутер с видом сверху на Java (проект uni), но столкнулся с проблемой прицеливания пули - я не уверен, почему угол неправильный и как его исправить.

Игрок стреляет пулями в позицию курсора при наведении мыши. Я использую dx/y = (x/ytarget - x/yorigin), нормализуя и увеличивая положение пуль x/y с dx каждый тик.

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

У меня нет представителя для публикации изображений (первый пост), вот ссылка, показывающая ошибку угла.

https://i.imgur.com/xbUh2fX

Вот класс пули:

примечание: update() вызывается основным игровым циклом

import java.awt.*;
import java.awt.MouseInfo;

public class Bullet {

private double x;
private double y;
private int r;

private double dx;
private double dy;
private double speed;
private double angle;
private Point c;

private Color color1;

public Bullet(int x, int y) {

    this.x = x;
    this.y = y;
    r = 3;
    speed = 30;
    color1 = Color.YELLOW;

    c = MouseInfo.getPointerInfo().getLocation();

// getting direction 
    dx = c.x - x;
    dy = c.y - y;
    double distance = Math.sqrt(dx*dx + dy*dy);
    dx /= distance;
    dy /= distance;

}

public boolean update() {

    x += dx*speed;
    y += dy*speed;

    if(x < -r || x > GamePanel.WIDTH + r ||
        y < -r || y > GamePanel.HEIGHT + r) {
        return true;
    }

    return false;

}

public void draw(Graphics2D g) {

    g.setColor(color1);
    g.fillOval((int) (x - r), (int) (y - r), 2 * r, 2 * r);

}

}


person sbrez    schedule 15.03.2017    source источник
comment
Просто идея, попробуйте изменить x и y на числа с плавающей запятой вместо int, чтобы не потерять точность. Я также попытался бы пройтись по коду, чтобы увидеть значения переменных на каждом этапе.   -  person Steve Smith    schedule 15.03.2017
comment
Ваши расчеты кажутся правильными. Но работает ли MouseInfo.getPointerInfo().getLocation(); в той же системе координат?   -  person MBo    schedule 15.03.2017
comment
@Mbo Я считаю, что он возвращает координаты x и y как двойные. Согласно docs.oracle.com/javase/7/ docs/api/java/awt/Point.html .. Я что-то упустил?   -  person sbrez    schedule 16.03.2017
comment
Я говорил о возможных разных координатах - в системе локального управления/холста, в системе окна/экрана и т.д. Так что MouseInfo может работать в глобальных координатах и ​​возвращать большее значение, но ваш рисунок работает в локальном холсте и так далее.   -  person MBo    schedule 16.03.2017
comment
@Мбо А. Спасибо - я попробую использовать MouseListener только для получения целевого x/y компонента.   -  person sbrez    schedule 16.03.2017


Ответы (1)


У меня есть похожая игра, и я использовал этот код

import java.awt.Graphics2D;

import araccoongames.pongadventure.game.Entity;
import araccoongames.pongadventure.game.Game;
import araccoongames.pongadventure.game.MapLoader;

public class Ball extends Entity {

private float speed = 8;
private float speedx;
private float speedy;
private float degree;

public Ball(float posx, float posy, Game game) {
    super(0, 0, game);

    this.posx = posx;
    this.posy = posy;

    // posx = ball x position
    // posy = ball y position
    // game.input.MOUSEY = mouse y position
    // game.input.MOUSEX = mouse x position

    degree = (float) (270 + Math.toDegrees(Math.atan2(posy - game.input.MOUSEY, posx - game.input.MOUSEX))) % 360;

    speedx = (float) (speed * Math.sin(Math.toRadians(degree)));
    speedy = (float) (speed * Math.cos(Math.toRadians(degree)));
}

@Override
public void render(Graphics2D g) {
    drawImage(game.texture.SPRITE[0][1], g);
}

@Override
public void update() {
    posx += speedx;
    posy -= speedy;

}

}
person ARaccoonGames    schedule 15.03.2017
comment
Попробовал эту реализацию... и получил очень похожий результат с перекошенными углами обстрела. Это заставляет меня поверить, что ошибка не в математике, а где-то еще, возможно? Спасибо вам за помощь. - person sbrez; 16.03.2017