我正在阅读this非常棒的Android游戏开始,现在我正在尝试自己实施一些测试。
我正在使用OpenGl ES 1.0,我现在可以操作视锥体,投影,平移,旋转,缩放等。
我正在尝试做什么:
a)将火箭渲染到屏幕上,为它添加一些速度和加速度(使用欧拉积分 - 将加速度加到速度上,并将速度加到位置上)来模拟路径(抛物线)。 - 这样做已经完成,没有任何问题。 b)旋转火箭,这样我们就可以模拟物体沿其路径的倾斜度。 - 这就是问题所在。要清楚,我正在添加下面的图片。
我无法弄清楚在一帧与下一帧之间添加到火箭的正确角度是什么。
我尝试使用某种几何体来获得它。
Obj Pos 1 是第1帧的火箭表示。
Obj Pos 2 是火箭表示,位于下一帧(第2帧)。
V1 是保存Obj Pos 1的中心X和Y坐标的矢量。
V2 是保存Obj Pos 2的中心X和Y坐标的矢量。
切线1 是抛物线的切线,V1指向的位置。
切线2 是抛物线的切线,V2指向的位置。
A1 是两个向量之间的角度。
A2 是两条切线之间的角度。
据我所知,应用于火箭的角度正确,从第1帧到第2帧是角度A2。但我该如何计算呢?
而且,这对游戏来说是否正确?我的意思是,我们不需要精确理解物理概念,我们只需要足够好来模拟动画并“欺骗”用户。
遵循以下代码:
public class PersonalTest008Rocket extends GLGame {
@Override
public Screen getStartScreen() {
return new RocketScreen(this);
}
class RocketScreen extends Screen {
GLGraphics glGraphics;
Camera2D camera;
final float WORLD_WIDTH = 60;
final float WORLD_HEIGHT = 36;
float[] rocketRawData;
short[] rocketRawIndices;
BindableVertices rocketVertices;
DynamicGameObject rocket;
float angle;
Vector2 gravity;
public RocketScreen(Game game) {
super(game);
glGraphics = ((GLGame) game).getGLGraphics();
camera = new Camera2D(glGraphics, WORLD_WIDTH, WORLD_HEIGHT);
rocketRawData = new float[]{
// x, y, r, g, b, a
+4.0f, +0.0f, 1.0f, 0.0f, 0.0f, 1, // 0
+2.0f, +1.0f, 0.5f, 0.0f, 0.0f, 1, // 1
+2.0f, -1.0f, 0.5f, 0.0f, 0.0f, 1, // 2
-2.0f, +1.0f, 0.0f, 0.5f, 0.5f, 1, // 3
-2.0f, -1.0f, 0.0f, 0.5f, 0.5f, 1, // 4
-3.0f, +1.0f, 0.0f, 0.5f, 0.5f, 1, // 5
-3.0f, -1.0f, 0.0f, 0.5f, 0.5f, 1, // 6
-4.0f, +3.0f, 0.0f, 0.0f, 1.0f, 1, // 7
-5.0f, +0.0f, 0.0f, 0.0f, 1.0f, 1, // 8
-4.0f, -3.0f, 0.0f, 0.0f, 1.0f, 1 // 9
};
rocketRawIndices = new short[]{
0, 1, 2,
1, 4, 2,
1, 3, 4,
3, 4, 6,
3, 5, 6,
3, 7, 5,
5, 8, 6,
6, 9, 4
};
rocketVertices = new BindableVertices(glGraphics, 10, 3 * 8, true, false);
rocketVertices.setVertices(rocketRawData, 0, rocketRawData.length);
rocketVertices.setIndices(rocketRawIndices, 0, rocketRawIndices.length);
int velocity = 30;
angle = 45;
rocket = new DynamicGameObject(0, 0, 9, 6);
rocket.position.add(1, 1);
rocket.velocity.x = (float) Math.cos(Math.toRadians(angle)) * velocity;
rocket.velocity.y = (float) Math.sin(Math.toRadians(angle)) * velocity;
gravity = new Vector2(0, -10);
}
@Override
public void update(float deltaTime) {
rocket.velocity.add(gravity.x * deltaTime, gravity.y * deltaTime);
rocket.position.add(rocket.velocity.x * deltaTime, rocket.velocity.y * deltaTime);
}
@Override
public void present(float deltaTime) {
GL10 gl = glGraphics.getGL();
gl.glClearColor(0.5f, 0.5f, 0.5f, 1);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.setViewportAndMatrices();
gl.glTranslatef(rocket.position.x, rocket.position.y, 0);
gl.glRotatef(angle, 0, 0, 1);
rocketVertices.bind();
rocketVertices.draw(GL10.GL_TRIANGLES, 0, rocketRawIndices.length);
rocketVertices.unbind();
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
}
}
}
答案 0 :(得分:0)
您可以根据瞬时速度矢量计算角度:
// Get direction to point the ship
mangleInDeg = (float) (Math.atan2(mRelSpeed.y, mRelSpeed.x) * 180 / Math.PI);
mangleInDeg += 90.0; // offset the angle to coincide with angle of the base ship image