Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Android定时器实现图形化移动_Android_Opengl Es - Fatal编程技术网

使用Android定时器实现图形化移动

使用Android定时器实现图形化移动,android,opengl-es,Android,Opengl Es,我正在使用opengl和android。我只是到处玩,试图学习一些东西,我决定做一个简单的游戏,那里有下落的三角形,你必须点击它们来“收集”它们(不要窃取我的想法!xD) 我使用的是安卓计时器,如下所示: Timer t = new Timer(); t.scheduleAtFixedRate(new TimerTask() { @Override public void run() { float[] p1Temp = mTriangle.getP1();

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

我使用的是安卓
计时器
,如下所示:

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);
Timer t=new Timer();
t、 scheduleAtFixedRate(新TimerTask(){
@凌驾
公开募捐{
float[]p1Temp=mTriangle.getP1();
float[]p2Temp=mTriangle.getP2();
float[]p3Temp=mTriangle.getP3();
mTriangle.changeCoords(新浮点[]{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]我见过的最常见的方法有些不同。更典型的方法是在准备渲染每一帧时更新动画,并根据自上一帧以来经过的时间量进行更新

因为距离是速度乘以时间,所以可以通过为每个对象指定一个速度向量来实现。然后,当到了更新动画的时间时,可以取自上次更新以来的时间差,并且应用于位置的增量是时间差乘以速度。只要y,速度都是恒定的您只需使用线性运动,但也可以随着时间的推移更改更复杂的动画,例如,由于重力、与其他对象的碰撞等

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

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

更新位置后,将按正常方式渲染对象

为了给你一个提纲,下面是我从一个类似问题()的答案中复制的一段稍加修改的(伪)代码:


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

这太糟糕了,我想我必须从头开始。谢谢你花时间告诉我正确的方法:)哈哈,我的投票和接受的答案让你打破了4k代表
public void onDrawFrame(GL10 gl) {
    currentTime = SystemClock.elapsedRealtime()
    deltaTime = currentTime - lastFrameTime
    lastFrameTime = currentTime
    update animation based on deltaTime
    draw frame
}