@Override
public void run() {
while (running) {
update();
repaint();
try {
Thread.sleep(17);
} catch (InterruptedException ex) {
}
}
}
private void update() {
if (game != null && running == true) {
c.goTo(cities); // c is civilian
}
}
这是民用代码的一部分
private boolean set = true;
public void move(int x, int y) {
if (this.location.x != x || this.location.y != y) {
if (this.location.x > x) {
this.location.x -= 1;
} else {
this.location.x += 1;
}
if (this.location.y > y) {
this.location.y -= 1;
} else {
this.location.y += 1;
}
}
}
public void goTo(ArrayList<City> cities) {
City city;
if (set) {
city = cities.get(rand());
move(city.location.x, city.location.y);
set = false;
} else {
set = true;
}
}
public int rand() {
int i;
Random rand = new Random();
i = rand.nextInt(10);
return i;
}
如何解决?
答案 0 :(得分:0)
所以,你的问题就在这里:
while (running) {
update();
repaint();
try {
Thread.sleep(17);
} catch (InterruptedException ex) {
}
}
你每17毫秒调用一次更新,这反过来导致你的平民每17毫秒搬到一个新的城市。您可以创建一个单独的语句来调用update,而另一个布尔语句是false,这样您只有在他在城市时才会旅行。
例如:
boolean travelling = //whatever you go about to configure this
while(travelling == false){
update();
}
这将导致他只在不在城市时旅行。这是一些非常粗略的代码(您必须根据自己的喜好进行配置):
//civilian x //civilian y
if(this.location.x == //randomed city.x && this.location.y == //randomed city.y){
travelling = false;
}
这很可能需要在第一组代码中的run()
方法内,因此可以反复检查。但是,让我解释一下上面的代码在做什么:
首先,你有一个线程或其他东西让它继续检查你的平民的x和y是否与最近的randomed城市的x和y相对应,显然当他们是相同的时候,平民就在城市。
其次,当x和y相同时,语句使travelling
为假
第三,当travelling
为假时,会调用您的自定义update
方法,随机选择一个新城市并让您的平民重新开始行动。