我正在使用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;对象等?或者我应该使用哪些方法来实现动画/动作。
答案 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
是局部变量。