我正在做一个游戏,我有一个称为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

最佳答案

您对屏幕所做的更改必须进入主线程或通过runOnUiThread

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


您可以添加sleep(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);
        }

      }
}


现在,您需要一个Interface或一个基础的Updatable类。

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系统。

09-11 09:16