Пишу небольшой 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();
}
Кто может помочь откликнитесь пожалуйста, большое спасибо!
Пускай за один шаг мы проходим c расстояние. Когда мы будем двигаться в какую-то сторону, то образуется треугольник с гипотенузой c и двумя катетами dX и dY, которые представляют собой смещение по двум координатам. Угол у основания этого треугольника и центра кооридинат нам известен, значит осталось найти катеты по гипотенузе и одному углу.
dX = sin(L)*c
dY = cos(L)*c
Если известен угол не к оси Ox, а к оси Oy, то достаточно поменять местами
dX = cos(L)*c
dY = sin(L)*c
Стоит избегать целочисленных координат, либо хранить еще вещественные коориднаты, а потом преобразовывать в целочисленные, иначе из-за округления может случится ситуация, что либо ничего не меняется, либо меняется, но не так как хочется. Пробуйте
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
как сделать OnClick в моем адаптереодна кнопка если на нее нажали то должно происходить какое то действие
Как написать метод,который помещает в Коллекцию сразу все объект(а не по одному)? Есть класс Products с конструктором и переопределением toString...
пишу простенький клиент и сервер на UDP, по заданию в клиенте необходимо использовать DatagramChannel, тк