Klassen Alle Unter-Objekte durchlaufen in der Hauptklasse

B

Bobo2040

Mitglied
Hallo, ich bin neu hier im Forum und auch was Java angeht. Ich habe eine kleine Klasse erstellt mit Unterklassen(Game -> SpaceShip(Spieler/Enemy)).
Ich möchte jetzt in der Klasse Game, alle existierenden Objekte der Klasse SpaceShip durchlaufen und gegebenenfalls dieses Objekt löschen.(Lebenspunkte <= 0)

Ich denke es ist relativ leicht zu lösen, leider weiß ich nicht wie. Hier mal mein Bisheriger Code:
Java:
//Class Game.java
package game;

public class Game{

    public static void main(String[] args) {
        Player player = new Player();
        Enemy enemy = new Enemy();
       
        player.setName("Spieler");
        player.setHp(1000);
       
        enemy.setName("Gegner");
        enemy.setHp(500);
       
        player.showStats();
        enemy.showStats();
       
        while(true) {
            deleteDeadPlayerAndEnemy();
        }
       
    }
   
    static void deleteDeadPlayerAndEnemy() {
        //Hier will ich alle Objekte überprüfen und anschließend ein Objekt löschen
        //wenn die .getHp() Methode des bestimmten Objektes einen Wert von 0 oder kleiner zurückgibt
    }
   
}


//Class SpaceShip.java
package game;

public class SpaceShip{
    private int hp,x,y,speed,damage;
    private String name;

    public void showStats() {
        System.out.println(this.name);
        System.out.println("X: " + this.x);
        System.out.println("Y: " + this.y);
        System.out.println("Speed: " + this.speed);
        System.out.println("Damage: " + this.damage);
        System.out.println("-----------------------------");
    }
   
    public void setX(int x) {
        this.x = x;
    }
    public int getX() {
        return this.x;
    }
    public void setY(int y) {
        this.y = y;
    }
    public int getY() {
        return this.y;
    }
    public void setSpeed(int speed) {
        this.speed = speed;
    }
    public int getSpeed() {
        return this.speed;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    public void setHp(int hp) {
        this.hp = hp;
    }
    public int getHp() {
        return this.hp;
    }
    public void setDamage(int damage) {
        this.damage = damage;
    }
    public int getDamage() {
        return this.damage;
    }
   
    public void moveLeft() {
        this.x = this.x - this.speed;
    }
    public void moveRight() {
        this.x = this.x + this.speed;
    }
    public void moveUp() {
        this.y = this.y + this.speed;
    }
    public void moveDown() {
        this.y = this.y - this.speed;
    }

    public void fightEnemy(Enemy enemy) {
        enemy.setHp(enemy.getHp() - this.damage);
        System.out.println("Gegner wird Attackiert" + enemy.getHp());
    }
    public void fightPlayer(Player player) {
        player.setHp(player.getHp() - this.damage);
        System.out.println("Spieler wird Attackiert" + player.getHp());
    }
}


//Class Player.java
package game;

class Player extends SpaceShip{
   
}
//Class Enemy.java
package game;

class Enemy extends SpaceShip{
   
}

Ich weiß nicht, ob das die eleganteste Lösung ist, wie ich das vorhabe.
Danke schonmal im Voraus. :)
 
J

Javinner

Top Contributor
@Bobo2040
Ich würde alle Objekte in einer Liste speichern und dann diese durchgehen und aussortieren.
Java:
public class Game
{

    public final static int NUMBER_OF_GAME_OBJECTS = 1000;
    public final static int LIFE_BORDER_FOR_EXAMPLE = 10;

    public static void main(String[] args)
    {

        List<GameObject> gameObjects = new ArrayList<>();
        for (int i = 0; i < NUMBER_OF_GAME_OBJECTS; i++)
        {
            gameObjects.add(new Player());
        }

        System.out.println(gameObjects.size());

        for (int i = 0; i < gameObjects.size(); i++)
        {
            if (gameObjects.get(i).getLifeCount() < LIFE_BORDER_FOR_EXAMPLE)
            {
                gameObjects.remove(i);
            }
        }

        System.out.println(gameObjects.size());
    }

}
/** Output */
1000
909
 
