Java Schüsse programmieren?

3 Antworten

Du hast eine Klasse Projektil.

Du weißt ob das Projektil eingeschlagen hat oder nicht, das erkennst du daran dass die x_Achse den Bildschirmrand verlassen hat und du disposesd das Objekt.

Du generierst für jeden Schuss (Klick auf Maustaste) eine neues Projektil und die Logik wie es fliegen muss ist im Projektil integriert.

Also brauchst du nur feuern und überlässt die Entsprgung der Projektile der GarbageCollection.

Beispiel aus Actionscript:

package com.office4u.objects {
    import flash.display.MovieClip;
    public class projektil extends MovieClip {
//		private var updateCount:uint=1;
//		public var updateSpeed:uint=2;
		public var damage:Number=0.2;
		public var vY:uint=15;
		
		public function projektil() {
        }
		public function updateChild():void{		
//			if (updateCount++<updateSpeed||!updateSpeed) return;
//			updateCount=1;
			this.y-=vY;
		}
    }
}
Woher ich das weiß:eigene Erfahrung

Na, statt einem Schuss-Objekt, nimmst Du halt eine Liste von Schuss-Objekten:

List<Projectile> projectiles = new LinkedList<>();
projectiles.add(new Projectile());

Geschosse, die das Spielfeld verlassen, oder irgendwo "einschlagen" kannst Du dann einfach wieder aus der Liste entfernen.

projektives.remove(projectileToRemove);

Oder Du nimmst ein Array, aber ich würde eine Liste vorziehen, dann musst Du nicht mit dem Array Index "rum machen".

Gruß

Woher ich das weiß:Berufserfahrung
Lukiduki909 
Fragesteller
 23.05.2020, 21:20

Kannst du das mit der Liste noch einmal genauer ausführen, wie gesagt ich habe vor kurzem erst angefangen und weiß leider noch nicht genau wie ich das mit den Listen anstellen soll.

Aber trotzdem schon mal Danke

0
AldoradoXYZ  23.05.2020, 23:23
@Lukiduki909

Listen sind eine Datenstruktur. Anders als eine einfache Variable können hier mehrere Werte hinterlegt werden.

Du kannst solche Datenstrukturen auch selbst programmieren, was ich einem Anfänger sogar raten würde. Einfach, dass man eine Vorstellung davon hat was eine Liste ist. Hast Du mal selbst so eine Datenstruktur selbst implementiert, dann verstehst Du auch andere, nicht von dir implementierte, viel besser.

Für eine Liste hast Du eine Klasse, zum Beispiel Element.

Dieses Element hat zwei Member, einmal das, was Du in der Liste speichern willst, zum Beispiel einen String (mit Generics braucht man noch nicht anfangen) und dann, das Nachfolgeelement.

So kennt jedes Element seinen Nachfolger, bis es keinen mehr gibt.

public class Element {
    private String content;
    private Element nextElement;

    public Element getNextElement() {
        return nextElement;    
    }

    // dann noch Methoden um das nächste Element zu setzen und den content auszulesen 
}

Wenn Du nun das erste Element kennst, kannst Du über deine ganze Liste iterieren, indem Du nur nextElement auf jeden Folgeelement aufrufst.

Dazwischen holst Du dir noch den content raus und hast so Zugriff auf den ganzen Inhalt. In deinem Fall dann nicht Strings, sondern eben Geschosse. So kannst Du beliebig viele davon speichern.

Wenn Du eine eigene Liste implementiert hast, kannst Du natürlich auch fertige Listen benutzen (java.util.List), diese bieten viel mehr funktionalität und sind generisch, das heißt es ist völlig egal welchen Datentypen Du in der Liste speicherst - Geschosse rein, Geschosse raus.

List<Projectile> projectiles = new LinkedList<>();
projectiles.add(new Projectile());

Das wäre so eine verkettete Liste, die ich oben ganz primitiv beschrieben habe. Jedes Element der Liste kennt dort nur seinen Nachfolger. Für dich als Nutzer ist das aber egal, siehst Du auch am Typen vorne, das ist nur List. Völlig egal ob ArrayList, LinkedList Du benutzt das nur als List und kommst an alle Elemente. Wenn Du Elemente hinzufügst kümmert sich die Liste darum, dass alles korrekt funktioniert.

Dort liegt auch die Macht von Objektorientierung. Die Objekte kümmern sich selbst um ihren inneren Zustand. Du kannst sie einfach "blind" benutzen. So muss eine ArrayList evtl. das darunter liegende Array vergrößern um weitere Elemente hinzuzufügen. Du als Entwickler bekommst das gar nicht mit, Du fügst nur weitere Elemente hinzu.

Kannst ja mal so eine verkettete Liste implementieren. Dann noch Operationen wie Elemente mitten drin entfernen zum Beispiel, oder mitten drin einfügen.

Gruß

1
Lukiduki909 
Fragesteller
 24.05.2020, 11:57
@AldoradoXYZ

Also habs jetzt gemacht aber der Schuss beweget sich jetzt immer Schneller und ist immer noch nur ein einziger der sich zurücksetzt sobald ich erneut drücke.

0
AldoradoXYZ  24.05.2020, 11:58
@Lukiduki909

Nun, wenn Du drückst musst Du neue Schüsse der Liste hinzufügen.

Wenn Du deine Schüsse bewegst, musst Du die gesamte Liste einmal durchgehen und jeden enthaltenen Schuss bewegen.

Gruß

0
Lukiduki909 
Fragesteller
 24.05.2020, 12:03
