Jump 'n' Run-Spiel Kollisionserkennung

Schmetterhand

Aktives Mitglied
Hallo zusammen!

Ich bin ein neuer Benutzer und hoffe, daß ich mich an die Forumsrichtlinien halte… :)

Meine Frage bezieht sich auf ein Problem bei meinem Spiel mit JavaFx, und zwar speziell auf die Kollisionserkennung. Nach bereits einigen Tagen Suche nach einer Methode zur Kollisionserkennung frage ich nun Kollisionen erfolgreich ab, jedoch bleibt ein seltsames Ruckeln der (JavaFx-)Kamerasicht, sobald eine Kollision stattfindet.

Bitte nicht darüber erschrecken, daß ich auf Deutsch programmiere, aber ein Mensch denkt immer in seiner Muttersprache und so stört der englische Code nur den Denkfluss.

Ich habe versucht, eine klare Trennung zwischen "model, view & controller" (MVC-Konzept). Die Variable "mModell" ist die Instanz eines Singletons und hält alle logischen Daten, wie z.B. alle Aktoren.
Die verwendete Klasse "Tupel2d" ist ein Äquivalent zu Javas "Point2D"-Klasse, nur auf meine Bedürfnisse angepaßt.

Hier die stark vereinfachte Animationsfunktion des Spieler-Objekts, die bei jedem Zyklus aufgerufen wird:

Java:
/**
    * Hier kann der Aktor Aktionen vornehmen.
    */
   @Override
   public void animiere()
   {
      // Bewegung etc…

      if (mVektor.x != 0) {
         mPosition.x += mVektor.x;
         Aktor kollision = prüfeKollision();
         if (kollision != null) {
            while (istÜberschneidung(kollision)) {
               if (mVektor.x > 0) {
                  mPosition.x--;
               }
               else {
                  mPosition.x++;
               }
            }
            mVektor.x = 0;
         }
      }
      if (mVektor.y != 0) {
         mPosition.y += mVektor.y;
         Aktor kollision = prüfeKollision();
         if (kollision != null) {
            while (istÜberschneidung(kollision)) {
               if (mVektor.y > 0) {
                  mPosition.y--;
               }
               else {
                  mPosition.y++;
               }
            }
            mVektor.y = 0;
         }
      }
      transliere(mPosition);
   }

Hier noch die relevanten Funktionen aus der Superklasse:

Java:
/**
    * @param abfrage Der Aktor zu prüfende Aktor.
    * @return Ob Kollision zwischen diesem Aktor und dem Übergabe-Aktor.
    */
   public boolean istÜberschneidung(Aktor abfrage)
   {
      Rectangle2D aktormaß = abfrage.gibAusmaß();

      return gibAusmaß().intersects(aktormaß);
   }


   /**
    * @return Falls Kollision, wird der Aktor zurückgegeben.
    */
   public Aktor prüfeKollision()
   {
      for(Aktor aktor : mModell.gibBlockliste()) {
         if (aktor.mIstSolid) {
            if (istÜberschneidung(aktor)) {
               return aktor;
            }
         }
      }
      return null;
   }


  /**
  * Gibt die Maße des Aktors.
  *
  * @return Ausmaß.
  */
  public Rectangle2D gibAusmaß()
  {
     return new Rectangle2D(mPosition.x, mPosition.y, mBreite, mHöhe);
  }


  /**
  * Transliert sowohl die Logik- als auch die Sichtposition.
  *
  * @param neupos Die neue Position.
  */
  public void transliere(Tupel2d neupos)
  {
     mPosition.set(neupos.x, neupos.y);

     mBildsicht.setTranslateX(neupos.x);
     mBildsicht.setTranslateY(neupos.y);
  }
 
Zuletzt bearbeitet:

Schmetterhand

Aktives Mitglied
Ich glaube, daß ich jetzt eine Vorstellung habe, warum dieses seltsame Zittern bei einer Kollision passiert. Ich ziehe ja immer 1 ab von der jeweiligen Position. "position.x--". Da der Spieler aber manchmal auch nur 0,5 Einheiten in einem Block steckt, wird er um -1 herausgezogen und dann sofort wieder von der Schwerkraft nach unten gezogen. (Jedenfalls könnte das sein, nach verschiedenen Tests mit Konsolenausgaben).

Wenn ich aber jetzt meine Kollisionsprüfung umstellen will, stehe ich vor folgendem Problem:

Kollisionsdelta.png

Wie bekomme ich die Dimensionen des grünen Deltas heraus? (so nennt man das doch, glaube ich)
Und vor allem, funktioniert das auch, wenn der Block auf einer anderen Seite wäre?

Ich wäre über Hilfe sehr Dankbar (auch in "Gefällt mir"-Angaben ;))

Gruß,
Schmetterhand.
 

Major_Sauce

Bekanntes Mitglied
Nabend,

Das Delta, ja so wird eine Differenz genannt", kann man ganz einfach berechen:

