2013-04-27 67 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

相关问题