以一定角度移动实体?

Moving an entity at an 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.你有角度 2. 你有 vx 和 vy,从技术上讲,它们是有方向的向量。

这里有两种使用其中任何一种的方法:

假设0度为正x

保持角度

如果你想保留你的角度变量,你需要有一个通用的速度变量,然后在每次更新 x 和 y 时执行此操作:

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

保持速度

这种方法只需要在每次速度变化时使用三角函数,但它也使用昂贵的 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(虽然我不知道为什么你的角度之前是负数)