2012-01-13 58 views
2

我正在编写一个太空入侵者克隆,我需要入侵者做他们平常的动作,但在再次移动之前暂停一秒。只有一部分的类等待执行,有或没有线程?

EG。移动5个像素,然后等待,然后再移动5个像素。

该方法调用moveInvaders()是我想等待1000ms的方法。下面是这样的方法。

private void moveInvaders() { 
     if(direction == "right") { 
     if(invaderGreenEight.getX() == 455 || invaderRedEight.getX() == 455 || invaderBlueEight.getX() == 455) { 
      direction = "left"; // Change direction to left 
     } 
    } else { 
     if(invaderGreenOne.getX() == 15 || invaderRedOne.getX() == 15 || invaderBlueOne.getX() == 15) { 
      direction = "right"; // Change direction to right 
     } 
    } 

    if(direction == "right") { 
     // Move Green Invaders Right 
     invaderGreenOne.moveX(1); 
     invaderGreenTwo.moveX(1); 
     invaderGreenThree.moveX(1); 
     invaderGreenFour.moveX(1); 
     invaderGreenFive.moveX(1); 
     invaderGreenSix.moveX(1); 
     invaderGreenSeven.moveX(1); 
     invaderGreenEight.moveX(1); 
     // Move Red Invaders Right 
     invaderRedOne.moveX(1); 
     invaderRedTwo.moveX(1); 
     invaderRedThree.moveX(1); 
     invaderRedFour.moveX(1); 
     invaderRedFive.moveX(1); 
     invaderRedSix.moveX(1); 
     invaderRedSeven.moveX(1); 
     invaderRedEight.moveX(1); 
     // Move Blue Invaders Right 
     invaderBlueOne.moveX(1); 
     invaderBlueTwo.moveX(1); 
     invaderBlueThree.moveX(1); 
     invaderBlueFour.moveX(1); 
     invaderBlueFive.moveX(1); 
     invaderBlueSix.moveX(1); 
     invaderBlueSeven.moveX(1); 
     invaderBlueEight.moveX(1); 
    } 
    if(direction == "left") { 
     // Move Green Invaders Left 
     invaderGreenOne.moveX(-1); 
     invaderGreenTwo.moveX(-1); 
     invaderGreenThree.moveX(-1); 
     invaderGreenFour.moveX(-1); 
     invaderGreenFive.moveX(-1); 
     invaderGreenSix.moveX(-1); 
     invaderGreenSeven.moveX(-1); 
     invaderGreenEight.moveX(-1); 
     // Move Red Invaders Right 
     invaderRedOne.moveX(-1); 
     invaderRedTwo.moveX(-1); 
     invaderRedThree.moveX(-1); 
     invaderRedFour.moveX(-1); 
     invaderRedFive.moveX(-1); 
     invaderRedSix.moveX(-1); 
     invaderRedSeven.moveX(-1); 
     invaderRedEight.moveX(-1); 
     // Move Blue Invaders Right 
     invaderBlueOne.moveX(-1); 
     invaderBlueTwo.moveX(-1); 
     invaderBlueThree.moveX(-1); 
     invaderBlueFour.moveX(-1); 
     invaderBlueFive.moveX(-1); 
     invaderBlueSix.moveX(-1); 
     invaderBlueSeven.moveX(-1); 
     invaderBlueEight.moveX(-1); 
    } 
} 

游戏已经是一个线程和所讨论的方法是在同一类,所以发出的Thread.sleep(1000);只是暂停整个游戏1秒,但我只想执行一种方法暂停。

如果您想了解更多信息,我很乐意提供。

盖斯特

+0

不,您可能不需要直接创建单独的独立线程。请提供更多信息和一些代码。 – 2012-01-13 14:09:24

+0

见编辑回答。 – 2012-01-13 14:26:05

回答

2

moveInvaders()方法应该跟踪其存储入侵者上次移动的时间的成员变量的(例如,作为long毫秒数),这样一来,它被称为它可以检查该变量的值的任何时间 - 如果足够的时间过去了,那么入侵者可以移动,如果没有,那么该方法将简单地返回而不做任何事情。例如:

protected long invadersLastMovedMillis; 

protected void moveInvaders() { 
    long currentTime = System.currentTimeMillis(); 
    if ((invadersLastMovedMillis != 0) 
     && ((currentTime - invadersLastMovedMillis) < 1000L)) { 
    return; // No need to move them yet. 
    } 
    // March on, space invaders! 
    invadersLastMovedMillis = currentTime; 
} 

您不希望实际上导致线程进入睡眠状态,因为游戏会变得无法响应!

+0

因此,每次调用moveInvaders()方法时,它会如何检查自上次移动以来的时间?我会在每次执行时使用'for'循环来增加吗?但是由于处理器速度越来越快,这会带来性能问题。嗯。 – 2012-01-13 14:12:58

+0

@GeissT:每次移动入侵者时都会以毫秒为单位更新当前时间的变量;那么您可以在每次考虑移动它们以查看是否已经过了足够的时间之前检查该变量。查看更新的答案。 – maerics 2012-01-13 14:14:01

+0

啊我看到了,你的编辑很好地解释了它。我会做一个测试并报告回去...... – 2012-01-13 14:23:00

1

我猜你会使用某种类型的计时器,但将取决于还不知道我们的许多问题什么样的。你使用的是什么GUI库?例如,如果这是一个Swing GUI,我建议使用Swing Timer来处理这个延迟 - 但是我们不知道你使用了什么库。

底线:请提供更多信息和代码。

编辑: 第一个建议:摆脱所有if(myString ==“Foo”)。你不应该这样比较字符串,因为这会检查一个字符串对象是否是一个字符串对象,并且你不关心这个。你想知道他们是否有相同的内容。请使用String#equals(...)或String#equalsIgnoreCase(...)方法。

接下来:使用数组来减少严重的代码冗余存在。

最后对于Swing应用程序,考虑使用摆动计时器来驱动您的游戏循环,并在计时器中通知收听时间滴答的项目。然后让这些项目在自上次操作后经过一定时间后才会响应。

+0

我正在使用Swing,气垫船。 – 2012-01-13 14:13:27

+0

@GeissT:如果我们有半数的祷告能够回答这个问题或其他类似的问题,你真的想告诉我们细节。总是写下你的问题,假设我们无法读懂你的想法或神奇地看到你的代码。我想你会想编辑你的原始问题并提供更多的细节。 – 2012-01-13 14:15:00

+0

我会为你提供我的moveInvaders()方法。 – 2012-01-13 14:17:22

0

在创建游戏线程的同一级别创建另一个线程(比如T1)。

在游戏线程完全创建后启动它,或者在没有任何崩溃的情况下调用moveInvaders()方法。

ASA游戏线程结束,也停止T1。

游戏已经是一个线程和所讨论的方法是在同一类,所以发出的Thread.sleep(1000);只暂停1秒整个游戏,但我只想一个的方法来执行暂停。

问题是有一个类,一个对象,只有一个线程执行。它应该是一个类,一个对象和两个线程。 (游戏线程和T1)

+0

谢谢你的回答,我选择了另一位用户的回答,但我一定会考虑到这一点! :) – 2012-01-13 14:28:15