Jump'n'run Kollision bei Blöcken

danthe

Mitglied
Hi,
Wir sollen momentan im Informatik-Leistungskurs ein Jump'n'run-Spiel programmieren. Da ich noch nicht so viel Erfahrung habe und wir meiner Meinung nach noch gar nicht so wirklich bereit dafür sind (andere programmieren auf ziemlich seltsame Weise Applets mit Kugeln, die sich hin und her bewegen), bin ich Quaxlis Tutorial durchgegangen und habe es logischerweise so angepasst, dass man mit einer Figur hin- und herspringt. Die nächste Sache, an der ich momentan hänge, ist die Kollision, und zwar nicht mit Gegnern (Sprites), sondern mit Blöcken. Ich könnte natürlich alles in ewigen If-Bedingungen abfragen oder Sprites für die Blöcke erstellen, aber ist das nicht recht ressourcenfressend? Gibt es vielleicht eine einfache Methode, das alles abzufragen? Benutze zurzeit einen großen Background (als png) der Super Mario Bros. Welt 1-1, der sich glücklicherweise genau in Tiles zu 45x45 Pixeln einteilen lässt, daher wäre es auch kein Problem, Objekte drüberzulegen.
Habe den Programmcode und eine *.jar-Datei mit einer start.bat (die ihr von *.txt umbenennen müsst) hochgeladen. Den Hintergrundsound habe ich rausgenommen, damit es kleiner wird, ist aber auch absolut unwichtig. Fürs Kommentieren habe ich keine Zeit, aber falls ihr den Programmcode braucht und etwas nicht versteht, erkläre ich es gerne! :)
 

danthe

Mitglied
Gibt es hier einen Edit-Button? Habe gerade mal den Code rausgenommen, mit dem der Hintergrundsound abgespielt wird, da er ja auch weder in der .zip noch in der .jar ist.

Edit: ^^ Edit gibt es wohl nur bei Nicht-Startposts.
 
Zuletzt bearbeitet:

Lulumann6

Aktives Mitglied
du könntest ein 2D-Array, dass deinen Tiles entspricht anlegen.
wenn der eintrag des arrays eine 0 ist, hast du an der stelle luft und das dahinterliegende background-bild kommt zum vorschein. eine 1 wäre dann ein normaler block. eine 2 könnte ein gold-block sein usw...
zum zeichnen gehst du das array durch und wenn der eintrag nicht 0 ist mal du an der entsprechenden stelle, multipliziert mit 45, das bild des tiles an die stelle in dein fenster.
collisionserkennung geht dann ähnlich. du nimmst die eckpunkte deines players teilst die 45 und guckst was im entsprechenden eintrag des arrays steht.
 

Quaxli

Top Contributor
Mal ein erster Kommentar:

Was Du da in Deiner Klasse Mario in setHorizontalSpeed reingequetscht hast, gehört da nicht hin.

Java:
  public void setHorizontalSpeed(double d){
    super.setHorizontalSpeed(d);
    
      if(getHorizontalSpeed()>0){
      setLoop(5,7);}
      else if(parent.linkswaspressed==true && !parent.up && !parent.right && !parent.left){
        setLoop(3,3);
        parent.rechtswaspressed=false; parent.linkswaspressed=false;
      }
      else if(parent.rechtswaspressed==true && !parent.up && !parent.right && !parent.left){
        setLoop(4,4);
        parent.rechtswaspressed=false; parent.linkswaspressed=false;
      }
      else if(getHorizontalSpeed()<0){
        setLoop(0,2);
      }
    }

Das erklärt auch, warum Mario so ruckelig läuft - Änderungen werden nur vorgenommen, wenn sich die Horizontal-Geschwindigkeit ändert.
Den ganzen if-Kram solltest Du in der Methode doLogic ansiedeln. Und zwar bei Mario oder im GameLoop.
Außerdem tun die if-Konstrukte in den Augen weh ;)
Das kann man schöner lösen, z. B. in dem man in der Klasse Mario eine Methode für's Hüpfen einbaut, und Logik dahin auslagert, etc...

Ich guck später nochmal über den Rest und Deine eigentliche Frage. :rtfm:
 

danthe

Mitglied
du könntest ein 2D-Array, dass deinen Tiles entspricht anlegen.
wenn der eintrag des arrays eine 0 ist, hast du an der stelle luft und das dahinterliegende background-bild kommt zum vorschein. eine 1 wäre dann ein normaler block. eine 2 könnte ein gold-block sein usw...
zum zeichnen gehst du das array durch und wenn der eintrag nicht 0 ist mal du an der entsprechenden stelle, multipliziert mit 45, das bild des tiles an die stelle in dein fenster.
collisionserkennung geht dann ähnlich. du nimmst die eckpunkte deines players teilst die 45 und guckst was im entsprechenden eintrag des arrays steht.

