Timer在扩展SurfaceView并实现Runnable的类中不起作用

时间:2013-04-27 12:01:34

标签: java android

我正在做一个游戏,我有这个类,我称之为GameLoop,它扩展了SurfaceView并实现了Runnable。我想在游戏精灵对象中调用方法并在间隔中更改它们的值。因此,我提出了在GameLoop类的构造函数中包含Timer对象的想法,并通过管理器为所有游戏精灵对象调用方法。我之前做过这个,然后它就工作了,但是当我现在这样做时,游戏力量就要结束了!可能有什么不对,他们是更好的方法吗?

这是我在GameLoop类的构造函数中拥有的时间间隔的代码。当我删除代码,它工作正常,但我得到任何间隔!?帮助是精确的!谢谢!

        // Set timer to call method to change directions of Circle object in interval
    timer1.scheduleAtFixedRate(new TimerTask()
    {
        public void run() {
            // Call method to change direction
        }

    }, 0, 1000); // 1 sec

1 个答案:

答案 0 :(得分:1)

您对屏幕的更改必须在主线程中或通过runOnUiThread

runOnUiThread(new Runnable() {
    public void run() {
        /////your code here
    }
});

您可以添加一个睡眠(1000,0)并检查通话之间的已用时间,使其达到固定费率。

public class MyUpdater extends Thread
{

long milis;
long nanos;

private ArrayList<Updatable> updatables;

public MyUpdater(long milis,long nanos)
      {
      super();

      this.milis=milis;
      this.nanos=nanos;

      updatables=new ArrayList<Updatable>();
      }

public void run()
      {

     runOnUiThread(new Runnable() {
     public void run() {

       long previousTime=System.nanoTime();

       while(true)
           { 
            sleep(milis,nanos);

            long now=System.nanoTime();
            long elapsedTime=previousTime-now;

            previousTime=now;

            update(elapsedTime);

           }

         }
        });
      }


public synchronized void addUpdatable(Updatable object)
      {
      updatables.add(object);

      }

public synchronized void removeUpdatable(Updatable object)
      {
      updatables.remove(object);

      }

private synchronized void update(long elapsedTimeNanos)
      {
      for(Updatable object: updatables)
        {
         object.onUpdate(elapsedTimeNanos);
        }

      }
}

您现在需要一个接口或基本可更新类。

public Interface Updatable
{
public void onUpdate(long elapsedTimeNanos);
}

一个例子

public class MyJozanClass implements Updatable()
{
private float adjuster=0.00002f; ////you will have to adjust this depending on your ///times

float x=0;
float y=0;

public MyJozanClass()
{
}

public void onUpdate(long elapsedTimeNanos)
{

float newX=x+adjuster*elapsedTimeNanos;
float newY=y+adjuster*elapsedTimeNanos;

//////change positions

}

}

一般来说,这个解决方案很像AndEngine系统。