2016-09-09 3 views
0

Я буквально искал полчаса за этот вопрос, и я не нашел то, что искал. Это моя первая программа lwjgl. Большая часть материала здесь временно, я просто привык к LWGJL, поэтому могу в конечном итоге превратить это в игру. Я просто запускаю некоторые базовые функции.Перемещение объекта под углом?

Так что, в основном, я хочу, чтобы моя сущность двигалась в направлении ее угла.

Это мой код движения:

public static void moveAtAngle(Entity entity) { 
    float x = entity.getX(); 
    float y = entity.getY(); 
    float xv = entity.getXV(); 
    float yv = entity.getYV(); 
    float angle = entity.getAngle(); 

    x += xv * Math.cos(Math.toRadians(angle - 90)); 
    y += yv * Math.cos(Math.toRadians(angle - 90)); 

    entity.setXAndY(x, y); 
} 

public static void move(Entity entity, float vel, float anglevel) { 
    entity.setXV(entity.getXV() * vel); 
    entity.setX(entity.getX() + entity.getXV()); 
    entity.setYV(entity.getYV() * vel); 
    entity.setY(entity.getY() + entity.getYV()); 
    entity.setAV(entity.getAV() * anglevel); 
    entity.setAngle(entity.getAngle() + entity.getAV()); 
} 

Это мой основной код обновления:

public static void update() { 
    Graphics.move(Entity.sprite, 0.95F, 0.99F); 

    Graphics.moveAtAngle(Entity.sprite); 

    if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { 
     Entity.sprite.setAV(Entity.sprite.getAV() + 0.1F); 
    } 
    if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { 
     Entity.sprite.setAV(Entity.sprite.getAV() - 0.1F); 
    } 
    if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { 
     Entity.sprite.setYV(Entity.sprite.getYV() - 1); 
    } 
    if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { 
     Entity.sprite.setYV(Entity.sprite.getYV() + 1); 
    } 
} 

public static void updateGraphics() { 
    glMatrixMode(GL_PROJECTION); 
    glOrtho(0, SLDisplay.getWidth(), SLDisplay.getHeight(), 0, 1, -1); 
    glMatrixMode(GL_MODELVIEW); 

    while (!Display.isCloseRequested()) { 
     update(); 

     glPushMatrix(); 
      glClear(GL_COLOR_BUFFER_BIT); 
      glLoadIdentity(); 
      Graphics.rotate(Entity.sprite); 
      Graphics.drawTriangle(Entity.sprite.getX(), Entity.sprite.getY(), 150F, (byte) 150, (byte) 200, (byte) 255, (byte) 0); 
     glPopMatrix(); 

     Display.update(); 
     Display.sync(60); 
    } 

    destroy(false); 
} 

И мой поворот код только для хороших мер:

public static void rotate(Entity entity) { 
    glTranslatef(entity.getX(), entity.getY(), 0); 
    glRotatef(-entity.getAngle(), 0, 0, 1); 
    glTranslatef(-entity.getX(), -entity.getY(), 0); 

    if (entity.getAngle() <= 0){ 
     entity.setAngle(entity.getAngle() + 360); 
    } else if (entity.getAngle() >= 360) { 
     entity.setAngle(entity.getAngle() - 360); 
    } 
} 

Пожалуйста, спросите, если вы хотите увидеть что-нибудь еще.

Спасибо!

+0

Это устаревшее OpenGL, избегайте его. – elect

+0

Это немного расплывчато; какая часть его устарела? –

+0

https://www.opengl.org/wiki/Legacy_OpenGL – elect

ответ

0

Есть две проблемы:

Во-первых, Ваша проблема заключается в том, что вы технически использованием сразу двух направлений, чтобы переместить объект. 1. У вас есть угол 2. У вас есть vx и vy, который является технически вектором с направлением.

Вот два метода, используя один из них:

Предполагая, что 0 градусов положительна х

Держите углу

Если вы хотите сохранить переменный угол вы должны иметь общую переменную скорости, а затем сделать это за каждый раз, когда вы обновляете x и y:

float radAngle = Math.toRadians(angle); 
x += speed * cos(radAngle); 
y += speed * sin(radAngle); 

Держите скорости

Этого метод требуется только при использовании тригонометрических функций при каждом изменении скорости, но он также использует дорогостоящую функцию SQRT с функциями тригонометрии. Вам нужно будет использовать только vx и vy. Для обновления вы только должны были бы сделать это:

x += vx; 
y += vy; 

А потом для установки ух и VY:

public void setAngle(float angle){ 
    angle = Math.toRadians(angle); 
    float speed = Math.sqrt(vx * vx + vy * vy); //magnitude of movement vector 
    vx = speed * Math.cos(angle); 
    vy = speed * Math.sin(angle); 
} 

Вторая проблема заключается этот код:

glTranslatef(entity.getX(), entity.getY(), 0); 
glRotatef(-entity.getAngle(), 0, 0, 1);  
glTranslatef(-entity.getX(), -entity.getY(), 0); 

Вы только нужно перевести его по x и y, поэтому значения один раз, так как значения x и y вычисляются в соответствии с углом.(Вы также, как представляется, перемещение объекта обратно в свое первоначальное положение с отрицательным перевести)

И большинство Java и LWJGL методы требуют радиан не градусов, так что вам будет нужно положить

Math.toRadians(angle); 

В glRotate (почему негатив перед вашим углом я не знаю, хотя)

+0

@MX wb Также на подтеме использования новых методов OpenGL посмотрите на канал ThinMatrix youtube, он преподает все это, а также движение. –

+0

Да, я полностью понимаю современный gl благодаря ThinMatrix. Сейчас я делаю свой собственный игровой движок. Я застрял на ошибке. –

+0

@MXwb Я рад, удачи с этим, если этот ответ ответит на ваш вопрос, хотя, пожалуйста, отметьте его как одобренный –

Смежные вопросы