JAVA / Processing - 实例化多个相同的对象 - 仅显示5个中的一个

时间:2017-12-02 18:22:01

标签: java processing

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

应该提到的是,相同类型的对象具有相同的“HashCode”。我也做了评论和println来帮助找出问题所在。 5个对象中的每一个都有不同的位置(设置时)。但是,它们会相互重叠并合并(移动)。

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);
  }
}

UPDATE 这是问题的图像

Image of problem

当图像从图像线的输出中显示时:敌人在添加到阵列时会有不同的位置(5个不同的敌人)但是,如图所示,它仍然只显示一个 - 这是因为所有的突然,这些立场是一样的。我甚至试图在“DrawImage”中给出一个“随机位置”所有敌人仍然最终拥有相同的位置

希望你们能搞清楚。我当然很难 - 我通常不会在处理中工作谢谢

1 个答案:

答案 0 :(得分:0)

DrSatan's comment是正确的。您只需向Enemy添加一个EnemiesDatabase。所以当你选择5个随机敌人时,你真的只是选择同一个敌人5次。

它们可能看起来在您的打印报表中有不同的位置,但这是因为您每次设置时都会打印出位置。你设置了五次,但只有最后一个位置真的算什么。

换句话说,您正在使用Enemy的单个实例,在屏幕上移动5次,并且每次都打印出位置。但是当你绘制它时,只有你移动它的最后一个位置就是你所看到的。

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

如果我是你,我会重新考虑我的设计。我根本没有看到单独的EnemyDatabase课程的原因。也许只是创建一个函数,将X随机敌人添加到关卡中,其中X是参数?这取决于你,但你的根本问题是你只有一个Enemy的实例。