所以基本上,我希望我的实体朝着它的角度方向移动。
这是我的动作代码:
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 :(得分: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(为什么你的角度之前的负面我不知道)