共享另一个对象的对象(处理3.3.7)

时间:2018-04-18 20:01:03

标签: java object arraylist processing

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>

提前致谢:)

编辑:这是调试器的屏幕截图。每次更新迭代时,值都保持不变。

Screenshot

2 个答案:

答案 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