Hello Stack Overflow人员:)
在编码方面,我是一个巨大的新手,而我只是遇到了一个问题,我的大脑刚刚赢了......
在我开始讨论这个问题之前,我会粘贴我的代码,以便提供一些上下文(如果看着它会让你想要呕吐,请提前抱歉)。该问题的主要焦点是评论,因此应该相当明显:
ArrayList<Individual> individuals = new ArrayList<Individual>();
void setup()
{
size(500,500);
for(int i = 0; i < 2; i++)
{
individuals.add(new Individual());
}
println(frameRate);
}
void draw()
{
background(230);
for(int i = 0; i < individuals.size(); i++)
{
individuals.get(i).move();
individuals.get(i).increaseTimers();
individuals.get(i).display();
}
}
class Individual
{
float x;
float y;
int size = 5;
Timer rdyBreed; /* Here is the object that appears to be shared
between individuals of the ArrayList */
float breedRate;
float breedLimit;
Individual()
{
x = random(0, width);
y = random(0, height);
rdyBreed = new Timer("rdyBreed", 0);
breedRate = random(.2, 3);
breedLimit = random(10, 20);
}
void move()
{
int i = (int)random(0, 1.999);
int j = (int)random(0, 1.999);
if (i == 0)
{
x = x + 1;
} else
{
x = x - 1;
}
if (j == 0)
{
y = y + 1;
} else
{
y = y - 1;
}
checkWalls();
}
void checkWalls()
{
if (x < size/2)
{
x = width - size/2;
}
if (x > width - size/2)
{
x = size/2;
}
if (y < size/2)
{
y = width - size/2;
}
if (y > width - size/2)
{
y = size/2;
}
}
void display()
{
noStroke();
if (!rdyBreed.finished)
{
fill(255, 0, 0);
} else
{
fill(0, 255, 0);
}
rect(x - size/2, y - size/2, size, size);
}
void increaseTimers()
{
updateBreedTimer();
}
void updateBreedTimer()
{
rdyBreed.increase(frameRate/1000);
rdyBreed.checkLimit(breedLimit);
rdyBreed.display(x, y);
}
}
class Timer
{
float t;
String name;
boolean finished = false;
Timer(String name, float t)
{
this.t = t;
this.name = name;
}
void increase(float step)
{
if (!finished)
{
t = t + step;
}
}
void checkLimit(float limit)
{
if (t >= limit)
{
t = 0;
finished = true;
}
}
void display(float x, float y)
{
textAlign(RIGHT);
textSize(12);
text(nf(t, 2, 1), x - 2, y - 2);
}
}
现在已经完成了,让我们回答我的问题。
基本上,我试图创造某种个人康威的生命游戏,而且我现在遇到了很多问题。
现在我写这段代码的想法是,每个人都组成了一个小型的模拟&#34;社会&#34;对于不同的生活事件会有不同的计时器和价值观,例如交配以生孩子。
问题是,我不是面向对象编程的巨大专家,因此我很不清楚为什么对象没有自己的Timer,但都是对同一个计时器的引用。
我猜想制作一个定时器的ArrayList并使用多态到我的优势可能会有所改变,但我并不确定它或者真的如何做到这一点......是的,我需要帮助。 / p>
提前致谢:)
编辑:这是调试器的屏幕截图。每次更新迭代时,值都保持不变。
答案 0 :(得分:1)
是什么让您认为他们引用相同的 计时器 对象?调试器中显示的 t 的值将相同,直到其中一个到达 breedLimit 并且设置为0,因为它们同时被初始化。 试试这个,看看 t 的值是different。
void setup() {
size(500,500);
}
void mouseClicked() {
individuals.add(new Individual());
}
我建议在这附近设置断点:
t = 0;
finished = true;
答案 1 :(得分:0)
他们不共享相同的计时器,您为每个new Timer
创建一个Individual
对象。
class Individual {
// ...
Timer rdyBreed;
Individual() {
// ...
rdyBreed = new Timer("rdyBreed", 0);
//...
他们分享相同Timer
的唯一方法是,如果您在其他地方设置rdyBreed
,但由于您不想要我建议final
。< / p>
如果您 希望在所有个人之间共享相同的Timer
个实例,那么您可以将其声明为static
。