# Jump and Run etwas komplizierter - Benötige Starthilfe



## Arcus (10. Jul 2011)

*Info zu meinem Java-Kenntnissstand*

Zunächstmal sollte ich erwähnen, dass ich Java gerade mal ein Jahr lang "praktiziere". Ich bin in der Schule in den Informatikkurs geangen, weil ich keine Lust mehr auf Lego-Roboter und Co. hatte (die ich zuletzt mit VisualBasic programmiert hab). Naja wie auch immer: In der schule fingen wir mit Java an und ich hab mich supi zurecht gefunden, aber man sollte erwähnen: Man fliegt nur drüber und geht nicht tiefer als unbedingt notwendig. Am Ende des Schuljahres haben wir uns in Gruppen aufgeteilt und sollten eigenständig lernen und Projekte  entweder zum Thema "Graphic" oder zum Thema "Netzwerk" erstellen. Ich muss relativ stolz dazu sagen, dass ich dafür einen Pong-Clon geschrieben habe, mit mehspieler-Modus, KI und allem was dazugehört. Hab für dieses Schuljahr 15 Punkte bekommen, was im normalen Notensystem ne 1+ ist. Trotzdem bin ich nur ein Einsteiger.
_Anmerkung: Ich habe ein bin auf das Forum gestoßen, hab ein bisschen herumgestöbert und durfte feststellen, dass mein Pong-Clon vom Quellcode her eigentlich totaler Mist ist..._

*Jetzt aber endlich zu meiner Idee*

Ich hab jetzt hier schon öfter mal Mario-Clone gesehen und kam dann auf die Idee, selbst ein Jump 'n' Run Spiel zu schreiben. Bei Mir soll das ganze am Ende weit komplexer sein, aber die Grundidee und damit auch die Engine sollten relativ gleich sein. Um etwas genauer zu werden möchte ich ein Spiel im Stil von Castlevania programmieren. Man könnte es auch Klon nennen, ist relativ nebensächlich. Und hierbei stellt sich mir jetzt allerdings die Frage: Womit muss ich anfangen und wie fange ich das an?

*Frage 1:*
Was ist für ein solches Spiel besser: Swing oder Java2D? Meinen Pong-Clon habe ich mit JPanels und Co. zusammengebastelt, aber irgendwo habe ich gelesen, dass für komplexxere Dinge Java2D besser wäre. Ich habe keinerlei Erfahrung mit Java2D, bin aber durchaus fähig die API zu lesen und es zu lernen, falls nötig.

*Frage 2:*
Wie gestaltet sich so eine Spielengine und die Spielfläche? Hier mal eine Liste mit Fragen die damit zusammenhängen:

- Das Spiel soll in ein Fenster, ist das Fenster die ausführende Engine oder ist die Engine eine eigene Klasse, die in dem Fenster nur ausgeführt wird?
- Logischerweise soll ein Hauptmenu existieren. Soll das Hauptmenu auch in einer Klasse, die runnable() implementiert hat enthalten sein oder soll vom Hauptmenu erst das eigentliche Spiel gestartet werden (wo dann logischerweise auch runnable läuft, oder ähnliches)?
-Die Welt. Ich möchte die Spielwelt in Räume aufteilen, wobei immer nur die benachbarten geladen werden um nicht die gesammte Welt zu laden (Performance etc.). Man könnte für diese Räume eine Mutterklasse erstellen und dann jeden Raum als Klasse erben lassen, wie kann ich diese Räume dann aufrufen und bereithalten und dann auch wieder entfernen, wenn sie nicht mehr gebraucht werden?
-Wie bringe ich Gravitation ins Spiel? Soll ich einfach die Formel nehmen und angleichen und bei einem Sprung eine vertikale Geschwindigkeit ne oben setzen? Funktioniert das oder ist es komplizierter?
-Kollisionerkennung ist noch so ein Problem. Allgemein hab ich das verstanden, bei meinem Pong wurde bei jeder Zeiteinheit von der while-Schleife in der run()-Methode abgefragt, wo sich was befindet und ob es überlappt. Geht das auch anders? Kann man eine Kollision auch erst dann abfragen wenn sie stattfindet? Und wenn ja, wie?

Zum Thema Grafik werd ich mal noch nichts weiter an Fragen stellen (Bilder von Charakteren und Landschaften einbeziehen etc.), da für mich erstmal im Vordergrund steht das irgendwas läuft, von mir aus ein schwarzes Rechteck in einer grauen Welt...