B

Bobo2040

Mitglied
Danke für die Antwort, ich habe das jetzt mal probiert. Jedoch bekomme ich den Fehler "Cannot find Symbol GameObject...". Ich denke mir fehlt da ein Import, jedoch wird mir dieser nicht bei Netbeans angezeigt. Im Internet habe ich auf die schnelle auch nicht gefunden was ich da Importieren muss. Wärst du so nett, mir das zu sagen, also wie der Import heißt?

EDIT:
Ich habs, GameObject ist nur der Klassenname, auf den sich das bezieht. In meinem Fall wäre das SpaceShip. Danke aufjedenfall! :)
 
Zuletzt bearbeitet:
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Java:
for (int i = 0; i < gameObjects.size(); i++)
        {
            if (gameObjects.get(i).getLifeCount() < LIFE_BORDER_FOR_EXAMPLE)
            {
                gameObjects.remove(i);
            }
        }
Damit überspringst du immer das Element, welches nach einem gelöschtem kommt ;)

Angenommen du löscht an Index 2, dann rutscht das, was vorher an Index 3 war, auf Index 2, als nächstes betrachtest du das an Index 3, und das was von 3 auf 2 gerutscht ist, wird ignoriert ;)
 
B

Bobo2040

Mitglied
Ja, so mehr oder weniger. Wie gesagt ich bin noch Anfänger und lerne gerade. Ich habe jetzt ein neues Problem und zwar wenn ich das aus der Liste gelöscht habe, dann kann ich trotzdem noch darauf zugreifen. Ist ja prinzipiell auch logisch, aber wie kann ich das bewerkstelligen, das es komplett weg ist? Oder sollte ich meine "ganze" Klassenstruktur so umbauen, das ich Daten abfrage/verarbeite und Methoden ausführe immer über die Liste mache?
Mir erscheint das es so nämlich ein größerer Rechenaufwand oder nicht?
 
J

Javinner

Top Contributor
Damit überspringst du immer das Element, welches nach einem gelöschtem kommt ;)

Angenommen du löscht an Index 2, dann rutscht das, was vorher an Index 3 war, auf Index 2, als nächstes betrachtest du das an Index 3, und das was von 3 auf 2 gerutscht ist, wird ignoriert ;)
Hm.. stimmt! Dann würde ich alle in Frage kommenden Objekte in einer internen Liste speichern und diese am Ende der Methode aus der Liste der bestehenden GameObjeke löschen. Man könnte aber auch i um eins zurücksetzen und weiter suchen.

Ich habe jetzt ein neues Problem und zwar wenn ich das aus der Liste gelöscht habe, dann kann ich trotzdem noch darauf zugreifen.
Es kommt darauf an: willst du dann darauf zugreifen, ist es in irgendeiner Weise wichtig?
 
B

Bobo2040

Mitglied
Nein, ich möchte ja das ich darauf nicht mehr zugreifen kann, da der Spieler/Gegner ja "tot" ist. Ich habe es jetzt so gelöst, das ich alles in GameObject Speicher und dann von dort aus die Daten abrufe um die Attribute zu bekommen. Das funktioniert auch soweit.
Ich habe jetzt jedoch ein neues Problem, im Internet habe ich ein Tutorial zu Graphics2D gefunden und erstmal abgetippt und etwas rumgespielt. Das funktioniert auch, ich hätte dazu noch eine Frage, und hoffe ihr könnt mir dabei behilflich sein.

Hier ist der Code aus dem Tutorial:
Java:
package spiel;

import javax.swing.JComponent;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.geom.*;


/**
*
* @author macbook
*/
public class Spiel extends JFrame {

    public static void main(String[] args) {
        Spiel spiel = new Spiel();
    }
  
    public Spiel() {
      
        this.setSize(500,500);
        this.setTitle("Spiel");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.add(new DrawStuff());
        this.setVisible(true);
      
    }
  