Ich nenne das Große rechteck jetzt mal r1, das kleine r2, und dann noch x und y für Koordinaten.
Das hier ist Pseudocode...

int deltaWidth = (r1x + r1width) - r2x
int deltaHeight = (r1y + r1height) - r2y

Das sollte es eigentlich auch schon gewesen sein, also immer einfach die R1-xKoordinate + R1-Breite - xKood-R2

mfg Major
 

Schmetterhand

Aktives Mitglied
Ich habe das Problem jetzt gelöst. Das ist schon eine Weile her, ich habe nur vergessen, es hier zu schreiben.
Es war eigentlich ziemlich leicht: Man muß einfach nur die Achsen separieren („separating axes theorem”), also zuerst eine Kollision der Hitbox des Spielers nur mit der Verschiebung auf der X-Achse durchführen und auf diese reagieren. Danach macht man das gleiche auch mit der Y-Achse.
Falls eine Kollision stattfindet, muß man noch die Bewegungsrichtung des Spielers herausfinden (entspricht der Seite der Kollision) und die Position des Spielers auf die Außenkante des Kollisionsobjektes zurücksetzen.

Java:
         if (aktor.istSolid() && kollidiert(aktor)) {
            // Nur in X-Richtung prüfen.
            Rectangle2D spieler = new Rectangle2D(gibAusmaß().getMinX()+mVektor.x, gibAusmaß().getMinY(),
                                                  gibAusmaß().getWidth(), gibAusmaß().getHeight());
            if (spieler.intersects(aktor.gibAusmaß())) {
               //Spieler bewegt sich nach rechts.
               if (mVektor.x > 0) {
                  mPosition.x = aktor.gibPosition().x - gibBreite() + cVersatz;
               }
               // Spieler bewegt sich nach links.
               else if (mVektor.x < 0) {
                  mPosition.x = aktor.gibPosition().x + aktor.gibBreite() - cVersatz;
               }
               mVektor.x = 0;
            }

            // Nur in Y-Richtung prüfen.
            spieler = new Rectangle2D(gibAusmaß().getMinX(), gibAusmaß().getMinY() + mVektor.y,
                                      gibAusmaß().getWidth(), gibAusmaß().getHeight());
            if (spieler.intersects(aktor.gibAusmaß())) {
               //Spieler bewegt sich nach unten.
               if (mVektor.y > 0) {
                  mPosition.y = aktor.gibPosition().y - gibHöhe() + cVersatz;
               }
               //Spieler bewegt sich nach oben.
               else if (mVektor.y < 0) {
                  mPosition.y = aktor.gibPosition().y + aktor.gibHöhe() - cVersatz;
               }
               mVektor.y = 0;
            }
            kollisionsliste.add(aktor);
         }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Jump and run Spiel - wo anfangen / weitermachen? Spiele- und Multimedia-Programmierung 11
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
F Jump'n Run Background wiederholen Spiele- und Multimedia-Programmierung 3
E Java Jump and Run Map zu groß Spiele- und Multimedia-Programmierung 14
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
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
S Jump'n'Run: Probleme mit Kollision Spiele- und Multimedia-Programmierung 13
xFearofdarkness Feinde überlappen sich in Java Spiel Spiele- und Multimedia-Programmierung 3
ItundMathe1994 TicTacToe Spiel programmieren Spiele- und Multimedia-Programmierung 2
JEP1 Hilfe bei Spiel Spiele- und Multimedia-Programmierung 1
P Pokemon Spiel Funktioniert nicht ? Spiele- und Multimedia-Programmierung 3
Leon.tr3x Mein erstes Programm/Spiel Spiele- und Multimedia-Programmierung 10
O Texas Hold'em Poker als Online-Spiel mit Freunden Spiele- und Multimedia-Programmierung 5
Drachenbauer Speicher-Tool für ein Spiel schreiben Spiele- und Multimedia-Programmierung 13
M Spiel Mühle-Programmierung Java Spiele- und Multimedia-Programmierung 9
Excess Spiel abzugeben Spiele- und Multimedia-Programmierung 1
I Superhelden - Spiel Spiele- und Multimedia-Programmierung 14
E Hauptmenü und Spiel ???? Spiele- und Multimedia-Programmierung 2
L Sound in Java Spiel Spiele- und Multimedia-Programmierung 5
R Interaktives Spiel Spiele- und Multimedia-Programmierung 5
L Spiel im Editor testen Spiele- und Multimedia-Programmierung 4
Jackii dispatchUncaughtException in Quiz Spiel mit GUI Layout Spiele- und Multimedia-Programmierung 6
D Textbasiertes Spiel Spiele- und Multimedia-Programmierung 8
K Android Spiel Programmieren Spiele- und Multimedia-Programmierung 6
L BrickBreaker Spiel Spiele- und Multimedia-Programmierung 3
A Spiel Figur ansprechen und bewegen Spiele- und Multimedia-Programmierung 3
it_is_all Dialogbox im Spiel - Text in Blöcke aufteilen Spiele- und Multimedia-Programmierung 4
F Koordinieren und Essen von Snake - Spiel Spiele- und Multimedia-Programmierung 14
G Entity Verwaltung in einem 2D Spiel Spiele- und Multimedia-Programmierung 1
E Möchte Spiel Programmieren Spiele- und Multimedia-Programmierung 7
S Connect6 Spiel - Code in ei Spiele- und Multimedia-Programmierung 2
A Spiel nach Abfrage beenden oder neustarten Spiele- und Multimedia-Programmierung 1
G Welten Generierung 2D Spiel Spiele- und Multimedia-Programmierung 4
G Java 2D Spiel mit LWJGL verbinden Spiele- und Multimedia-Programmierung 1
N Problem mit 2D Spiel Spiele- und Multimedia-Programmierung 17
T Probleme bei "Pixel-Fighting"-Spiel: Unausgewogene Mannschaften??? Spiele- und Multimedia-Programmierung 4
R Pong Spiel Problem Spiele- und Multimedia-Programmierung 1
L Coordinate Space JavaFX 2d Spiel Spiele- und Multimedia-Programmierung 0
C Vier Gewinnt Spiel Programmiertipp Spiele- und Multimedia-Programmierung 11
K Spiel zum zuordnen von Dienstgraden und Dienstgradabzeichen Spiele- und Multimedia-Programmierung 5
M Textbasiertes Spiel programmieren Spiele- und Multimedia-Programmierung 4
T 2d-Spiel Licht Spiele- und Multimedia-Programmierung 5
T Spiel rendern Spiele- und Multimedia-Programmierung 2
Grevak Sounds im Spiel Spiele- und Multimedia-Programmierung 5
B Fehlerhafte Mob Bewegungen in Tower Defense Spiel Spiele- und Multimedia-Programmierung 2
F Spiel ähnlich wie SimCity/o.ä programmieren Spiele- und Multimedia-Programmierung 5
X Erklärung zu einem Tic Tac Toe Spiel Spiele- und Multimedia-Programmierung 1
I Spectator Modus für Spiel ähnlich zu Terraria Spiele- und Multimedia-Programmierung 8
I Textbasiertes Spiel - Umsetzungsfrage & Schleifen Problem Spiele- und Multimedia-Programmierung 26
M Kollisions abfrage bei 3D spiel? Spiele- und Multimedia-Programmierung 12
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Spiele- und Multimedia-Programmierung 1
P [Spiel]Welche Bilder sind gleich Spiele- und Multimedia-Programmierung 2
E GUI zum Spiel hinzufügen Spiele- und Multimedia-Programmierung 19
S 2D Spiel - Physics Spiele- und Multimedia-Programmierung 16
S 2D Spiel "Der Sprung" Spiele- und Multimedia-Programmierung 7
A 2D Spiel ohne Tiles Spiele- und Multimedia-Programmierung 10
V welche vorgehensweise beforzieht ihr bei einfachem Quizz Spiel ? Spiele- und Multimedia-Programmierung 4
S Quaxli's Heli Spiel läuft nicht nach Plan Spiele- und Multimedia-Programmierung 2
G Methode sleepen während das Spiel weiterläuft Spiele- und Multimedia-Programmierung 3
T Spiel Überprüfung Spiele- und Multimedia-Programmierung 3
P Spiel laggt nach unbestimmter Zeit tierisch. Spiele- und Multimedia-Programmierung 27
S Hilfe bei Spiel Spiele- und Multimedia-Programmierung 6
B Hauptmenü für Spiel Spiele- und Multimedia-Programmierung 1
W Spiel ist langsam/laggt Spiele- und Multimedia-Programmierung 18
J Ascii Spiel Spiele- und Multimedia-Programmierung 1
Androbin Mein Spiel will sich nicht zeichnen lassen !!! Spiele- und Multimedia-Programmierung 7
O Vollständige Musik in Spiel einbauen (wav - Format) Spiele- und Multimedia-Programmierung 8
Y Quiz Spiel Spiele- und Multimedia-Programmierung 1
J Conways Spiel des Lebens nachprogrammiert Spiele- und Multimedia-Programmierung 1
B Spiel Programmieren, die Anfänge Spiele- und Multimedia-Programmierung 6
D [OpenGL] Spiel in der Art von Age of Empires Spiele- und Multimedia-Programmierung 4
lord239123 suche Graphiker für ein Pokemon-Spiel Spiele- und Multimedia-Programmierung 6
S Spiel installeren lassen und organisieren Spiele- und Multimedia-Programmierung 3
J Lichtupdate in tile-basiertem Spiel Spiele- und Multimedia-Programmierung 4
P Erstes Spiel (Strategie) Spiele- und Multimedia-Programmierung 31
J Mein erstes Spiel [Spielevorstellung] Spiele- und Multimedia-Programmierung 2
Bananabert Spiel Renderer Images und Strings Spiele- und Multimedia-Programmierung 4

Ähnliche Java Themen

Neue Themen


Oben