Um nochmal zu verdeutlichen, wie ich das meine: Ich möchte die Engine etc. möglichst so aufgebaut haben, dass ich möglihst leicht Dinge hinzufügen und enfernen kann, ohne später in allen möglich Klassen für jedes Objekt nochmal irgendwo Code einfügen zu müssen.

Ich weiß, dass ich hier ein schweres Thema mit vielen Fragen angefangen habe. Ich hoffe ihr könnt mir helfen, oder mir Links geben, auf die ich bisher noch nicht gestoßen bin, wobei mir ersteres lieber wäre.

mfG.
Arcus

PS: Verwendet von mir aus tiefste fachsprache, aber erklät die auch ein bisschen, damit ich die auch so langsam mal besser lerne. Wäre schön :toll:


----------



## Cola_Colin (10. Jul 2011)

Arcus hat gesagt.:


> *Frage 1:*
> Was ist für ein solches Spiel besser: Swing oder Java2D? Meinen Pong-Clon habe ich mit JPanels und Co. zusammengebastelt, aber irgendwo habe ich gelesen, dass für komplexxere Dinge Java2D besser wäre. Ich habe keinerlei Erfahrung mit Java2D, bin aber durchaus fähig die API zu lesen und es zu lernen, falls nötig.


Java2D


> - Das Spiel soll in ein Fenster, ist das Fenster die ausführende Engine oder ist die Engine eine eigene Klasse, die in dem Fenster nur ausgeführt wird?


Trennung von Spiellogik und GUI durchziehen, die Engine ist ganz klar eine eigene Klasse.
Allgemein sollten Klassen eher klein gehalten werden, ein Leitsatz kann sein, dass jede Klasse nur eine Aufgabe haben soll und bei der Beischreibung der Klasse Wörter wie "und" nicht vorkommen müssen.
Das Fenster an sich ist schon eine Aufgabe.



> - Logischerweise soll ein Hauptmenu existieren. Soll das Hauptmenu auch in einer Klasse, die runnable() implementiert hat enthalten sein oder soll vom Hauptmenu erst das eigentliche Spiel gestartet werden (wo dann logischerweise auch runnable läuft, oder ähnliches)?


"Hauptmenü", "Level 1", "Scorescreen" sind verschiedene Zustände, die die Engine annehmen kann und jeweils verschiedes tun.

Zustand ist dann ein Interface oder eine abstrakte Klasse, von der der Rest erbt.



> -Die Welt. Ich möchte die Spielwelt in Räume aufteilen, wobei immer nur die benachbarten geladen werden um nicht die gesammte Welt zu laden (Performance etc.). Man könnte für diese Räume eine Mutterklasse erstellen und dann jeden Raum als Klasse erben lassen, wie kann ich diese Räume dann aufrufen und bereithalten und dann auch wieder entfernen, wenn sie nicht mehr gebraucht werden?


Eine abstrakte Grundklasse oder ein Interface macht da sicher Sinn.
Siehe Zustand einen weiter oben.
Die Klasse hat dann so abstrakte Methoden wie "loadRessources()" und "paintGame()".



> -Wie bringe ich Gravitation ins Spiel? Soll ich einfach die Formel nehmen und angleichen und bei einem Sprung eine vertikale Geschwindigkeit ne oben setzen? Funktioniert das oder ist es komplizierter?
> -Kollisionerkennung ist noch so ein Problem. Allgemein hab ich das verstanden, bei meinem Pong wurde bei jeder Zeiteinheit von der while-Schleife in der run()-Methode abgefragt, wo sich was befindet und ob es überlappt. Geht das auch anders? Kann man eine Kollision auch erst dann abfragen wenn sie stattfindet? Und wenn ja, wie?


Das geht alles über viel viel Mathematik, Geometrie, etc. 
Also ja, es werden die Formeln verwendet, die man eben so aus dem Physikunterricht kennt.
Gravitation ist da noch mit die einfachste ^^
Du wirst schon immer die Kollisionen abfragen müssen, von wo sonst sollte das Programm wissen, ob da eine Kollision ist oder nicht.



> Um nochmal zu verdeutlichen, wie ich das meine: Ich möchte die Engine etc. möglichst so aufgebaut haben, dass ich möglihst leicht Dinge hinzufügen und enfernen kann, ohne später in allen möglich Klassen für jedes Objekt nochmal irgendwo Code einfügen zu müssen.


