2013-04-27 65 views
0

我正在做一個遊戲,我有這個類,我調用GameLoop來擴展SurfaceView並實現Runnable。我想調用遊戲精靈對象中的方法,並間隔地改變它們的值。因此,我想出了在GameLoop類的構造函數中擁有一個Timer對象並通過一個管理器爲所有遊戲精靈對象調用方法的想法。我之前完成了這個工作,然後它就開始工作了,但是現在當我這樣做時,遊戲力量就會關閉!有什麼可能是錯誤的,他們是一個更好的方式來做到這一點?定時器不能在擴展SurfaceView的類中運行,並且實現了Runnable

這是我在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 
+0

請在LogCat中顯示適當的堆棧跟蹤... – TomTasche 2013-04-27 12:47:16

+0

你以前在Android或只是java中做過嗎? – 2013-04-27 12:53:31

+0

它現在好像在工作!我使用了一些代碼,這些代碼是從一個答案中得到的,後來得到了低估,然後被刪除了!我不知道爲什麼這是downvoted。也許不是最好的解決方案。 – 2013-04-27 13:07:39

回答

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 

} 

} 

一般這種溶液是preety很像AndEngine系統。

+0

如果我加入睡眠,那麼它會影響遊戲的其餘部分!? – 2013-04-27 13:02:06

+0

它只會影響thar Runnable中的對象。你可以爲每次調用一個,每個對象一個,或者我認爲它更好,一個更新線程和一個對象列表每次都調用的Updatables – 2013-04-27 13:05:54

+0

嗯,它有點難以理解!我想我必須更多地談論線程。我正在考慮在每個對象中都有某種計時器,所以精靈對象可以過自己的生活,但這可能不是實現它的最佳方式! – 2013-04-27 13:10:01

相關問題