# Jump and run Spiel - wo anfangen / weitermachen?



## Niky (23. Mai 2016)

Hallo, bin so ziemlich neu hier (hab gemerkt, dass ich mich schon zu einem früheren Zeitpunkt angemeldet habe, aber ich glaube das hier ist auch mein erster Post, wie auch immer...). Ich habe ein ziemlich großes Problem und ich hoffe, dass mir hier weitergeholfen werden kann.

Das heißt: Ich soll ein Jump and Run Spiel für die Schule programmieren. Ich habe bereits mehrere klägliche Versuche hinter mir, das zum Laufen zu bringen (mehrere Neuversuche). Während meinen Versuchen musste ich lernen, dass ich das Konzept der Objektorientierung nur schwach verstanden habe, doch durch die Praxiserfahrung, die ich während dem Projekt sammeln konnte, fühle ich mich nun ziemlich sicher mit den Grundkonzepten in weniger komplexen Situationen.

Trotzdem kriege ich nichts auf die Beine, da so ein Spiel einfach zu komplex ist. Ich laufe ständig auf neue Probleme (was auch normal ist), die ich in der Regel auch alle bewältigen kann. Doch irgendwann stoße ich in meinem Quelltext auf Probleme, die ich nicht mehr lösen kann, da ich das ganze wohl nicht sauber genug programmiert habe und auf einem instabilen Fundament baue. Mir fehlt es letztlich immer noch an Wissen und Praxiserfahrung.

Die Tutorials, die ich lese, sind alle zu überladen für ein Schulprojekt und es ist auch für das Projekt eine Voraussetzung, dass man den Code versteht, den man schreibt bzw. den Code, den man nicht selber geschrieben hat, eindeutig markiert. Es gibt im Internet viele gute Tutorials für Tetris, Pacman und ähnliches, doch ich finde nichts angemessenes für ein Jump and Run Spiel. Ich brauche ein simples Tutorial, an dem ich mich etwas festhalten kann, das nicht zu voll mit Schickschnack ist und das auch anpassbar ist. Dazu kommt, dass ich das ganze mit dem Dreischichtenmodell programmieren muss (sprich, eine Steuerung, eine GUI und Fachklassen, wobei Steuerung und GUI eine bidirektionale Beziehung haben und die Steuerung die Verbindung zwischen GUI und den Fachklassen herstellt).

Das Spiel muss nicht sehr komplex sein, d.h. es reicht ein Spielcharakter, eine einfache Möglichkeit Maps zu erstellen, ein Item, das man einsammeln kann, 2 bis 3 Hindernissen, die man überwinden muss und die man in der Map verwenden kann (sonst verliert man das Spiel, also sowas wie spitze Zacken, die aus dem Boden ragen), ein simpler Gegner (z.B. ein Geist), der sich auf und ab bewegt und den man nicht berühren darf, einen normalen Angriff und einen Distanzangriff für den Spieler und natürlich ein Startmenü.

Ich bin momentan einfach nur noch frustriert, dazu kommt noch, dass ich meinen USB-Stick verloren habe und dadurch nicht einmal Code-Fragmente von meinem vorherigen Versuch wiederverwenden kann. Ich wäre euch wirklich sehr, sehr dankbar, wenn ihr mich in irgendeine Richtung lenken könnt. Das Projekt steht schon fest (seit ca. 3 Monaten) und ich muss es in ca. 3 Wochen abgeben.

Das letzte, was ich geschrieben habe, liegt als Anhang dabei. Bringt zwar wohl nicht viel, aber habe es mal vollständigkeitshalber zugefügt.

Schon mal vielen Dank!


----------



## dayaftereh (24. Mai 2016)

Schau dir mal das Spiele Tutorial von @Quaxli an.

http://www.ralf-bauer.org/java/tutorial/Tutorial.zip


----------



## Jardcore (24. Mai 2016)

Ich würde dir schonmal empfehlen dir das MVC Entwurfsmuster anzuschauen.
Weiterhin glaube ich das Vectoren für ein kleinen 2D Jump and Run zu viel sind.
Benutzte einfach den Satz des Pythagoras, das sollte reichen.

Schwierig bei einem Game ist immer auch die Idee, für ein Schulprojekt würde ich zuerst einmal etwas ganz einfaches versuchen.

Die Idee:
Ein Spieler läuft von links nach rechts durch den Bildschirm und muss Diamanten sammeln, dabei muss er von Plattform zu Plattform springen. Die Anforderung sollte schon mal ausreichen um anzufangen.

Die Vorarbeit:
Überlege dir welche Objekte du brauchst um dein Spiel zu realisieren.
Wahrscheinlich brauchst du eine Welt in der der Spieler herumläuft. (World)
Dann brauchst du natürlich den Spieler himself (Player)
Jetzt Fehlen noch die Diamanten und die Plattformen (Diamond, Platform).
Jetzt kommt man zu dem Punkt an dem man überlegt was Dinge gemeinsam haben.
Die Player, Diamond und Platform Objekte müssen alle in der World platziert werden können, deshalb benötigen alle zwei Koordinaten. Ich habe gesehen, dass du ein Entity Objekt angelegt hast. Dort kannst du die Koordinaten implementieren und dann den Player, Diamond und die Platform vom Entity Objekt erben lassen.
Jetzt hast du alle Grundobjekte für das Spiel.

So, jetzt wäre es an der Zeit zu überlegen welche wichtigen Konstrukte der Spielentwicklung du noch brauchst und welche zusätzlichen Objekte dadurch entstehen.
1. GameLoop
2. InputHandler
3. Rendering

Sag bescheid wenn du dir Gedanken zu diesen Themen gemacht hast, und wie weit deine Fortschritte bisher sind.


----------



## Cromewell (24. Mai 2016)

