JAVA/Processing—实例化多个相同对象—只显示五分之一

JAVA/Processing—实例化多个相同对象—只显示五分之一,java,processing,Java,Processing,我在绘制多个相同对象时遇到问题。它们彼此重叠,它们的“对象值”甚至被加在一起,例如,如果一个僵尸有“2”移动值,并且在当前关卡中添加了2。然后当僵尸移动时,他们每个移动“4”。如果移动两个不同的对象,例如僵尸和龙,则不会发生这种情况。我已经基于我的项目创建了以下代码-为了更简单的概述。但是,行为是一样的 应该提到的是,相同类型的对象具有相同的“HashCode”。我也发表了评论和println来帮助解决这个问题。5个对象中的每一个都有不同的位置(设置时)。但是,它们彼此重叠渲染并合并(移动) E

我在绘制多个相同对象时遇到问题。它们彼此重叠,它们的“对象值”甚至被加在一起,例如,如果一个僵尸有“2”移动值,并且在当前关卡中添加了2。然后当僵尸移动时,他们每个移动“4”。如果移动两个不同的对象,例如僵尸和龙,则不会发生这种情况。我已经基于我的项目创建了以下代码-为了更简单的概述。但是,行为是一样的

应该提到的是,相同类型的对象具有相同的“HashCode”。我也发表了评论和println来帮助解决这个问题。5个对象中的每一个都有不同的位置(设置时)。但是,它们彼此重叠渲染并合并(移动)

EnemyDatabase EnemyDatabase;
ArrayList-enemiesInlevel=新建ArrayList();
无效设置()
{
大小(600600);
enemyDatabase=新的enemyDatabase();
添加(新敌人(“僵尸”,3));
//如果添加了龙,那么它可以同时绘制二者,但只能绘制一次
//enemyDatabase.friends.add(新敌人(“龙”,10));
//添加10个僵尸到关卡
对于(int i=0;i<5;i++)
{
//创建了5个僵尸,并成功地将其添加到数据库中
add(enemyDatabase.friends.get((int)random(0,enemyDatabase.friends.size());;
}
for(int i=0;i是正确的。你只在你的
敌人数据库中添加了一个
敌人。所以当你随机选择5个敌人时,你实际上只选择了5次相同的敌人

在你的打印语句中,它们可能有不同的位置,但那是因为你每次设置位置都要打印出来。你设置了五次,但只有最后一个位置才有意义

换言之,你只需要取一个敌人的例子,在屏幕上移动它5次,每次都打印出它的位置。但是当你画它的时候,你看到的只是你移动到的最后一个位置

您需要重构代码,以便向
EnemyDatabase
添加更多敌人,但请注意,无论
EnemyDatabase中有多少敌人,您都会遇到类似的问题,因为您没有任何逻辑确保您不会两次选择同一实例。即使您的da中有100个敌人tabase,没有什么能阻止你的随机函数选择同一个敌人5次


如果我是你,我会重新考虑我的设计。我真的不认为有单独的
EnemyDatabase
类的理由。也许只需要创建一个函数,将X个随机敌人添加到级别,其中X是一个参数?这取决于你,但你的根本问题是你只有一个
敌人
的实例uestion非常模糊,可以从显示更多代码中获益,但在黑暗中随机插入将是:
enemiesInlevel.add(enemyDatabase.friends.get((int)random(0,enemyDatabase.friends.size()));
在这一行,可能是您将同一对象添加到数组中5次,导致您在尝试设置其属性时设置其/all/属性。这就是全部代码。为了澄清“当我根据“敌方对象”将敌方添加到敌方列表时”它们有独特的位置。但是,当绘制它们时,它们有相同的位置。这是一张问题的图像,正如图像行中输出的图像所示:当添加到arra时,敌人有不同的位置y(5个不同的敌人)但是,如图所示,它仍然只显示一个敌人-这是因为突然之间位置是相同的。我甚至尝试在“DrawImage”中给出一个“随机位置”所有的敌人最终仍然拥有相同的位置。我可能在这里扮演魔鬼代言人,但是你是否测试过你的
random
方法,看它在每次调用时是否返回相同的值?是的,它返回随机数。我最近在原始帖子中附加了一个显示随机位置的图像但一旦使用“Draw”方法,位置是相同的。这就像渲染后对象合并在一起一样。啊,谢谢澄清。我最终保留了数据库,这样我可以在开始时添加多个不同的敌人类型,然后在我需要它们时在特定的位置复制它们。现在效果很好。
EnemyDatabase enemyDatabase;
ArrayList<Enemy> enemiesInlevel = new ArrayList<Enemy>();

void setup()
{
  size(600, 600);
  enemyDatabase = new EnemyDatabase();

  enemyDatabase.enemies.add(new Enemy("Zombie", 3));

  //If dragon is added - Then it can draw both - But only once
  //enemyDatabase.enemies.add(new Enemy("Dragon", 10));

  //Add 10 zombies to the level
  for(int i=0; i< 5;i++)
  {
    //5 Zombies are created and succesfully added to the database
    enemiesInlevel.add(enemyDatabase.enemies.get((int)random(0, enemyDatabase.enemies.size())));;    
  }

  for(int i=0; i<enemiesInlevel.size();i++)
  {
    //Sets the position of all 5 - Gives random position
    Enemy enemy = enemiesInlevel.get(i);
    enemy.SetPosition();
  }
}

void draw()
{
   background(255, 200, 0);

   //Draw 5 enemies - Of index 0 (Zombie)
   for(int i=0; i<enemiesInlevel.size();i++)
   {
     Enemy tempEnemy = enemiesInlevel.get(i);
     tempEnemy.draw();
     //It runs 5 times - print returns 5 total objects in enemiesInlevel
   }
}

class EnemyDatabase
{
  ArrayList<Enemy> enemies = new ArrayList<Enemy>();
}

class Enemy
{
  String enemyName;
  int enemyHealth;
  PVector enemyPosition;

  public Enemy(String name, int hp)
  {
    enemyName = name;
    enemyHealth = hp;
  }

  public void SetPosition()
  {
    enemyPosition = new PVector(random(0, width), random(0, height));
    //Each of the objects has a random position
    println(enemyPosition);
  }

  public void draw()
  {
    rect(enemyPosition.x, enemyPosition.y, 25, 25);
  }
}