gpt4 book ai didi

java - 以一定角度移动实体?

转载 作者:行者123 更新时间:2023-12-01 09:30:50 24 4
gpt4 key购买 nike

我确实为这个问题搜索了半个小时,但没有找到我一直在寻找的东西。这是我的第一个 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 从技术上讲是一个有方向的 vector 。

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

假设 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(为什么在你的角度之前有一个负数,但我不知道)

关于java - 以一定角度移动实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39417483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com