Jardcore hat gesagt.:


> 1. GameLoop
> 2. InputHandler
> 3. Rendering


Vielleicht noch eine Methode, die die Position updatet, oder Gravitation und so weiter auf die Objekte wirkt. (4. Update)


----------



## Niky (24. Mai 2016)

dayaftereh hat gesagt.:


> Schau dir mal das Spiele Tutorial von @Quaxli an.
> 
> http://www.ralf-bauer.org/java/tutorial/Tutorial.zip



Danke für dieses Tutorial, es ist einfach und verständlich geschrieben und erläutert vor allem, warum etwas nötig ist, damit es nicht zu Problemen kommt. Bin schon zu einem Drittel durch und werde mein Spiel darauf basieren.



Jardcore hat gesagt.:


> Ich würde dir schonmal empfehlen dir das MVC Entwurfsmuster anzuschauen.
> Weiterhin glaube ich das Vectoren für ein kleinen 2D Jump and Run zu viel sind.
> Benutzte einfach den Satz des Pythagoras, das sollte reichen.



Da gebe ich dir Recht, ich glaube inzwischen auch, dass das unnötig für mein kleines Spiel ist. Ich habe im Prinzip für jede Kleinigkeit einen Vektor erstellt, obwohl ich auch einfach die Koordinaten direkt hätte übergeben können.

Das MVC Muster dürfen wir explizit nicht verwenden, wir müssen es mit dem Drei-Schichten-Modell lösen. Nach meinen Versuchen vermute ich zwar, dass dieses Modell ungeeignet ist für meine Aufgabe, aber unser Lehrer besteht darauf.


----------



## dayaftereh (25. Mai 2016)

Na ja MVC behandelt nur die Anzeige, als drei Schichtenmodell könnte man auch folgendes Einführen.

Anzeige mit MVC
Spiel Logik
Persistenz ( Spiel Daten )


----------



## Jardcore (25. Mai 2016)

> *Vorsicht, Falle Nummer 1: MVC ist kein Schichtenmodell*


http://openbook.rheinwerk-verlag.de/oo/oo_06_moduleundarchitektur_001.htm


----------



## Niky (25. Mai 2016)

Hallo Leute, bin nun etwas weitergekommen, allerdings haben sich zwei Bugs in meinen Code eingeschlichen, die ich nicht nicht lösen kann 

Des weiteren wäre ich dankbar, wenn mir irgendjemand Feedback zu dem Code geben könnte, speziell zur Gesamtstruktur / Übersichtlichkeit / Effizienz etc.

Die zwei Bugs wären:
a) Entweder es stimmt bei der Berechnung etwas nicht, oder die Zeitverzögerung ist so nicht ganz richtig. Jedenfalls zeigt meine FPS-Anzeige, wenn ich sie mittels VSync limitiere etwas weniger als den doppelten Wert an, als ich ihn eingestellt habe. Ich habe schon alle Variablen und die GameLoop mehrfach durchgecheckt, kann es mir aber einfach nicht erklären 

b) Das Menü ruft beim Drücken der Enter-Taste, wenn "Play" selected ist, das Spiel auf. Wenn es schon aufgerufen ist, werden die Werte zurückgesetzt auf einen Standardwert. Bei mehrfachem Wechseln zum Spiel mit Enter und zum Menü mit Esc reagiert das Spiel irgendwann nicht mehr, ich nehme an, dass der GC die Objekte nicht wegwirft, obwohl diese immer neu zugewiesen werden. Deswegen initialisiere ich jetzt nicht mehr, so wie ich es vorher gemacht habe, die "World" und das "Menü" jedes Mal komplett neu, sondern resette sie mit einer dafür vorgesehenen Methode, falls deren Konstruktor schon aufgerufen wurde. Allerdings habe ich jetzt folgendes Problem entdeckt: Der KeyListener des Menüs feuert weiter, wenn ich im Spiel bin, allerdings erst ab dem zweiten Aufruf des Menüs. Eigentlich entferne ich den KeyListener von meinem JFrame bei jedem Druck auf die Enter Taste, aber das will nicht funktionieren, warum auch immer... Beim zweiten Druck im Spiel wird der Druck auf die Taste allerdings korrekt umgesetzt. Die Konsole gibt bei jedem Druck des Menü-KeyListeners eine Zahl auf, die entsprechend hochgezählt wird. Habe sie drin gelassen, falls es mal jemand probieren möchte..

Vielen Dank schonmal!


----------



## Niky (26. Mai 2016)

Ok, Problem 2 habe ich nun lösen können. Das Problem war, dass ich mit zwei verschiedenen Threads KeyListener dem JFrame hinzugefügt und entfernt habe. Deswegen habe ich das Ganze separat in eine processInput() Methode ausgelagert, in der u.a. auch der KeyListener bei entsprechendem Input entfernt wird und diese von meinem GameLoop Thread ausgeführt. Habe noch nie so richtig mit Threads gearbeitet, bin froh, dass das jetzt wenigstens läuft. Wenn jemand noch irgendwie Feedback hätte, wäre ich trotzdem froh.

Grüße


----------



## Niky (29. Mai 2016)

Ok, wie auch immer, jedenfalls danke für eure Hilfe. Bin inzwischen recht gut weitergekommen. Mein größtes Problem war denke ich, dass ich viel zu früh optimiert habe. Der Schuss ist nach hinten losgegangen. Thread kann geschlossen werden.


----------



## Jardcore (30. Mai 2016)

_"Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%." - Don Knuth"_

Am besten erst optimieren, wenn es zu Problemen kommt


----------



## Viktim (8. Jul 2016)

http://processingjs.nihongoresources.com/test/PjsGameEngine/docs/tutorial/mario.html

Das hier hab ich gerade gefunden und dachte das passt hier gut rein


----------

