Android游戏 - 沿路径

时间:2016-03-13 18:19:40

标签: android animation vector opengl-es

我正在阅读this非常棒的Android游戏开始,现在我正在尝试自己实施一些测试。

我正在使用OpenGl ES 1.0,我现在可以操作视锥体,投影,平移,旋转,缩放等。

我正在尝试做什么:

a)将火箭渲染到屏幕上,为它添加一些速度和加速度(使用欧拉积分 - 将加速度加到速度上,并将速度加到位置上)来模拟路径(抛物线)。 - 这样做已经完成,没有任何问题。

b)旋转火箭,这样我们就可以模拟物体沿其路径的倾斜度。 - 这就是问题所在。

要清楚,我正在添加下面的图片。

enter image description here

我无法弄清楚在一帧与下一帧之间添加到火箭的正确角度是什么。

我尝试使用某种几何体来获得它。

enter image description here

  

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() {

    }
}
}

1 个答案:

答案 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