Um Java zu lernen, mache ich ein klassisches "Fly Around in Space" 2D-Spiel. Neben dem Spielerobjekt existieren zahlreiche Feinde/Hindernisse (Aasfresser, Jäger, Kometen, Asteroiden) mit jeweils einer eigenen Klasse, die eine GameObject-Klasse erweitert. Da es mehrere Aasfresser, Kometen usw. geben kann, werden diese in Arraylisten gespeichert. Da jedes Objekt jedoch miteinander interagieren kann, gibt es eine Menge von Schleifen und doppeltem Code, um beispielsweise jedes Alien entsprechend den Objekten in der Komet-Arraylist, der Asteroid-Arrayliste usw. interagieren zu lassen.Spieledesign: Organisieren Objekt Arraylists
In meiner Spiel-Update-Funktion habe ich:
public void update() {
ArrayList<Rock> rockList = rock.getRockList();
ArrayList<Scavenger> scavengerList = scavenger.getScavengerList();
ArrayList<Hunter> hunterList = hunter.getHunterList();
....
npc.update(player, scavengerList, hunterList, rockList);
...
}
und in meiner NPC-Klasse (die die Gameobject-Klasse erweitert)
public void update(Player player, ArrayList<Scavenger> scavengerList, ArrayList<Hunter> hunterList, ArrayList<Rock> rockList) {
for(int i = 0; i < scavengerList.size(); i++) {
scavengerList.get(i).update(player,scavengerList, ,hunterList rockList);
}
for(int i = 0; i < hunterList.size(); i++) {
hunterList.get(i).update(player,scavengerList, hunterList, rockList);
}
...
}
Und schließlich habe ich eine Update-Funktion in meiner Scavenger-Klasse, meiner Jägerklasse usw. wie
public class Hunter extends NPC{
...
public void update(Player player,ArrayList<Scavenger> scavengerList, ArrayList<Hunter> hunterList, ArrayList<Rock> rockList) {
"update all hunter objects according to the player, scavengers, rocks etc"
}
Dieser Ansatz scheint ziemlich umständlich zu sein und wenn mehr Klassen erstellt werden, geraten die Anzahl oder die Arraylisten, die geparst und durchgeschleift werden müssen, außer Kontrolle. Kann jemand einen besseren Weg empfehlen, dies zu tun? Ich denke, der naheliegende Weg wäre, eine Liste zu haben, die alle NPC-Objekte enthält und dann ihren Klassentyp zu verfolgen und entsprechend zu aktualisieren. Ist das ein besserer Weg, oder kann mir jemand in die richtige Richtung zeigen?
Wäre es nicht einfacher, eine "World" -Instanz zu übergeben? Sie könnten grundsätzlich 'for (updatableThing: updatableThings) {updatableThing.update (world); } ' – plalx
Vielleicht verstehe ich nicht vollständig (noch lernen), aber diese World-Instanz würde immer noch eine Liste halten, die alle Objekte richtig enthält oder aktualisiert oder ich etwas falsch verstehe? – user2913053