使用Android计时器实现图形移动



我在android上使用opengl。我只是在玩,并试图学习一些东西,我决定做一个简单的游戏,其中有下落的三角形,你必须点击它们来"收集"它们(不要窃取我的想法!xD)。

我正在使用Android Timer:

Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        float[] p1Temp = mTriangle.getP1();
        float[] p2Temp = mTriangle.getP2();
        float[] p3Temp = mTriangle.getP3();
        mTriangle.changeCoords(new float[] {p1Temp[0], p1Temp[1] - 0.01f, p1Temp[2],
                                            p2Temp[0], p2Temp[1] - 0.01f, p2Temp[2],
                                            p3Temp[0], p3Temp[1] - 0.01f, p3Temp[2]});
        if (mTriangle.getP1()[1] <= -1.0f ||
            mTriangle.getP2()[1] <= -1.0f ||
            mTriangle.getP3()[1] <= -1.0f) {
            t.cancel();
        }
    }
}, 0, 40);

基本上这段代码是这样做的:有一个计时器,每40毫秒,下落三角形的每个顶点的y坐标递减。这个过程在它到达屏幕底部(即到达地面)时停止。

我的问题是这样的,我是新的在android中使用openGL,这是正确的方式来处理"运动"的对象等?或者我应该使用一些方法来实现动画/移动

我见过的最常见的方法有些不同。更典型的做法是,在准备渲染每一帧时更新动画,并基于自上一帧以来经过的时间量进行更新。

因为距离是速度乘以时间,你可以通过给每个物体分配一个速度矢量来实现。然后当需要更新动画时,取上次更新以来的时间差,应用于位置的增量是时间差乘以速度。只要你只是使用线性运动,速度是恒定的,但也可以随着时间改变更复杂的动画,例如由于重力,与其他物体的碰撞等。

如果你在Android上使用OpenGL,你可能会使用GLSurfaceView来渲染。默认情况下,GLSurfaceView会连续调用你的渲染函数,如果你的渲染可以跟上显示刷新率,最高可达60 fps。

你所做的大致是保持最后一帧作为GLSurfaceView.Renderer实现中的成员变量呈现的时间。然后每次调用onDraw()时,您都会获得新的时间,并从该时间减去最后一帧时间以获得时间增量。然后将新时间存储在成员变量中,将时间增量乘以速度,并将结果添加到位置。

位置更新后,你可以像平常一样渲染你的对象。

为了给你提纲,以下是我从我对类似问题(OpenGL ES线程中的Android计时不是单调的)的回答中复制的稍微改编的(伪)代码:

public void onDrawFrame(GL10 gl) {
    currentTime = SystemClock.elapsedRealtime()
    deltaTime = currentTime - lastFrameTime
    lastFrameTime = currentTime
    update animation based on deltaTime
    draw frame
}

其中lastFrameTime为成员变量,currentTime为局部变量

最新更新