以某个角度移动实体?

时间:2016-09-09 18:14:14

标签: java lwjgl trigonometry angle

我真的在半小时内搜寻这个问题而且我找不到我一直在寻找的东西。这是我的第一个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);
    }
}

请询问您是否还想看其他任何内容。

谢谢!

1 个答案:

答案 0 :(得分:0)

有两个问题:

首先, 您的问题是,您在技术上一次使用两个方向来移动对象。 你有一个角度 2.你有vx和vy,它在技术上是一个带方向的矢量。

以下是使用其中任何一种方法的两种方法:

假设0度是正x

保持角度

如果你想保留你的角度变量,你需要有一个通用的速度变量,然后每次更新x和y时都这样做:

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

保持速度

这种方法只需要在每次速度变化时使用trig函数,但它也使用带有三角函数的昂贵的sqrt函数。 您只需要使用vx和vy。 对于更新,您只需要执行此操作:

x += vx;
y += vy;

然后设置vx和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(为什么你的角度之前的负面我不知道)