0

我正在做一个游戏,我有一个我称之为 GameLoop 的类,它扩展了 SurfaceView 并实现了 Runnable。我想调用游戏精灵对象中的方法并定期更改它们的一些值。因此,我想出了在 GameLoop 类的构造函数中包含一个 Timer 对象并通过管理器为所有游戏精灵对象调用方法的想法。我以前这样做过,然后它就起作用了,但是当我现在这样做时,游戏强制关闭!可能出了什么问题,他们是更好的方法吗?

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

        // 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
4

1 回答 1

1

您对屏幕的更改必须在主线程中或通过 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 系统。

于 2013-04-27T12:52:59.913 回答