Как заставить героя двигаться в нужном направлении?

143
23 декабря 2019, 09:00

Пишу небольшой 2D шутер, на данный момент герой поворачивается в ту сторону куда смотрит мышь, не могу понять как сделать так чтобы он двигался в том направлении. То есть когда я нажимаю "W" то он должен идти именно в ту сторону, в которую смотрит мышь (во все стороны должен ходить с одинаковой скоростью). Вот код:

public class ImageFollowingMousePanel extends JPanel implements MouseMotionListener {
private final BufferedImage image;
private Image scaled;
private Point imagePosition = new Point(800,400);
private double imageAngleRad = 0;
public ImageFollowingMousePanel(JFrame frame) {
    setBackground(Color.gray);
    BufferedImage i = null;
    try {
        i = ImageIO.read(new File("qwe.png"));
    } catch (Exception e) {
        e.printStackTrace();
    }
    image = i;
     scaled = image.getScaledInstance(156,103,Image.SCALE_SMOOTH);
    addMouseMotionListener(this);
    frame.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_W){
                move();
            }
        }
    });
}

@Override
protected void paintComponent(Graphics gr) {
    super.paintComponent(gr);
    Graphics2D g = (Graphics2D)gr;
    g.setRenderingHint(
            RenderingHints.KEY_RENDERING,
            RenderingHints.VALUE_RENDER_QUALITY);
    int cx = GameMenu.BLOCK_WEIGHT/ 2;
    int cy = GameMenu.BLOCK_HIEGHT / 2;
    AffineTransform oldAT = g.getTransform();
    g.translate(cx+imagePosition.x, cy+imagePosition.y);
    g.rotate(imageAngleRad);
    g.translate(-cx, -cy);
    g.drawImage(scaled, 0, 0, null);
    g.setTransform(oldAT);
}
public void move(){
    repaint();
}
@Override
public void mouseDragged(MouseEvent e) {}
@Override
public void mouseMoved(MouseEvent e) {
    double dx = e.getX() - imagePosition.getX();
    double dy = e.getY() - imagePosition.getY();
    imageAngleRad = Math.atan2(dy, dx);
    repaint();
}

Кто может помочь откликнитесь пожалуйста, большое спасибо!

Answer 1

Пускай за один шаг мы проходим c расстояние. Когда мы будем двигаться в какую-то сторону, то образуется треугольник с гипотенузой c и двумя катетами dX и dY, которые представляют собой смещение по двум координатам. Угол у основания этого треугольника и центра кооридинат нам известен, значит осталось найти катеты по гипотенузе и одному углу.

dX = sin(L)*c
dY = cos(L)*c

Если известен угол не к оси Ox, а к оси Oy, то достаточно поменять местами

dX = cos(L)*c
dY = sin(L)*c

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

READ ALSO
Intellij-IDEA путает версию Java

Intellij-IDEA путает версию Java

IDEA возвращает вот такую ошибку:

146
RecyclerView onClick

RecyclerView onClick

как сделать OnClick в моем адаптереодна кнопка если на нее нажали то должно происходить какое то действие

148
заполнение Collection JAVA

заполнение Collection JAVA

Как написать метод,который помещает в Коллекцию сразу все объект(а не по одному)? Есть класс Products с конструктором и переопределением toString...

150
DatagramChannel бесконечное ожидание пакетов

DatagramChannel бесконечное ожидание пакетов

пишу простенький клиент и сервер на UDP, по заданию в клиенте необходимо использовать DatagramChannel, тк

160