Aber dann hätte ich ein Array mit ca. 3000 Einträgen, ist das wirklich die Lösung?
Edit: Ich könnte die Stellen für Luft doch einfach ganz auslassen und nur die Positionen der Blöcke hinschreiben, oder?
 

Quaxli

Top Contributor
So, ich hab' mal ordentlich dran rum gefrickelt und Dir ein Beispiel gebastelt, das mit einer Schattenkarte arbeitet. Das bedeutet, daß "im Hintergrund" eine Karte mit einfacher Farbgebung vorgehalten wird. In dem Beispiel soll alles was schwarz ist ein Hindernis sein (vgl. shadow.png).

Das Ganze ist noch ziemlich Basic, keineswegs komplett und auch nicht 100% fehlerfrei. Aber es ist ja Deine Hausarbeit, also sollst Du auch noch was machen ;)
Schau's Dir halt mal an, ich hab's angehängt.

Aktuell ist nur das Hüpfen und Fallen realisiert und der Sprung ist noch ziemlich "komisch".
Außerdem kann Mario noch durch Hindernisse durchlaufen, etc. Hier müsste ebenfalls noch Code rein, wenn Du mit diesem Beispiel weiterarbeiten willst.
Der Code, der ihn vom Fallen abhält, mnüsste halt noch für die Seiten implementiert werden.
Gleiches gilt für's Hüpfen, wenn oberhalb ein Hinderniss ist.

Ich habe Deinen Code, den ich geändert habe, nur auskommentiert, dadurch wird das Ganze etwas unübersichtlich, dafür siehst Du besser, was ich geändert habe.
Ich habe u. a. kräftig Code verschoben: Das was ich bei Mario reingepackt hätte, ist jetzt dort. Im KeyListener ist auch keine Logic mehr hinterlegt, etc., etc.. :D

Wenn Du Mario 1:1 realisieren willst (mit zerstörbaren Ziegelsteinen) ist die von mir gezeigte Vorgehensweise nicht optimal. Du müßtest dann entweder irgendwie noch Objekte generieren oder ganz anders vorgehen.
Für ein einfaches Jump 'n Run tut's der Code aber.

Falls Du Fragen hast,..... :D
 

danthe

Mitglied
Also das mit der Schattenkarte ist schon mal eine super Idee, auf sowas wäre ich wahrscheinlich nicht gekommen. :)
Ich muss mir den Code später mal genauer ansehen, muss leider gleich erstmal weg.
 

Lulumann6

Aktives Mitglied
Aber dann hätte ich ein Array mit ca. 3000 Einträgen, ist das wirklich die Lösung?
Edit: Ich könnte die Stellen für Luft doch einfach ganz auslassen und nur die Positionen der Blöcke hinschreiben, oder?

was sind denn schon 3000 bytes. du musst die ja nur einmal von deiner festplatte in den arbeitsspeicher laden und danach musst du ja keine operationen auf das array mehr durchführen. im vergleich bei der schattenlösung lädest du ein 23.764 bytes image in den arbeitsspeicher (was auch kein problem ist)
die schattenlösung halte ich persönlich für nicht optimal, du willst hier schließlich keine pixelgenaue kollision haben, die mariowelt besteht schließlich aus blöcken...
du könntest auch einfach eine liste mit den ganzen positionen deiner blöcke machen, das problem wäre dann nur das mit jedem block kollision überprüfen musst.
 

danthe

