我有关于绘制多个相同对象的问题。它们彼此重叠,它们的“对象值”甚至被加在一起,例如如果僵尸具有“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 这是问题的图像
当图像从图像线的输出中显示时:敌人在添加到阵列时会有不同的位置(5个不同的敌人)但是,如图所示,它仍然只显示一个 - 这是因为所有的突然,这些立场是一样的。我甚至试图在“DrawImage”中给出一个“随机位置”所有敌人仍然最终拥有相同的位置
希望你们能搞清楚。我当然很难 - 我通常不会在处理中工作谢谢
答案 0 :(得分:0)
DrSatan's comment是正确的。您只需向Enemy
添加一个EnemiesDatabase
。所以当你选择5个随机敌人时,你真的只是选择同一个敌人5次。
它们可能看起来在您的打印报表中有不同的位置,但这是因为您每次设置时都会打印出位置。你设置了五次,但只有最后一个位置真的算什么。
换句话说,您正在使用Enemy
的单个实例,在屏幕上移动5次,并且每次都打印出位置。但是当你绘制它时,只有你移动它的最后一个位置就是你所看到的。
您需要重构代码,以便为EnemyDatabase
添加更多敌人,但请注意,无论您EnemyDatabsae
中有多少敌人,您都会遇到类似的问题,因为您没有任何逻辑确保您不选择两次相同的实例。即使你的数据库中有100个敌人,也没有什么能阻止你的随机功能选择同一个敌人5次。
如果我是你,我会重新考虑我的设计。我根本没有看到单独的EnemyDatabase
课程的原因。也许只是创建一个函数,将X随机敌人添加到关卡中,其中X是参数?这取决于你,但你的根本问题是你只有一个Enemy
的实例。