我正在做一个游戏,我有这个类,我称之为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
答案 0 :(得分: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
}
}
一般来说,这个解决方案很像AndEngine系统。