Das erreicht man über abstraktion.

Imho gutes Tutorial zu Grundlagen:
http://www.ralf-bauer.org/java/tutorial/Tutorial.zip


----------



## Marco13 (10. Jul 2011)

Vermutlich können Quaxli und Apo dir da noch ein paar konkretere Hinweise geben (siehe z.B. http://www.java-forum.org/spiele-multimedia-programmierung/114394-apos-spielesammelthread.html "ApoMario"). 

BTW: @Cola_Colin: Ist Swing nicht Java2D?
@Arcus: Meintest du vielleicht Java3D?

Aber allgemein: Unterschätz' es nicht. Es gibt schon einen Haufen Java2D- und 3D Game Engines, und rechne damit, dass du (nicht alles, aber) einen u.U. nicht unerheblichen Teil dessen, was teilweise seit Jahren von Open-Source-Communities entwickelt und gepflegt wird, selbst schreiben müßtest, wenn du dort nicht auf etwas fertiges zurückgreifen willst. Und... ohne dich zu sehr desillusionieren zu wollen: Wenn du jetzt Fragen stellst in der Richtung wie "Sollte diese-und-jene Klasse Runnable sein?" klingt der Rest des Posts vielleicht etwas... überambitioniert. Aber *kurz überlegt um einen ermutigenden Ausklang für diesen Post zu finden* .. das haben die Leute auch gesagt, als die NASA zum Mond wollte


----------



## Cola_Colin (11. Jul 2011)

Marco13 hat gesagt.:


> BTW: @Cola_Colin: Ist Swing nicht Java2D?



Ich denke er bezog sich mit Swing darauf, dass er die Spielobjekte jeweils als Unterklassen von Panel aufbaut. Aber ja sicher, Java2D ist im Prinzip Swing.


----------



## Marco13 (11. Jul 2011)

Ah, das stimmt natürlich ... passt ja zum Thema: http://www.java-forum.org/java-basics-anfaenger-themen/63694-pingpong-selber-schreiben.html#post394005


----------



## Arcus (11. Jul 2011)

erstmal danke für die schnellen Antworten 

Was den teil angeht, ob ich die sache unterschätze? Wahrscheinlich zu 100%. Und die Frage wegen dem Runnable ist deshalb entstanden weil ich so ein bisschen von Quaxlis Tutorial gelesen habe (mit dem Helikopter) und eben festgestellt habe, dass dabei wirklich erstmal nur das Spiel war und kein Menu oder etwas. Egal, das hab ich jetzt verstanden...

Zu Java2D und Java3D: Ja meine Frage hat sich eher auf die Panels bezogen. Das ist also bei meinem Pong gerade so vertretbar gewesen aber iegntlich nich empfehlenswert. Daraus kommt jetzt aber meine nächste Frage: Was ist der wesentliche Unterschied zwischen Java2D und 3D? Weil ein Jump and Run ist ja eigentlich ne 2D Welt, und Java3D klingt nach 3D, weswegen ich das erstmal ausgeschlossen habe^^ War ich damit zu voreilig?


----------



## Marco13 (11. Jul 2011)

Nö, ist schon OK,... es gibt auch 3D Jump'n'Runs, aber das würde jetzt zu weit führen. Ansonsten ... zu Swing hatte ich ja oben schon was verlinkt, aber es gibt über Java2D hinaus natürlich noch Engines, recht bekannt sind Slick - 2D Game Library based on LWJGL oder Interactive Pulp - PulpCore , aber ich habe noch mit keiner davon gearbeitet, und kann deswegen keine Empfehlungen abgeben.


----------



## Arcus (11. Jul 2011)

Kann ich mir auf jeden Fall mal anschauen, danke. Ich glaub 3D Jump n Run wäre wirklich erstmal zu hoch für mich. Soll schließlich im Endeffekt ein Castlevania-Clon werden und soweit ich das beurteilen kann verwednen die kein 3D^^

YouTube - ‪#24 - Let's Play Castlevania - Dawn of Sorrow (Deutsch)‬&rlm;

Das is halt nurmal so am Rande ein Video von meinem Lieblingsspiel dieser Serie. Der Kommentator suckt - beim sprechen und spielen^^ aber gleichzeitig könnt ich das au net...

wie gesagt: grafik mach mir jetzt erstmal keine Gedanken^^ da kann mein hirn später schmoren...
Auf jeden Fall werd ich mir mal diese 2 Enigines ansehen. Können mir auf jeden Fall helfen, denke ich.

EDIT: Hab nochmal ne kleine Frage:


Cola_Colin hat gesagt.:


> "Hauptmenü", "Level 1", "Scorescreen" sind verschiedene Zustände, die die Engine annehmen kann und jeweils verschiedes tun.
> Zustand ist dann ein Interface oder eine abstrakte Klasse, von der der Rest erbt.
> 
> Eine abstrakte Grundklasse oder ein Interface macht da sicher Sinn.
> ...



Wie kann ich diese Zustände zu Stande bringen? Angenommen ich hab die Klasse "Engine" und die soll jetzt die zwei Zustände "Rot" und "Blau" annehmen können. Könnte mir jemand ein kleines Code-Beispiel daraus machen?


----------



## Gast2 (11. Jul 2011)

Passt zwar nicht so 100% aber du scheinst schon sehr fit zu sein. Würde dir daher gerne ein Buch empfehlen, mit dem du sehr große Fortschritte binnen sehr kurzer Zeit machen könntest in Bezug auf die Anwendung der OOP Prinzipien. Ist sehr ansprechend geschrieben und macht echt Spass zu lesen: Entwurfsmuster von Kopf bis Fuss

Wird dir das Verstehen der komplexeren Zusammenhängen bei den Spielen auf jeden Fall helfen.


----------



## Arcus (12. Jul 2011)

Hab mir mal bei Thalia angeschuat um was für ein Buch es sich handelt. Klingt auf jeden fall gut und Inhaltsverzeichnis verspricht ne Menge. Ich denke ich werd mir das Buch bei nächster Gelegenheit mal anschaffen. 

Back to Topic:
Ich hab im Moment leider das Problem dass ich die Zustände einer Klasse in Java nicht einbauen kann, weil ich mir das im Code irgendwie nicht vorstellen kann, wie man das macht.

Grundsätzlich würde ich die Zustände über eine Variable und if-Abfragen regeln, da Cola Colin allerdings gesagt hat, dass es  mit Interfaces geht und das für erstmal dieses Spiel und später weitere wahrscheinlich wichtig für mich wäre, würde ich gerne mal ein bisschen mehr dazu wissen - und ich würde annehmen, dass Interfaces eine vermutlich weitaus bessere und elegantere Lösung wären. Nur die Umsetzung in Java ist mir gerade nicht so klar, weswegen ich eine kurzes Beispiel gebrauchen könnte.


----------



## Cola_Colin (12. Jul 2011)

Mal ein grobes Beispiel der Idee, in der Praxis wird das ganze leicht komplizierter:

```
public class Engine implements Runnable{

	private State currentState;
	
	public void switchState(State state) {
		if (currentState != null) {
			currentState.exit();
		}
		currentState = state;
		currentState.begin();
	}

	// Hauptschleife das Spieles
	public void run() 
		while(true) {
			currentState.logic();
			currentState.draw();
		}
	}
}
```


```
public interface State {
	// Initialisierung des Zustandes. Lade Ressourcen, Objekte, etc. pp.
	public void begin();
	// Beendung des Zustandes. Gebe Ressourcen frei, entferne Objekte...
	public void exit();
	// Zeichne diesen State
	public void draw();
	// Führe Spiellogik/Menülogik, etc... aus
	public void logic();
}
```


```
public MainMenu implements State {
	// Initialisierung des Zustandes. Lade Ressourcen, Objekte, etc. pp.
	public void begin(){
		loadGraphics();
		createButtons();
	}
	// Beendung des Zustandes. Gebe Ressourcen frei, entferne Objekte...
	public void exit{
		removeButtons();
		unloadGraphics();
	}
	// Zeichne diesen State
	public void draw{
		drawMenu();
	}
	// Führe Spiellogik/Menülogik, etc... aus
	public void logic{
		moveRandomStuff();
	}
}
```


----------



## Arcus (13. Jul 2011)

Genial. Danke  Damit kann ich denke ich etwas anfangen. Eine Frage noch: Da wo ein State abgefragt wird, kann man da einfach eine Klasse einsetzen, die State implementiert hat? Weil dann hätte ich das jetzt richtig verstanden


----------



## Cola_Colin (13. Jul 2011)

Korrekt erkannt.


----------

