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

时间:2014-06-14 08:16:59

标签: android opengl-es

我正在使用opengl和android。我只是在玩游戏并尝试学习一些东西,我决定制作一个简单的游戏,其中有三角形下降,你必须点击它们以收集"收集"他们(不要偷我的想法!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的新手,这是处理&#34;运动的正确方法&#34;对象等?或者我应该使用哪些方法来实现动画/动作。

1 个答案:

答案 0 :(得分:1)

我见过的最常见的方法有些不同。在准备渲染每个帧时更新动画更为典型,并将更新基于自上一帧开始经过的时间量。

由于距离是速度乘以时间,因此可以通过为每个对象指定速度矢量来实现。然后,当需要更新动画时,您将获取自上次更新以来的时间差,并且应用于您的位置的增量是时差乘以速度。只要您使用线性运动,速度就是恒定的,但是对于更复杂的动画,速度也会随时间而变化,例如:由于重力,与其他物体的碰撞等。

如果您在Android上使用OpenGL,则可能使用GLSurfaceView进行渲染。默认情况下,如果渲染能够跟上显示刷新率,GLSurfaceView将连续调用渲染函数,最高可达60 fps。

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

更新职位后,您可以像往常一样渲染对象。

为了给你提供大纲,以下是我从我对类似问题(Android timing in OpenGL ES thread is not monotonic)的回答中复制的稍微改编的(伪)代码:

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

其中lastFrameTime是成员变量,currentTime是局部变量。