Java-игра вращает изображение и ось

Я сделал игру с космическим кораблем, но у меня проблема с его перемещением. это скрипт:

public  class spaceship {  

private final local_client local_client;

private final int startX;
private final int startY;
private final int startR;

private double x,y,r;
public static double rotation;
public static double velo;

публичный статический AffineTransform at;

public spaceship(local_client local_client,int startX,int startY,int startR) {
    this.local_client = local_client;
    this.startX = startX;
    this.startY = startY;
    this.startR = startR;
    x=200;
    y=200;
    r=90;
}  

public void drawImage(Graphics2D g2d) {  
    g2d.drawImage(local_client.spaceship_img,200,200, local_client.game);
     at = g2d.getTransform();

              at.translate(x , y);
                       at.rotate(Math.toRadians(r));
            at.translate(-(local_client.spaceship_img.getWidth()/2),-(local_client.spaceship_img.getHeight()/2));
     System.out.println(at.getTranslateX() + " - " + at.getTranslateY());
              g2d.setTransform(at);
     g2d.drawImage(local_client.spaceship_img,0,0, local_client.game); 

}

Итак, с помощью этого скрипта я могу повернуть изображение (см. скрин): http://gyazo.com/c982b17afbba8cdc65e7786bd1cbea47

Моя проблема в том, что если я увеличиваю X или Y, перемещаюсь по нормальной оси (экран): /a> а не по диагонали


person terzi_matte    schedule 26.09.2014    source источник


Ответы (1)


at.translate(x , y);

Эта строка кода перемещает ваш корабль, верно? Увеличение x и y будет перемещать их только вверх и вниз в соответствии с осью.

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

Ниже приведен приблизительный псевдокод, который должен привести вас в правильном направлении. Может быть или не быть точным в зависимости от вашего r.

//drive along the ship's nose line
void moveAlongShipAxis(int magnitude) {
    x += magnitude * Math.cos(Math.toRadians(r));
    y += magnitude * Math.sin(Math.toRadians(r));       
}
//strafe left and right, if you have that, otherwise you can skip this one
void moveYAlongTransverseAxis(int magnitude) {
    y += magnitude * Math.cos(Math.toRadians(r));
    x += magnitude * Math.sin(Math.toRadians(r));       
}
person Compass    schedule 26.09.2014
comment
Привет, какова его величина, и когда я должен вызвать этот метод? - person terzi_matte; 28.09.2014
comment
@terzi_matte Допустим, транспортное средство — это машина. Когда вы нажимаете на педаль газа, он сразу разгоняется до 100 км / ч или постепенно ускоряется до 100 км / ч? Добавляя величину, вы можете определить, с какой скоростью движется корабль. Таким образом, величина 100 в вашей игре будет означать, что корабль летит со скоростью 100 пикселей в секунду. Величина 10 будет означать 10 пикселей в секунду. - person Compass; 29.09.2014
comment
Да, большое спасибо, я понял это через 1 час, но спасибо, я думаю, вы поменяли местами cos и sin :) - person terzi_matte; 30.09.2014
comment
@terzi_matte да, мне приходится писать большую часть кода в голове, поэтому я не могу проверить это, но концепция есть :3 - person Compass; 30.09.2014