我正在做一个游戏,我有一个称为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
最佳答案
您对屏幕所做的更改必须进入主线程或通过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系统。