    private class DrawStuff extends JComponent {
        public void paint(Graphics g) { //hier ist das Problem
          
            Graphics2D graph = (Graphics2D)g;
          
            graph.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            Shape drawLine = new Line2D.Float(20,95,55,250);
            Shape drawKreis = new Arc2D.Float(100, 100, 50,50,0, 360, Arc2D.OPEN);
            Shape drawEllipse = new Ellipse2D.Float(10,10,100,100);
          
            GradientPaint theGradient = new GradientPaint(0,0, Color.BLACK, 1,30, Color.WHITE);
          
            graph.setPaint(theGradient);
            graph.fill(drawKreis);
            graph.draw(drawLine);
            graph.draw(drawKreis);
            graph.draw(drawEllipse);
          
          
        }
    } 
}
Ich verstehe nicht woher in der paint() Methode das Graphics g kommt, es wird auch nicht Initialisiert und auch nicht beim Aufruf der Klasse draw() übergeben. Es funktioniert aber trotzdem. Woher kommt das Graphics g und warum muss es nicht übergeben werden? und warum muss die paint() Methode nicht aufgerufen werden?
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Nein, ich möchte ja das ich darauf nicht mehr zugreifen kann, da der Spieler/Gegner ja "tot" ist. Ich habe es jetzt so gelöst, das ich alles in GameObject Speicher und dann von dort aus die Daten abrufe um die Attribute zu bekommen. Das funktioniert auch soweit.
Das entspricht doch dem Vorschlag von @Javinner?

Woher kommt das Graphics g und warum muss es nicht übergeben werden?
Das wird von Java selbst aufgerufen, das Graphics-Objekt gehört zu dem angezeigtem Fenster.
 
B

Bobo2040

Mitglied
Okay, ja entspricht es auch.
Wieso wird die Methode paint() dann aufgerufen, wenn ich ein neues Objekt von der Klasse draw erstelle?
Kennt jemand vielleicht ein gutes und vor allem ausführliches Tutorial für Graphics2D?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M alle Zahlen unter 50, die wo gteilt durch 2 Java Basics - Anfänger-Themen 12
B Programm, dass alle 3 Tage eine Webseite öffnet? Java Basics - Anfänger-Themen 20
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
J Alle Dateien aus einem Verzeichnis laden Java Basics - Anfänger-Themen 10
Bademeister007 Operatoren Alle Zahlen einer ArrayList die durch 5 teilbar ist Java Basics - Anfänger-Themen 2
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
crrnogorka Letzte Zeile einer Tabelle "überschreibt" alle anderen Zeilen Java Basics - Anfänger-Themen 1
C alle möglichen Kombinationen zweier Ziffern auf drei / vier / und 'n" Stellen Java Basics - Anfänger-Themen 11
H Alle Geraden zahlen bis 10 ausgeben Java Basics - Anfänger-Themen 11
L Alle Ziele in einem Raster abknallen Java Basics - Anfänger-Themen 17
J Alle Werte eines Strings zusammen addieren Java Basics - Anfänger-Themen 15
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
B Alle Links in einem Text suchen und ersetzen mit einem neuen Link Java Basics - Anfänger-Themen 18
K Array alle Werte aufsummieren und ausgeben Java Basics - Anfänger-Themen 6
Dimax Erste Schritte String replace alle Zeichen Java Basics - Anfänger-Themen 10
L Wie vergrößere ich ein Rechteck in alle Richtungen um eins und bekomme dessen Rand? Java Basics - Anfänger-Themen 2
L Breadth-First Search statt einem Pfad, alle Pfade herausfinden Java Basics - Anfänger-Themen 4
X Erste Schritte String: Alle doppelten Leerzeilen entfernen Java Basics - Anfänger-Themen 21
M Regex-Ausdruck: Alle Zeichen bis auf ein bestimmtes erlauben (p{L}) Java Basics - Anfänger-Themen 5
I Alle Elemente von zwei Listen vergleichen Java Basics - Anfänger-Themen 1
Kirby.exe Alle möglichen Error Möglichkeiten abfangen Java Basics - Anfänger-Themen 33
M Unterklasse soll nicht alle Methoden erben Java Basics - Anfänger-Themen 3
V Erste Schritte for-Schleife; Ausgabe soll alle 5 Sekunden erfolgen. Java Basics - Anfänger-Themen 4
A Alle true Werte eines boolean Arrays herausfiltern Java Basics - Anfänger-Themen 19
D Alle Möglichkeiten, n-Anzahl aus Elementen aus einem Array zu wählen, ausgeben? Java Basics - Anfänger-Themen 23
M prüfen ob alle array werte gleich sind Java Basics - Anfänger-Themen 27
F Alle Zeichenkombinationen eines Strings iterativ herausfinden Java Basics - Anfänger-Themen 26
L Classpath Alle Dateien im Classpath finden Java Basics - Anfänger-Themen 4
G Überprüfen ob alle Ziffern von 1-9 in einem Integer vorhanden sind Java Basics - Anfänger-Themen 6
J Erste Schritte Alle möglichen ausgaben von 5 Zahlen als Vector Java Basics - Anfänger-Themen 7
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8
D Methoden Eigene Methode um alle Ausgaben aufzurufen Java Basics - Anfänger-Themen 17
F Ordner auf alle Unterdatein abfragen Java Basics - Anfänger-Themen 3
A In einem String alle Eigennamen zählen Java Basics - Anfänger-Themen 6
W ArrayList löscht alle Elemente bis auf eines Java Basics - Anfänger-Themen 2
B Webservice -> alle parameter bekommen von form Java Basics - Anfänger-Themen 2
das_leon Alle Zeilen einer CSV-Datei auslesen Java Basics - Anfänger-Themen 1
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
F Eclipse alle Projekt weg Java Basics - Anfänger-Themen 6
V Alle Komponenten eines JPanels Java Basics - Anfänger-Themen 14
I gemeinsame Config-Datei für alle Windows-User Java Basics - Anfänger-Themen 5
H JButton - Wechsel der Textfarbe alle 500ms Java Basics - Anfänger-Themen 10
DaCrazyJavaExpert Alle Zahlenkombinationen aus 9 zahlen finden Java Basics - Anfänger-Themen 17
F Alle Objekte einer Klasse nach Eigenschaft durchsuchen Java Basics - Anfänger-Themen 8
M Alle Instanzen einer Klasse ansprechen Java Basics - Anfänger-Themen 4
S Problem: Array alle Einträge gleich Java Basics - Anfänger-Themen 10
Z Enter Taste alle 0,5 Sekunden ausführen Java Basics - Anfänger-Themen 1
U RegEx alle Kommas bei den Zahlen in Punkt umwandeln Java Basics - Anfänger-Themen 3
K alle Vorkommen einer bestimmten Ziffer in einer Zahl zählen Java Basics - Anfänger-Themen 2
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
C Alle Zweierpotenzen bis 2^10 ausgeben lassen Java Basics - Anfänger-Themen 15
B Alle Attribute von Klasse bekommen und ändern Java Basics - Anfänger-Themen 12
M Input/Output Alle Zeilen auslesen und in Variable speichern Java Basics - Anfänger-Themen 5
W Mozilla Thunderbird email an alle Kontakte Java Basics - Anfänger-Themen 3
F Methode alle 15min ausführen Java Basics - Anfänger-Themen 5
D Alle möglichen Kombinationen in einem Array ausgeben Java Basics - Anfänger-Themen 2
I Alle Laufwerke und deres Pfade ausgeben Java Basics - Anfänger-Themen 6
S Classpath: Alle .jars innerhalb eines Ordners einbinden Java Basics - Anfänger-Themen 4
G Alle Objekte und Variablen automatisch ausgeben Java Basics - Anfänger-Themen 7
I Programm, welches eine Textzeile einliest und alle darin enthaltenen Buchstaben umwandelt Java Basics - Anfänger-Themen 3
G Wie bekomme ich alle Ausgaben von runTime.exec() Java Basics - Anfänger-Themen 7
L Best Practice Alle Kombinationen aus Listenelementen, Anzahl Listen unterschiedlich Java Basics - Anfänger-Themen 6
M Compiler-Fehler Alle Methoden eines Interfaces Implementiert dennoch Fehler Java Basics - Anfänger-Themen 3
I Alle Zeitzonen in Liste speichern Java Basics - Anfänger-Themen 4
F alle 100ms Befehle ausführen Java Basics - Anfänger-Themen 26
M Alle Sublisten einer bestimmten Laenge berechnen Java Basics - Anfänger-Themen 2
F Alle DEMOS fast veraltet...? Java Basics - Anfänger-Themen 13
J Alle Leerzeichen aus String entfernen Java Basics - Anfänger-Themen 13
D Methoden Alle Siebenstelligen Primpalidrome von PI Java Basics - Anfänger-Themen 6
K Durch alle Attribute eines Objektes iterieren Java Basics - Anfänger-Themen 6
P Klassen Alle Strings einer ArrayList<eigeneKlasse> anspre Java Basics - Anfänger-Themen 2
W String von hinten alle drei Zeichen abschneiden und in umgekehrter Reihenfolge ausgeben. Java Basics - Anfänger-Themen 9
M Stürzen alle Rekursive Methoden irgendwann ab? Java Basics - Anfänger-Themen 11
M Alle möglichen Strings Java Basics - Anfänger-Themen 5
J Alle Wörter der Länge n mit 0 und 1 Java Basics - Anfänger-Themen 17
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
G Methoden Alle Objekte der ArrayList ausgeben funktioniert nicht. Java Basics - Anfänger-Themen 12
N Klassen Class nur einmal ausführen und sie speichert daten für alle anderen classes? Java Basics - Anfänger-Themen 3
M Klassen Auf Alle Array Methoden gleichzeitig zugreifen Java Basics - Anfänger-Themen 8
D Frame schließt gleich alle Frames Java Basics - Anfänger-Themen 5
T Wie mache ich einen Timer der alle 2 sekunden aufgerufen wird? Java Basics - Anfänger-Themen 5
D JFileChooser "alle Dateien" unterbinden Java Basics - Anfänger-Themen 3
S Aus zwei Dateipfaden alle Dateien auslesen Java Basics - Anfänger-Themen 11
B Frage zur Effizienz - alle Array-Felder initialisieren oder jedes Feld auf null prüfen? Java Basics - Anfänger-Themen 4
F Geht in alle Case rein, warum?? Java Basics - Anfänger-Themen 12
R Alle Klassen ermitteln, die Interface implementieren / Reflection Java Basics - Anfänger-Themen 51
M Primzahlen - es werden alle Nicht-Primzahlen ausgegeben Java Basics - Anfänger-Themen 5
L RandomAccessFile liest nicht alle Zeichen Java Basics - Anfänger-Themen 3
S Warten bis alle Threads fertig sind Java Basics - Anfänger-Themen 12
M Class will alle Variablen als static haben Java Basics - Anfänger-Themen 11
E Erste Schritte Eclipse kompiliert alle Projekte im Workspace Java Basics - Anfänger-Themen 10
J Alle Vorkommen eines chars in einem Array durch einen anderen char ersetzen Java Basics - Anfänger-Themen 10
S Alle 60min prüfen ob eine Datei da ist Java Basics - Anfänger-Themen 6
Dit_ Funktion alle 24 Stunden ein mal aufrufen Java Basics - Anfänger-Themen 3
Dit_ Input/Output Alle Exceptions protokollieren Java Basics - Anfänger-Themen 9
S Regex - alle Matches ausgeben? Java Basics - Anfänger-Themen 2
2 Alle Werte die mit n Würfeln mit m Seiten geworfen werden können in ein n Dimensionales Array Java Basics - Anfänger-Themen 15
B Alle Benutzer anzeigen Java Basics - Anfänger-Themen 17
S Suchmaske alle Möglichkeiten effinzent durchgehen Java Basics - Anfänger-Themen 4
R Kurze Linien alle x-Pixel Java Basics - Anfänger-Themen 2

Ähnliche Java Themen


Oben