我在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
为局部变量