2

我正在尝试创建一个游戏,其中敌人将随机生成并朝屏幕上的某个点移动。我的问题是程序等待它们产生并且它们开始移动它们。我希望它们在产卵时开始移动,并在它们之间稍作休息。

以下是使它们移动的两种主要方法:

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

感谢您的帮助,如果问题需要更多说明,请告诉我。

4

2 回答 2

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 秒运行一次,您还可以添加一个布尔值或类似的东西来手动停止循环。

于 2014-11-11T08:56:26.377 回答
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);
}

另一个优化是将 Runnable 实例声明为最终成员,以避免每次调用 newLevel 时它的安装。检查错字

于 2014-11-11T08:57:08.047 回答