# Grundlage für ein 2D-Spiel



## Nova (24. Apr 2005)

Hallo,

Ich habe mich schon etwas durchs Forum gewühlt aber nichts passendes gefunden...


Ich programmiere seit 1 Semester Java an der Uni.
Da es aber keinen "Fortsetzungskurs" gibt (wir haben z.B. graphische Oberflächen nur noch in der letzten Vorlesung angeschnitten) und um in Übung zu bleiben habe ich beschlossen ein Spiel in Java zu programmieren.

Es handelt sich um ein Spiel mit 2 Flugzeugen die rumfliegen und sich gegenseitig bekämpfen (später eventuell mit KI damit man auch alleine spielen kann, Flak-Batterien usw.).

Momentan ist es so gelöst:
Alles spielt sich in einem JFrame ab. Dieses Fenster ist derzeit 1000x600 Pixel groß.
Es gibt eine Matrix (2-dimensionales Array) mit 1000 auf 600 Feldern in denen der "Wert" jedes Pixels gespeichert wird (z.B. 0 heißt leer, 1-1.000 Landschaft, 10.000-19.999 Flugzeug 1 und dessen Geschosse, 20.000-29.999 Flugzeug 2 und dessen Geschosse.
Gesteuert durch einen Timer wird nun z.B. alle 20ms ein neues Bild berechnet, die Flugzeuge und Geschosse werden entfernt (weiß übermalt und Matrix-Wert auf 0 gesetzt) die neue Position berechnet und anhand der Matrix-Werte getestet ob an dieser Position etwas "im Weg" ist (z.B. Flugzeug fliegt gegen die Landschaft) und ggf. darauf reagiert.

Ich könnte auch das komplette Bild löschen und anhand der Matrixwerte neu malen, das habe ich aber aus Performance-Gründen (für jedes Bild müssen alle 600.000 Pixel gemal werden)und weil es geflackert hat aufgegeben.

Wenn ich ein Flugzeug male, berechne ich je nach Flugrichtung die Position jedes einzelnen Pixels (mittlerweile werden aus Performance-Gründen alle 360 Möglichen Richtungen vorab berechnet).
Es hat mich bisher schon ca.70 Stunden gekostet und ich habe 3 mal komplett neu angefangen weil es entweder zu kompliziert wurde oder die Performance zu schlecht war. 
Die ersten Versuche hatten >4000 Zeilen Code mit schlechterer Graphik (nur 4x4 Pixel große "Pixel-Kästchen") und waren am Limit des Rechners (750MHz), die aktuelle Version hat momentan "nur" ca.1000 Zeilen Code, ist viel übersichtlicher, besser erweiterbar, zeichnet Pixelgenau und hat nur 1/5 der CPU-Belastung.
Ich habe also schon große Fortschritte gemacht, trotzdem gefällt es mir nicht so richtig.

Momentane Probleme:
- Die Flugzeuge und Geschosse flackern weil sie gelöscht und teilweise auf derselben Position (oder überlappend) neu gemalt werden.
- Ich möchte das "Spielfeld" vergrößern: Splitscreen und die 2 Teile mit z.B. 3000x3000 Pixeln (wobei immer nur 500x600 sichtbar sind) zentrieren sich dann immer auf das Flugzeug. dabei verändert sich aber auch die Landschaft, die Geschosse etc. was bedeuted das ich den ganzen Mist löschen (weiß übermalen) und neu malen muss, und das bei jedem Bild (denn das Flugzeug bewegt sich ja immer und somit durch die Zentrierung auch die Landschaft).


Das muss doch irgendwie einfacher gehen?
Wie würdet ihr das machen?


mfg
Christian


----------



## Wildcard (24. Apr 2005)

Nova hat gesagt.:
			
		

> Wenn ich ein Flugzeug male, berechne ich je nach Flugrichtung die Position jedes einzelnen Pixels (mittlerweile werden aus Performance-Gründen alle 360 Möglichen Richtungen vorab berechnet).


Also mindestens das Fleugzeug sollte (alleine der Optik wegen) ein Image sein das du einfach nur drehst.



			
				Nova hat gesagt.:
			
		

> - Die Flugzeuge und Geschosse flackern weil sie gelöscht und teilweise auf derselben Position (oder überlappend) neu gemalt werden.


Benutzt du auch doubleBuffering?


----------



## Nova (25. Apr 2005)

Hallo,

Wie erstelle ich denn ein solches Image? Darf ja nicht rechteckig sein sondern nur genauso groß wie das Flugzeug.


Wie kann ich denn doubleBuffering verwenden?



mfg
Christian


----------



## Memphis (25. Apr 2005)

Nova du kannst ein BIld an bestimmten stellen transparent machen sowas geht z.B. mit Photoshop und zu doubleBuffering such es einfach im Forum da findeste schon was!


----------



## KSG9|sebastian (25. Apr 2005)

double-buffering heist, dass du das bild auf nen ImageBuffer zeichnest und den ImageBuffer dann auf's Frame


----------



## Nova (26. Apr 2005)

Hallo,

Wie kann ich denn die Kollisionsabfrage machen wenn ich ein Bild verwende? Momentan wird ja immer ein Wert in die Matrix geschrieben wenn z.B. sich das Flugzeug gerade dort befindet. Wie mache ich das wenn ich ein Bild verwende?

Ich werde mir das mit dem doubleBuffering mal ansehen.


mfg
Christian


----------

