# Gegner schiessen lassen



## .basti (2. Mrz 2022)

Hallo zusammen,
in meinem Spiel möchte ich jetzt meinen Gegner schiessen lassen. Prinzipiell sollen dafür alle 0,5 Sekunden drei neue Kugeln erzeugt werden und in unterschiedliche Richtungen geschossen werden. Der Vorgang soll also folgendermaßen ablaufen: Gegner schießt drei Kugeln in drei verschieden Richtung(nach links, links oben, oben) -> nach 0,5s soll er drei neue Kugeln schiessen, die in die selbe Richtung wie vorher fliegen.
Das einzige woran es scheitert ist, dass ich nicht weis wie ich nach der halben Sekunde drei neue Kugeln erzeugen kann. Meine Vermutung sind Arrays zu erzeugen von meiner Kugel Klasse aber damit kenn ich mich nicht gut aus und deswegen such ich hier Hilfe.
Hoffe das Problem ist zu verstehen
LG


----------



## Gelöschtes Mitglied 65838 (2. Mrz 2022)

wo bist du unterwegs.... javafx... swing ... konsole ... kartoffel.. ? ohne basics zu wissen was du überhaupt machst und wie kann dir niemand helfen

du hast das XY problem dargestellt


----------



## .basti (2. Mrz 2022)

Oke oke ich erklärs genauer. Ich hab ein JFrame und ein JPanel auf welchem mein ganzes Spiel abläuft. Ich zeichne alles auf mein JPanel mit paintComponent(). Meine Kugeln Zeichne ich einfach als kreise. Ich hab außerdem drei verschieden Methoden um die Schussrichtungen der Kugeln zu beschreiben:
[CODE lang="java" title="Schuss in x Richtung"]public void xSchuss() {
        x--;
    }[/CODE]
[CODE lang="java" title="Schuss in x und y Richtung"]public void xySchuss() {
        x--;
        y--;
    }[/CODE]
[CODE lang="java" title="Schuss in y Richtung"]public void ySchuss() {
        y--;
    }[/CODE]
Jeweils eine der drei abgeschossenen Kugeln erhält eben eine der drei Schussrichtungen zugewiesen.
Zu Beginn setze ich alle drei Kugeln auf die selbe StartPostion von welcher aus sie sich bewegen.
So viel zu meiner Klasse Kugel. Jetzt zur Gegner Klasse:
In dieser Klasse gibt es eine Methode schiessen() welche eine TimerTask enthält:
[CODE lang="java" title="schiessen Methode"]public void schiessen() {
        schiessen = true;
        TimerTask schuss = new TimerTask() {
            public void run() {
                schuss();
            }
        };
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(schuss, 0, 500);
    }[/CODE]
Die Variable schiessen ist hier eigentlich unwichtig die prüft einfach ob die Kugeln gezeichnet werden sollen oder nicht. Wenn true dann gezeichnet, wenn false eben nicht. Alle 500ms wird hier die Methode Schuss() ausgeführt:
[CODE lang="java" title="Schuss Methode"]public void schuss() {
        kugel1.xSchuss();
        kugel2.xySchuss();
        kugel3.ySchuss();
    }[/CODE]
Das ist aber nicht das was ich haben möchte. Ich möchte dass in meiner TimerTask alle 500ms drei neue Kugeln erzeugt werden, welche dann auch jeweils eine der drei Schussrichtungen zugewiesen bekommen. Jetzt also zu meiner Frage:
Wie kann ich alle 500ms drei neue Kugeln erzeugen? Arrays erzeugen? Wenn ja wie?


----------



## Gelöschtes Mitglied 65838 (2. Mrz 2022)

.basti hat gesagt.:


> Oke oke ich erklärs genauer. Ich hab ein JFrame und ein JPanel auf welchem mein ganzes Spiel abläuft.


die erklärung und die angaben waren wichtig und richtig, ich kann swing / awt nicht deswegen kann ich dir leidern nicht weiter helfen mit der genauen implementierung

ich weis es wie zb von unity und unreal 
hier kann man vektoren ( in dem fall 2D vektoren) benutzen um die Schussrichtung zu bestimmen
dh mit einem Vektor von (1,1) bewegt sich die kugel pro sekunde 1 in X richtung und 1 in Y Richtung, somit könntest du eine "richtung" implementieren => wenn zufalls richtugn dann halt mit zufalls zahlen


----------



## .basti (2. Mrz 2022)

oke kein Thema danke trotzdem. Die Richtung und alles funktioniert schon nur nicht die Erzeugung von neuen Kugeln. Weis da jemand weiter?


----------



## KonradN (2. Mrz 2022)

Eine mögliche Herangehensweise kann immer sein: Logik und Darstellung trennen.

Dann ist die Spiellogik frei implemenmtierbar und unabhängig von jeder Oberfläche. Hat den Vorteil, dass Du das Spiel einfacher portieren kannst (so lange Du die Abhängigkeiten alle hast, also z.B. die Sprache Java).

Und dann kann man etwas auf die Probleme eingehen:
a) "Arrays nutzen" ->x Arrays sind super, wenn man die Anzahl der Elemente genau kennt. Ansonsten sind z.B. Listen sinnvoller. Hier ggf. einfach einmal schauen, was für Collections Java so kennt incl. der Möglichkeiten und der Vor-/Nachteile.

b) Eine Sache immer wieder nach einer bestimmten Zeit machen. Das ist eine typische Anwendung für einen Timer. Der kann immer direkt alle x ms etwas machen. Hier gibt es teilweise spezielle Implementierungen von irgendwelchen Frameworks, aber java hat z.B. direkt den java.util.Timer, der verwendet werden kann. Eine andere Option kann ein Thread sein und da gibt es dann ggf. Thread.sleep Aufrufe. Speziell für kleine Wartezeiten kann das interessant sein.

c) Unter dem Strich sind das, was Du bisher beschrieben hast, relativ einfache Dinge. Du hast Kugeln, die Du z.b. in einer Liste vorhältst. Dann kann da regelmäßig z.B. durch einen Timer neue Kugeln hinzu kommen. Die Liste kann man dann durchgehen um die Kugeln z.B. regelmäßig zu bewegen. Bei jeder Bewegung kann eine Kollision geprüft werden u.s.w. Die Bewegung selbst kann dann z.B. über einen Vektor definiert sein (siehe andere Antwort). 

Hier stehen generell alle Türen und Tore offen. Generell wäre mein Ansatz aber immer, dass ich das Model als erstes definiere um dann erst darauf eine Oberfläche auf zu bauen.

Ich hoffe, das diese Anregungen etwas helfen können.


----------



## .basti (2. Mrz 2022)

Danke für die schnelle Antwort ich werde mir das mit dem Listen mal anschauen


----------

