我正在尝试创建一个游戏,让敌人随机生成并移向屏幕上的某个点。我的问题是程序等待它们产生并且它们开始移动它们。我希望他们在产生时开始移动并在每个之间进行短暂的休息。
以下是推动它们移动的两个主要方法:
public void newLevel() {
runOnUiThread(new Runnable(){
public void run() {
int i = 0;
while( i < 10){
addSpeks();
i++;
try {
Thread.sleep(2000);
}
catch(InterruptedException ie){
ie.printStackTrace();
}
}
}
});
}
public void addSpeks() {
Spek newSpek = new Spek(this);
setRandomRegion();
newSpek.setX(spawnX);
newSpek.setY(spawnY);
relativeLayout.addView(newSpek);
spekList.add(newSpek);
newSpek.setOnClickListener(spekListener);
newSpek.animate().x(finalX).y(finalY).setDuration(8000);
}
Spek是一个扩展ImageView的简单类,setRandomRegion()选择屏幕边框上的随机x,y坐标。为了简单起见,我在while循环中有一个计数器,但我想最终将它移动到条件无限循环中,只有在你输掉游戏时它才会停止。
感谢您提供任何帮助,如果问题需要进一步澄清,请告诉我。
答案 0 :(得分:1)
完成后你必须重新运行你的线程,在Android中它可以像这样完成:
首先,创建您的Runnable
:
private Runnable SpawnEnemies = new Runnable(){
public void run(){
//Your code here...
spawnHandler.postDelayed(2000, this);
}
};
然后,创建一个处理程序,它将是运行该线程的类(或者,可以运行)并像这样启动Runnable
:
Handler spawnHandler = new Handler();
spawnHandler.post(new SpawnEnemies());
这将每2秒运行一次,你也可以添加一个布尔值或类似的东西来手动停止循环。
答案 1 :(得分:1)
您的newLevel()
方法在UI线程上完全运行,而Thread.sleep(2000);
正在等待您的UI线程每次迭代2秒。要添加这种延迟,您可以使用处理程序:
将Handler声明为成员类
final Handler mHandler = new Handler();
int i = 0;
并相应更改newLevel:
public void newLevel() {
mHandler.postDelayed(new Runnable(){
public void run() {
if (i > 10) {
mHandler.removeCallbacks(this);
return;
}
addSpeks();
i++;
mHandler.postDelayed(this, 2000);
}
}), 2000);
}
另一个optmization是将Runnable实例声明为最终成员,以便每次调用newLevel时都避免其实例化。检查拼写错误