@AldoradoXYZ

Wenn ich in meiner Key Handler Klasse Projectile.add(new Schuss()); eingebe, dann sagt er mir "Projektile cannot be resolved" und wenn ich Main.Projectile.add(new Schuss()); eingebe (also ich hab die Liste in meiner Main Klasse gespeichert) dann sagt er mir das gleiche.

0
AldoradoXYZ  24.05.2020, 12:12
@Lukiduki909

Projectile müsste dein Schuss sein. Eine Liste davon könntest Du projectiles oder projectileList nennen. (üblich wäre projectiles).

List<Projectile> projectiles = new LinkedList<Projectile>(); //als Member von Main
Projectile projectile = new Projectile(100,200); //oder wie immer Du deine Geschosse baust
projectiles.add(projectile);

Um über so eine Liste zu iterieren kannst Du einen Iterator verwenden:

ListIterator<String> iterator = projectiles.listIterator(); 

while (iterator.hasNext()) {
   Projectile projectile = iterator.next();
   projectile.move();
}

So ein Iterator liefert dir einfach jedes Element der Liste und merkt sich das jeweils letzte Element um dir das nächste geben zu können.

Alternativ kannst Du auch eine "erweiterte" For-Schleife benutzen:

for (Projectile projectile : projectiles) {
   projectile.move();
}

Hier wird intern auch mit einem Iterator gearbeitet, den siehst Du aber gar nicht erst. Die Schleife sorgt nur dafür, dass über die gesamte Liste (projectiles) iteriert wird und jedes Element der Variable projectile zugewiesen wird.

Gruß

0
Lukiduki909 
Fragesteller
 25.05.2020, 02:12
@AldoradoXYZ

Und wo muss ich die Sachen dann hin tun? Also den ersten Kasten in pack ich in eine Eigene Klasse und die Add Methode in den KeyHandler wenn ich das richtig verstanden habe. Aber wohin mit der For Schleife bzw. der Iteration?

0
AldoradoXYZ  25.05.2020, 10:50
@Lukiduki909

Na die for Schleife ist zum aktualisieren deiner Geschosse da.

Immer wenn Du deine Geschosse bewegen willst, rufst Du das auf. Du wirst ja bereits einen game loop haben, Du bewegst ja schon ein Geschoss. Statt nun eins zu bewegen, bewegst Du mit der for-Schleife alle.

Gruß

0
Lukiduki909 
Fragesteller
 25.05.2020, 23:52
@AldoradoXYZ

Also ich hab jetzt eine eigene Klasse für die Liste gemacht die add Methode in den KeyHandler geschrieben. Dann habe ich weil anders nichts geklappt hat auch die for-schleife in den KeyHandler geschrieben weil nichts anderes geklappt hat. Dann habe ich noch eine weitere Klasse für mein Projektil in der ich nichts gespeichert habe. Die For-Schleife "nutzt" einen Timer der ebenfalls in meiner Klasse Projektil ist und in dem die Bewegungsrichtung, Größe und der Startpunkt angegeben sind. Das heißt wenn ich auf die Taste drücke müsste eigentlich ein neues Objekt geaddet werder werden, welches dann von der for-schleife die Methode move, also das was in dem Timer steht zugewiesen bekommen. Jedoch setzt sich das Projektil immer noch bei jedem Schuss zurück und wird nun mit jedem mal immer Schneller und Schneller.


0
Lukiduki909 
Fragesteller
 25.05.2020, 23:57
@Lukiduki909

Also ich hab jetzt eine eigene Klasse für die Liste gemacht die add Methode in den KeyHandler geschrieben. Dann habe ich weil anders nichts geklappt hat auch die for-schleife in den KeyHandler geschrieben. Dann habe ich noch eine weitere Klasse für mein Projektil in der ich mein Projektil habe allerdings habe in meinem Projektil nichts gespeichert. Die For-Schleife "nutzt" einen Timer der ebenfalls in meiner Klasse Projektil ist und in dem die Bewegungsrichtung, Größe und der Startpunkt angegeben sind. Das heißt wenn ich auf die Taste drücke müsste eigentlich ein neues Projektil in die Liste geaddet werden, welches dann von der for-schleife die Methode move, also das was in dem Timer steht zugewiesen bekommt. Jedoch setzt sich das Projektil immer noch bei jedem Schuss zurück und wird nun mit jedem mal immer Schneller und Schneller.

0
Lukiduki909 
Fragesteller
 26.05.2020, 19:26
@AldoradoXYZ

Aber sonst kann ich das doch nicht in meine For schleife schreiben

0
AldoradoXYZ  26.05.2020, 20:27
@Lukiduki909

Warum muss der Timer in die For Schleife für die Geschosse?

HauptTimer vom Spiel der alle x ms den game loop ausführt
|--->  for schleife über alle geschosse
|               |----> Geschoss update
|
|---> andere Atkionen ausführen

Der Timer ist ganz weit oben im game loop

Gruß

0

Wenn zu jedem Zeitpunkt maximal ein Schuss existieren soll, dann darf ein neuer erst generiert werden, wenn der vorhandene gestorben ist. Ansonsten brauchst du ein Array/eine Liste für alle Schüsse, d.h. beim jedem Drücken der Schuss-Tastee muss ein neues Schuss-Item generiert und zur Liste hinzugefügt werden.

Woher ich das weiß:Studium / Ausbildung – Datenverarbeitungs-Kfm, Hobby- und Profi-Programmierer