Mitglied
So, habe die Sachen angewandt und heute das Programm bei meiner Lehrerin abgegeben. Hoffe auf 15 Punkte.^^
Ich danke euch beiden für die Tipps, das Thema ist eigentlich erledigt. Ich werde wohl noch weiter dran programmieren, zumal die Gegner fehlen, aber auf jeden Fall ist kein Zeitdruck.
Wer will, kann sich den aktuellen Stand des Prgramms anschauen SpeedShare - Download GamePanel.jar
Die Datei habe ich jetzt extern geuploadet, weil die .jars nicht sonderlich groß sein dürfen und alle möglichen Sounds drin sind.
Falls die FPS nicht bei 100 sind oder der PC langsam ist, könnte es sein, dass Mario zu hoch springt etc. :(

danthe
 
Zuletzt bearbeitet:

danthe

Mitglied
So, meine Lehrerin hat das Programm bewertet und ich hab 15 Punkte. :)
Hatte ich zwar fast schon erwartet, wenn man mich mit meinen Klassenkameraden vergleicht, aber ich war mir nicht so sicher, obs 14 oder 15 Punkte werden. ^^
Möchte nämlich unbedingt 15 Punkte im Zeugnis. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Jump'n'Run: Probleme mit Kollision Spiele- und Multimedia-Programmierung 13
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
K Jump'N'Run Hügel Spiele- und Multimedia-Programmierung 11
T Jump and Run - Unklarheiten Spiele- und Multimedia-Programmierung 5
Arcus Jump and Run etwas komplizierter - Benötige Starthilfe Spiele- und Multimedia-Programmierung 12
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
B Kollision Spiele- und Multimedia-Programmierung 5
A Kollision funktioniert nicht richtig bei zu schneller Geschwindigkeit des Spielers Spiele- und Multimedia-Programmierung 0
N Kollision von zwei ImageIcons Spiele- und Multimedia-Programmierung 8
D Kollision funktioniert unten aber nicht oben Spiele- und Multimedia-Programmierung 4
J Kollision (libgdx) Spiele- und Multimedia-Programmierung 2
S Kollision Spiele- und Multimedia-Programmierung 2
J Kollision genau erkennen mit intersects Spiele- und Multimedia-Programmierung 27
K a* kollision der einheiten Spiele- und Multimedia-Programmierung 3
S Probleme bei Breakout - Brick kollision Spiele- und Multimedia-Programmierung 2
F Rechteck Kollision Spiele- und Multimedia-Programmierung 10
H 2- D Kollision Spiele- und Multimedia-Programmierung 14
C Zeldaklon Problem mit Wand-Kollision Spiele- und Multimedia-Programmierung 8
O Kollision Polygon und Rechteck Spiele- und Multimedia-Programmierung 2
S Pacman Kollision von Münzen und Mauern Spiele- und Multimedia-Programmierung 11
P Gridpane Kollision Spiele- und Multimedia-Programmierung 3
Androbin Kollision zwischen Raster und Nicht-Raster Spiele- und Multimedia-Programmierung 2
L Kollision soll nur an oberer Seite (Breite) möglich sein Spiele- und Multimedia-Programmierung 6
Hercules Kisten Kollision Spiele- und Multimedia-Programmierung 2
S 3D-Kollision mit zwei ArrayLists Spiele- und Multimedia-Programmierung 7
T Pixelgenaue Kollision Spiele- und Multimedia-Programmierung 5
A LWJGL 3D Objekte Kollision Spiele- und Multimedia-Programmierung 3
S Kollision tile-based 2D Plattformer Spiele- und Multimedia-Programmierung 2
D Greenfoot Kollision Spiele- und Multimedia-Programmierung 5
D Kollision verhindern Spiele- und Multimedia-Programmierung 2
R Frage zur Kollision Spiele- und Multimedia-Programmierung 5
Maxim6394 [Java3D] Probleme bei Kollision Spiele- und Multimedia-Programmierung 7
Kr0e Kollision zweier Kugeln... Wo ist Newton ?? Spiele- und Multimedia-Programmierung 9
C Kollision zwischen 2 Kreisen Spiele- und Multimedia-Programmierung 3
Helgon Kollision von jeder Seite des Blocks Spiele- und Multimedia-Programmierung 3
Fab1 Kollision die 100ste Spiele- und Multimedia-Programmierung 5
P PingPong Spiel - Kollision Spiele- und Multimedia-Programmierung 2
C Bitmaske und Kollision Spiele- und Multimedia-Programmierung 2
J Spielprogrammierung mit bewegung und kollision Spiele- und Multimedia-Programmierung 24
S Kollision Kreis Rechteck Spiele- und Multimedia-Programmierung 8
aze Java3D: Gegenstände aufeinander zubewegen ohne Kollision Spiele- und Multimedia-Programmierung 4
baddestpoet pixelgenaue Kollision Spiele- und Multimedia-Programmierung 4
S Kollision in 2D Spiele- und Multimedia-Programmierung 12
B Gedrehte Rechtecke Kollision Spiele- und Multimedia-Programmierung 4
J Kollision mit Block (Wand) Spiele- und Multimedia-Programmierung 11
C Kollision in Java3D Spiele- und Multimedia-Programmierung 4
J Kollision von Objekten Spiele- und Multimedia-Programmierung 7
M Asteroids Clone: Kollision zwischen Schuss und Feind Spiele- und Multimedia-Programmierung 13
F Bewegung/Kollision von Objekten auf Tastendruck Spiele- und Multimedia-Programmierung 6
Z Kollision Spiele- und Multimedia-Programmierung 3
F Kollision für Arkanoid Spiele- und Multimedia-Programmierung 2
N Kollision abfragen Spiele- und Multimedia-Programmierung 3
K Sprites / Kollision Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben