如何定期产生敌人

时间:2014-11-11 08:46:33

标签: java android spawning

我正在尝试创建一个游戏,让敌人随机生成并移向屏幕上的某个点。我的问题是程序等待它们产生并且它们开始移动它们。我希望他们在产生时开始移动并在每个之间进行短暂的休息。

以下是推动它们移动的两个主要方法:

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循环中有一个计数器,但我想最终将它移动到条件无限循环中,只有在你输掉游戏时它才会停止。

感谢您提供任何帮助,如果问题需要进一步澄清,请告诉我。

2 个答案:

答案 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时都避免其实例化。检查拼写错误