【问题标题】:Objects sharing another object (Processing 3.3.7)对象共享另一个对象(处理 3.3.7)
【发布时间】:2018-04-18 20:01:02
【问题描述】:

大家好 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);
  }
}

既然已经完成了,让我们来回答我的问题。

基本上,我正在尝试创建某种个人的康威人生游戏,但我马上就遇到了很多问题。

现在我在编写这段代码时的想法是,组成小型模拟“社会”的每个人对于不同的生活事件都会有不同的计时器和价值观,例如交配生孩子。

问题是,我不是面向对象编程的专业人士,因此我对为什么对象没有各自的 Timer 而是对同一个计时器的引用一无所知。

我猜想制作一个计时器的 ArrayList 并利用多态性来发挥我的优势可以做出改变,但我并不确定它或真的如何做到这一点......是的,我需要帮助。

提前致谢:)

编辑:这是调试器的屏幕截图。这些值在每次更新迭代时保持相同。

Screenshot

【问题讨论】:

  • 你是说所有个体都在引用同一个 Timer 对象?
  • 是的,我忘了添加调试器的屏幕截图,但我现在就做,因为它清楚地表明两者都引用同一个 Timer 对象。
  • 是的,谢谢

标签: java object arraylist processing


【解决方案1】:

是什么让您认为它们引用了相同的 Timer 对象?在其中一个达到 breedLimit 和设置为 0,因为它们同时被初始化。 试试这个,看看 t 的值是different

void setup() {
  size(500,500);
}

void mouseClicked() {
  individuals.add(new Individual());
}

我建议在此处设置断点:

t = 0;
finished = true;

【讨论】:

  • 是的,大约 15 分钟前我已经准备好放弃这一天了,但在你发布它之前我意识到了这一点:') 无论如何,谢谢你的帮助,伙计
  • 没问题。乐于助人。
【解决方案2】:

它们不共享同一个计时器,您为每个 Individual 创建一个 new Timer 对象。

class Individual {
    // ...
    Timer rdyBreed;

    Individual() {
        // ...
        rdyBreed = new Timer("rdyBreed", 0);
    //...

他们可以共享相同Timer 的唯一方法是,如果您在其他地方设置rdyBreed,但由于您不希望这样做,我建议将其设置为final

如果您确实想在所有个人之间共享相同的Timer 实例,那么您可以声明它static

【讨论】:

  • 嗯...这是有道理的,这就是我通常会使用的,但在这种情况下,调试器和播放器似乎讲述了完全不同的故事。你试过运行它吗?颜色以一种非常奇怪的方式变化(与它们应该如何变化相比)。
  • 能够在所有人之间共享相同的计时器将使整个情况变得更容易,但问题是,因为我想创建“个人”,我希望他们有不同的比率成长、学习等等。
  • @Brynhildr 是的,我明白了。有人编辑了这个答案,认为最好也包括static 的解释,我想“为什么不”。我认为我没有足够的代码来运行它,请提供所有内容。缺少textAlign() 等。谢谢。
  • 我粘贴了所有内容 :') 您应该能够毫无问题地运行它(据说)。而且我看不到哪里缺少textAlign():c
  • textAlign() 是从哪里来的?不,我们错过了很多..
猜你喜欢
  • 2017-02-07
  • 2014-01-24
  • 2023-04-03
  • 1970-01-01
  • 2011-04-12
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多