0

私はゲームをやっていて、SurfaceView を拡張して Runnable を実装する GameLoop と呼ぶこのクラスがあります。ゲームのスプライト オブジェクト内でメソッドを呼び出し、その値を一定間隔で変更したいと考えています。そこで、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
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 に答える