Jump and Run etwas komplizierter - Benötige Starthilfe

Arcus

Mitglied
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:
 
Zuletzt bearbeitet:

Cola_Colin

Top Contributor
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

Top Contributor
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 :D
 

Arcus

Mitglied
erstmal danke für die schnellen Antworten :D

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?
 

Arcus

Mitglied
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)‬‏

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:
"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.
Siehe Zustand einen weiter oben.
Die Klasse hat dann so abstrakte Methoden wie "loadRessources()" und "paintGame()".

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?
 
Zuletzt bearbeitet:
G

Gast2

Gast
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

Mitglied
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

Top Contributor
Mal ein grobes Beispiel der Idee, in der Praxis wird das ganze leicht komplizierter:
Java:
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();
		}
	}
}

Java:
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();
}

Java:
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

Mitglied
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 :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Mein Jump and Run charakter bewegt sich nicht mehr rückwärts... Spiele- und Multimedia-Programmierung 0
E Möchte Jump and Run programmieren Spiele- und Multimedia-Programmierung 2
N Jump and run Spiel - wo anfangen / weitermachen? Spiele- und Multimedia-Programmierung 11
F Jump'n Run Background wiederholen Spiele- und Multimedia-Programmierung 3
E Java Jump and Run Map zu groß Spiele- und Multimedia-Programmierung 14
S Jump 'n' Run-Spiel Kollisionserkennung Spiele- und Multimedia-Programmierung 3
Finalspace Entwicklung eines Jump & Run Spiels Video-Tutorial Spiele- und Multimedia-Programmierung 12
C Doodle Jump Sprung Physik? Spiele- und Multimedia-Programmierung 4
M Jump 'n' Run Game - Blöcke? Spiele- und Multimedia-Programmierung 7
N Problem mit Kollisionsabfrage beim Fallen Jump & Run Spiele- und Multimedia-Programmierung 5
M Empfehlungen für ein 2D-Jump'n'run Spiele- und Multimedia-Programmierung 4
W Doodle Jump Spiele- und Multimedia-Programmierung 6
H Jump&Run Tutorial Spiele- und Multimedia-Programmierung 3
D Jump'n'run Kollision bei Blöcken Spiele- und Multimedia-Programmierung 10
K Jump'N'Run Hügel Spiele- und Multimedia-Programmierung 11
T Jump and Run - Unklarheiten Spiele- und Multimedia-Programmierung 5
T Ist meine Jump and Run Engine zu genau? Spiele- und Multimedia-Programmierung 4
N Grundlagen für ein Jump&Run Spiele- und Multimedia-Programmierung 3
F "Doodle Jump" Projekt Spiele- und Multimedia-Programmierung 8
U Jump n' Run 2D Geometrie und Kollisionsabfrage? Spiele- und Multimedia-Programmierung 11
L Jump-n-Run Auslastung verringern Spiele- und Multimedia-Programmierung 16
Apo Kollisionserkennung bei Jump'n'Run Spiele- und Multimedia-Programmierung 69
F jump and run idee Spiele- und Multimedia-Programmierung 2
T Umsetzung eines 2D Jump and Runs Spiele- und Multimedia-Programmierung 7
K Jump n Run Keylistener und Schleifen Spiele- und Multimedia-Programmierung 8
F DJADD Jump and Run Spiele- und Multimedia-Programmierung 10
D Jump 'n run die 2. [spielerbewegen mit zeit] Spiele- und Multimedia-Programmierung 6
D Jump and Run Game -- Kollisionsabfrage Spiele- und Multimedia-Programmierung 30
S Kollisionsprob bei Jump&Run Spiele- und Multimedia-Programmierung 9
S Jump'n'Run: Probleme mit Kollision Spiele- und Multimedia-Programmierung 13
Timo_neu_in_java Suche etwas einfaches für Anfänger Spiele- und Multimedia-Programmierung 6
A JOGL, etwas Grundlegendes Spiele- und Multimedia-Programmierung 8

Ähnliche Java Themen

Neue Themen


Oben