Wasserstrahl animieren: ein Thread je Tropfen?

  • Themenstarter Themenstarter Deady1
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
D

Deady1

Gast
Hallo,
bin gerade bei der Konzeption eines neuen Spiels und möchte u.a. einen Wasserstrahl animieren.
Der Strahl schießt etwa 30 Sekunden lang und besteht aus ca. 300 einzelnen Tropfen.
Ausgangspunkt ist immer der Spieler, der Zielpunkt verschiebt sich jedoch permanent (MouseAction), so dass kein Auftreffpunkt und keine Flugbahn (ballistisch) der vorherigen gleicht.
Während des Spiels müssen zudem die Auftreffpunkte der einzelnen Tropfen ausgelesen und mit einer Matrix verglichen werden, um später so eine Art Trefferstatistik anzeigen zu können.

Meine Fragen: Sollte ich jeden einzelnen Tropfen in einem eigenen Thread laufen lassen? Müssen die Tropfen dazu in einer ArrayList vorgehalten werden oder gibt es etwas Näherliegendes? Worauf muss ich achten, um das Ganze performant hinzukriegen? Hat jemand schon mal etwas Ähnliches gebaut, so dass ich vielleicht abkupfern kann?

Vielen Dank für Eure Hilfe!
Deady
 
Deady1 hat gesagt.:
Meine Fragen: Sollte ich jeden einzelnen Tropfen in einem eigenen Thread laufen lassen?
Auf gar keinen Fall! 300 Threads! Das wäre absoluter Wahnsinn. Du speicherst die Tropfen einfach in irgendeiner Struktur, berechnest für einen nach dem anderen die neue Position und zeichnest dann. Wo kommt diese fehlgeleitete Threadaffinität hier im Forum her? Ich verstehe es nicht :autsch:
 
Was kommt am Ende dabei heraus, "Pinkelprinz - Das Spiel"?

Aber Egon hat Recht, 300 Threads sind Wahnsinn. Was sollten die auch die ganze Zeit über treiben?
 
... ja, ich glaube, der Name ist schon ganz nah dran. Ich will tatsächlich Fliegen "abschießen". "Lord of the Flies", oder so ...
Zum Üben, sozusagen. Gibts da vielleicht schon was in der Art?

schon mal danke vorab
Deady1
 
Hi,

also ein Spiel hat i.A. schon eine gewisse Komplexitaet, und wenn du es gut machen willst, brauchst du ein paar Ueberlegungen vorher.

Jedes Spiel besteht im Kern aus einem Mainloop:

Code:
while( isRunning() ) {
  processPhysic( getTimeDelta() );
  processUI();
  processAI();
  
  renderAll();
}

Das kannste jetzt z.B. schoen ObjektOrientiert in Klassen fuer jeden Vorgang packen und alles greift auf ein zentrales Model zu. Das wird von renderAll() dann auch genutzt um die Grafik in einem Rutsch zu malen.

processUI() verarbeitet Nutzereingaben. Dazu wuerde ich alle MouseEvents, KeyEvents, etc in eine Queue packen. Dabei kann auch gleich das Mapping von Eingabe (zb LMB pressed) -> Befehl (zb shoot) passieren (was dann auch konfigurierbar ist).

processAI() prinzipiell das gleiche wie UI nur kommen die Events vom Computergegner/Netzwerk/etc.

processPhysic( delta ) bewegt das Modell einen Zeitschritt weiter (uebergeben wird die Zeit seit dem letzten Aufruf --> gleiche Ablaufgeschwindigkeit wie unterschiedlichen Frameraten).

Tjo und renderAll() zeichnet alles. Z.b. auf ein Offscreen BufferedImage, welches von dem anzeigenden Panel mit einem anderen getauscht wird, wenn renderAll() fertig ist.

Also nix in Threads. Es sei denn du willst fuer Mehrprozessorsysteme optimieren, dann wird alles bissel komplizierter 🙂
 
Wow, vielen Dank!
Ich habe auch schon einiges an Gehirnschmalz investiert und mir die erforderlichen Abläufe, die benötigten Objekte und Methoden zurecht gelegt. Werde am Wochenende mal mit einem einfachen Modell beginnen, zunächst in 2D.
Ich hoffe, dass ich mit JBuilder2005 und J3D-Addin von der JDK-Seite her so halbwegs in die richtige Richtung laufe.

Nochmals Vielen Dank für die Hinweise!
Deady1
 
... interessanter Artikel ...,
... habe aber leider nur die Hälfte verstanden.

Habe nun die ersten knapp dreihundert Codezeilen geschrieben und ungefähr ein Dutzend Baustellen mit ungelösten Problemen. Wird wohl noch ein wenig dauern bis zur Beta von "Herr der Fliegen".
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben