2016-09-09 1 views
0

J'ai littéralement cherché une demi-heure pour cette question et je n'ai pas trouvé ce que je cherchais. C'est mon premier programme lwjgl. La plupart des choses ici sont temporaires, je suis juste en train de m'habituer à LWGJL pour que je puisse finalement en faire un jeu. Je suis juste en train de faire fonctionner certaines fonctions de base.Déplacement d'une entité à un angle?

Donc, fondamentalement, je veux que mon entité se déplace dans le sens de son angle.

Ceci est mon code de mouvement:

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()); 
} 

Ceci est mon principal code de mise à jour:

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); 
} 

Et mon code rotate juste pour les bonnes mesures:

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); 
    } 
} 

S'il vous plaît demander si tu veux voir autre chose.

Merci!

+0

C'est déprécié OpenGL, évitez-le. – elect

+0

C'est un peu vague; quelle partie est dépréciée? –

+0

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

Répondre

0

Il y a deux problèmes:

Tout d'abord, Votre problème est que vous utilisez techniquement deux directions à la fois pour déplacer votre objet. 1. Vous avez un angle 2. Vous avez vx et vy qui est techniquement un vecteur avec une direction.

Voici deux méthodes en utilisant l'un d'eux:

En supposant 0 degrés est positif x

angle Gardez

Si vous voulez garder votre variable d'angle vous devez avoir une variable de vitesse générale, puis faites cela chaque fois que vous mettez à jour le x et le y:

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

Conserver les vitesses

Cette méthode requise en utilisant uniquement les fonctions trigonométriques chaque fois que les vitesses changent, mais il utilise également la fonction coûteuse sqrt avec les fonctions trigonométriques. Vous devez utiliser vx et vy uniquement. Pour les mises à jour, vous ne devez faire ceci:

x += vx; 
y += vy; 

Et puis pour la mise en vx et 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); 
} 

Le deuxième problème est ce code:

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

Vous ne besoin de le traduire par ses valeurs x et y pourquoi une fois, car ses valeurs x et y sont déjà calculées en fonction de l'angle.(Vous semblez aussi se déplacer l'objet à sa position d'origine avec le traduire négatif)

Et plus java et les méthodes LWJGL exigera radians pas en degrés, vous auriez donc besoin de mettre

Math.toRadians(angle); 

Dans glRotate (pourquoi un négatif avant votre angle je ne sais pas si)

+0

@MX wb Toujours sur le sous-thème de l'utilisation des nouvelles méthodes d'OpenGL, regardez la chaîne YouTube ThinMatrix, il enseigne tout ça et aussi le mouvement. –

+0

Oui, je comprends tout à fait moderne gl maintenant grâce à ThinMatrix. Je fais mon propre moteur de jeu maintenant. Je suis bloqué sur une erreur jre maintenant. –

+0

@MXwb Je suis heureux, bonne chance avec cela, si cette réponse a répondu à votre question s'il vous plaît Marquer comme approuvé –