Java Game verbesserte Kollisionserkennung

BraunBerry

Mitglied
Hallo Community,
ich melde mich nach meinem Waypointproblem nochmal zurück. In meinem Spiel habe ich auch ein terrain mit einem Spieler. Also der Spieler befindet sich in einem Raum (mehrere Ecken, nicht rechteckig). Ich habe kein Problem damit, die Kollisionskanten parallel zur X bzw. zur Y Achse zu setzen. Deshalb habe ich auch zuerst die Standardtaktik angewandt: Wenn ein X oder Y Wert überschritten wird, wird er auf das Maximum zurück gesetzt z.B.:
if(X >= 100){X = 100;}
Alles schön und gut aber dennoch frage ich mich ob es nicht eine einfachere und vorallem zeitsparendere Lösung gibt. Ich habe mich gefragt, ob es nicht möglich wäre, passend zum entsprechenden Terrain noch eine Grafik anzufertigen, in dem der Raum, in dem sich der Spieler bewegen kann beispielsweise transparent ist und der Raum in den der Spieler nicht kann bzw. bis zu den Kollisionskanten beispielsweise pink ist. Diese grafik könnte man dann unsichtbar im Spiel hinterlegen und so die Kollision abfragen. So zummindest meine Vorstellung. WICHTIG: Es sollten keine Fehler entstehen, wenn ich meine DIMENSION auf die Grafik anwende, also ein float Wert, der mit der Fenstergröße und allen Bildgrößen multipliziert wird, um eine einheitliche Größe einstellen zu können. Wenn ihr eine Idee hättet wie man soetwas verwirklichen könnte oder ob es so ein Verfahren schon mal in einem Spiel gabwürde ich mich sehr freuen. :)

lg BraunBerry
 

BRoll

Bekanntes Mitglied
hast du jetzt ein Problem mit der Haltung der Kollisionsinformation oder mit dem Kollisionsverfahren?
Egal ob du jetzt die Informationen in einem Bild, einer Textdatei, irgendeinem Binärformat oder CSV Datein hinterlegst,
die Abfrage wäre immer die gleiche (zb. dein Rücksetz-Verfahren). Das mit der Grafik als Speicherort für die Kollisionsinformation ist auf jeden Fall eine gute Lösung, ich würde sagen da ist es Geschmackssache und abhängig von der Komplexität der Karten welches Verfahren am sinnvollsten ist. In einer Bilddatei könntest du theorietisch mit jeder RGB (oder RGBA) Farbe eine bestimmte Aktion interpretieren (zb. Spawnpunkte oder eben Kollisionsflächen). Wenn man aber komplexe Metadaten zusätzlich zur Kollision hat, und nicht mit mehreren Files rumhantieren will, dann lohnt es sich über ein eigenes Format nachzudenken. Deshalb könnte ich dir jetzt keine Antwort geben welches das beste Verfahren für dein Projekt wäre.
 

BraunBerry

Mitglied
Mein Problem ist die Rücksetztung. In einem Rechteck wäre das gar kein Problem. Allerdings in komplexerem Raum ist das etwas koplizierter. Ich habe versucht die letzte Position des Spielers (also des Terrains, weil der Spieler immer zentriert ist) nach jeder Kollisionsabfrage in einer Variable zu speichern. Dann habe ich versucht die Intersection von Rectangels (playerHitbox und der Kollisionskante Bound001) abzufragen, so dass bei
if (playerHitbox.intersects(Bound001))
Die Koordinaten wieder auf den letzten Punkt zurückgesetzt werden. Allerdings bewegt sich dann garnichts mehr und ich glaube auch nicht dass das so funktionieren wird. Obwohl ich zwar alles selber schreiben wollte, frage ich mich ib es nicht irgendeine Library gibt, die die Kollisionsabfrage und Rücksetztung vereinfacht.

Lg BraunBerry
 

InfectedBytes

Top Contributor
Anstatt die Position neu zu setzen und bei kollision zurückzusetzen, kannst du auch einfach die position nur ändern, wenn dies zu keiner Kollision führt.
quasi:
Java:
target = position + delta;
if(!kollision(target)) {
  position = target;
  // ... restliche bewegung durchführen
}

Um dir mehr helfen zu können, wäre es gut wenn du mehr zum Spielfeld sagst. Denn je nach Aufbau gibt es unterschiedliche Lösungsmöglichkeiten. Nutzt du eine Tilemap? Beliebige Positionen? etc.

Ansonsten würde ich dir sowieso empfehlen das ganze mit sowas wie z.B. LibGDX zu machen, das ist ein Framework für Spiele.
 

BRoll

Bekanntes Mitglied
Du redest dauernd von einem komplexen Raum, der kein Rectangle ist, überprüfst aber mit Rectangles die Intersection? Kannst du mal ein Screenshot von so einem Raum hochladen?
 

BraunBerry

Mitglied
Im Bild habe ich versucht zu skizzieren, wie ich mir den Raum vorstelle.
PlayerSchema.png
InfectedBytes Idee, einfach die Bewegung zu deaktivieren wenn eine bestimmte Koordinate erreicht ist ist eigentlich sehr gut. Ich habe das mit den boolean Variablen canMoveRight und canMoveLeft in der Player-Klasse realisiert. Das Problem hierbei ist, dass wenn ich rechts am Maximum bin, der Spieler die ganze Zeit springt und wenn ich links am Maximum bin, das Bild immer hin und her springt. Hier nochmal mein Jump void:

Java:
public static void Jump(){
     if (isGrounded == true){
       isGrounded = false;
       isJumping = true;
       FALLVALUE = -FALLSPEED;
     }
   }

@Override
   public void actionPerformed(ActionEvent e) {
     if (e.getSource() == FallTimer){
       if (isGrounded == false){
         if (isJumping == true){
           JUMPHEIGHT += 1;
           MainTerrain.Y -= FALLVALUE;
           if (JUMPHEIGHT >= (MAXJUMPHEIGHT - JUMPSLOWDOWNINDICATOR)){
             JUMPHEIGHT = 0;
             FALLVALUE += 1;
           }
         }
       }
     }
   }

und meine KeyEvents:

Java:
switch(e.getKeyCode()){
       case KeyEvent.VK_A: if (Player.canMoveLeft == true){
                 MainTerrain.SPEEDX = Player.WALKSPEED;
                 Player.DIRECTION = "left";
                 Player.isWalking = true;
                 Player.initAniState();
                 break;}
     
       case KeyEvent.VK_D: if (Player.canMoveRight == true){
                 MainTerrain.SPEEDX = -Player.WALKSPEED;
                 Player.DIRECTION = "right";
                 Player.isWalking = true;
                 Player.initAniState();
                 break;}
     
       case KeyEvent.VK_SPACE: if (Player.isGrounded == true){Player.Jump();}
                  break;
       }

falls ihr damit etwas anfangen könnt.

Ich probiere derzeit immernoch verschiede Möglichkeiten von Kollision aus.

PS: Jeder Mensch hat Stärken. Themen in Foren verständlich schreiben gehört bei mir leider nocht nicht wirklich dazu. :/

lg BraunBerry
 
Zuletzt bearbeitet von einem Moderator:

BRoll

Bekanntes Mitglied
Hmm was hat das jetzt alles plötzlich mit Springen zu tun?
Wenn das Bild hin und herspringt sieht das für mich eher aus als ob das Rücksetzen
an einer Stelle noch "kaputt" im Code ist. PS: Bei dem bisschen Code was du jetzt vom Springen gezeigt hast fehlt doch noch das zurücksetzen der isGrounded und isJumping wenn der Sprung fertig ist?
 

BraunBerry

Mitglied
Java:
public static void Update(){
     System.out.println(MainTerrain.X + " , " + MainTerrain.Y + " , " + isGrounded + " , " + JUMPHEIGHT + " , " + FALLVALUE + " , " + Application.WIDTH + " , " + Application.HEIGHT);  // ***TEMP***
     System.out.println(GUI.MOUSEX + " , " + GUI.MOUSEY);
     detectCollision();
   }
 
   public static void detectCollision(){
     if (MainTerrain.activeTerrain == "Scout001"){
     
       if ((MainTerrain.X <= 96) && (MainTerrain.X >= -270)){
         if (MainTerrain.Y <= 0){MainTerrain.Y = 0; isGrounded = true;}
       }
     }
   }

Hier ist nochmal meine bisherige Kollisionserkennung.
Ja die Kollision am liken Rand scheint irgendwie nicht richtig zu funktionieren (wenn ich a gedrückt halte). Und wenn ich am rechten Rand d gedrückt halte wird solange ich halte immer der Jump void ausgeführt. Ich vermute dass das Programm auf die nächste Aktion ausweicht (welche der Sprung ist) wenn eine Rechtsbewegung nicht mehr möglich ist.
 
Zuletzt bearbeitet:

BRoll

Bekanntes Mitglied
Hmm wo wird da jetzt in detectCollision das canMoveRight/canMoveLeft gesetzt/zurückgesetzt?
Und bei isGrounded= true müsste doch noch isJumping = false gesetzt werden ,wenn ich alles richtig verstanden habe.
 

BraunBerry

Mitglied
Ich hab das jetzt mal eingefügt:

Java:
public static void detectCollision(){
     if (MainTerrain.activeTerrain == "Scout001"){
     
       if ((MainTerrain.X <= 96) && (MainTerrain.X >= -270)){
         if (MainTerrain.Y <= 0){MainTerrain.Y = 0; isGrounded = true;}
       }
     
       if (MainTerrain.X <= -262){
         canMoveRight = false;
         MainTerrain.X = -262;
       }else{canMoveRight = true;}
     }
   }

Die Variable isJumping ist im Prinzip das umgekehrte Äquivalent zu isGrounded. Die Variable existiert nur schon, da ich für später Dublejumps, etc. geplant habe. Ich habe jetzt nur die Kollision für den rechten Rand eingefügt, da hier nur das Problem mit dem Springen bei d gedrückt halten auftritt.
 
Zuletzt bearbeitet:

BRoll

Bekanntes Mitglied
Naja wie InfectedBytes schon gesagt hat ist die oberste Bedingung niemals true, weshalb der ganze Code ansich unerreicht ist. Dh. du dürfest gar keinen Unterschied merken wenn du dort was änderst. Änder doch mal das == zu equals bei dem String Vergleich und schau wie es dann läuft. Oder wo ist jetzt noch das Problem?
 

BraunBerry

Mitglied
Nach gründlicher Überarbeitung kann ich noch einen Lösungsvorschlag hinterlassen: Wenn eine Bewegung nicht möglich war ist der switch auf die nächstmögliche Aktion im Code ausgewichen. Jetzt habe ich für jede Bewegungsart (Links, Rechts, Sprung) einen extra
Java:
switch(e.getKeyCode()){
geschrieben und die Kollision verläuft reibungslos.

Hier des Rätsels Lösung:
Java:
switch(e.getKeyCode()){
       case KeyEvent.VK_A: if (Player.canMoveLeft == true){
                 MainTerrain.SPEEDX = Player.WALKSPEED;
                 Player.DIRECTION = "left";
                 Player.isWalking = true;
                 Player.initAniState();
                 break;}}
       
       switch(e.getKeyCode()){
       case KeyEvent.VK_D: if (Player.canMoveRight == true){
                 MainTerrain.SPEEDX = -Player.WALKSPEED;
                 Player.DIRECTION = "right";
                 Player.isWalking = true;
                 Player.initAniState();
                 break;}}
       
       switch(e.getKeyCode()){
       case KeyEvent.VK_SPACE: if (Player.isGrounded == true){Player.Jump();}
                  break;}
 

InfectedBytes

Top Contributor
die vielen switch sind recht unnötig und gehen am ganzen Sinn von switch vorbei. Du musst nur das break außerhalb der if machen.
Besser:
Java:
switch(e.getKeyCode()) {
  case KeyEvent.VK_A:
    if(...) { ... }
    break;
  case KeyEvent.VK_D:
    if(...) { ... }
    break;
  // ...
}
 

InfectedBytes

Top Contributor
Kein Problem.
Du musst dir halt deinen Code einfach mal genauer ansehen. Hier war eben das Problem dass du mit break eben nur aus dem Switch gesprungen bist wenn dein if erfüllt war. Wenn es aber nicht erfüllt war, bist du einfach fröhlich weiter durch das switch gegangen.

Ansonsten mach bitte dringen das == true weg!
Es ist zwar nicht falsch, aber dennoch recht unschön und vorallem unnötig, denn immerhin ist deine Variable schon ein boolean, da brauchst nicht auch noch prüfen ob dieser boolean gleich einem anderen boolean ist.
Einfach:
Java:
if(Player.isGrounded) { ... }
und fertig. Falls du wissen willst ob der boolean false ist, machst du einfach:
Java:
if(!Player.isGrounded) { ... }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Component System Java 2D Game LibGDX Spiele- und Multimedia-Programmierung 6
$ Einstieg in Java Game Development Spiele- und Multimedia-Programmierung 11
BraunBerry Java Game Pixel "einfärben" Spiele- und Multimedia-Programmierung 6
BraunBerry Java Game Waypoint System Spiele- und Multimedia-Programmierung 3
P java lwjgl Game Spiele- und Multimedia-Programmierung 0
J Java Game performance Probleme Spiele- und Multimedia-Programmierung 7
hdi Das java-forum.org 2D-Game Projekt/Tutorial Spiele- und Multimedia-Programmierung 6
A Java 2D Game Spiele- und Multimedia-Programmierung 4
K Java Game Programming Buch Spiele- und Multimedia-Programmierung 3
M Java online multiplayer game Spiele- und Multimedia-Programmierung 2
J java netzwerk strategie game programmiert Spiele- und Multimedia-Programmierung 4
F Online Game mit Java? Spiele- und Multimedia-Programmierung 11
H LWJGL - Lightweight Java Game Library! Ist Java3D jetzt out? Spiele- und Multimedia-Programmierung 4
xFearofdarkness Feinde überlappen sich in Java Spiel Spiele- und Multimedia-Programmierung 3
A Minecraft Java Buch fehlermeldung Spiele- und Multimedia-Programmierung 61
yakazuqi Minecraft java.lang.Error: Watchdog Spiele- und Multimedia-Programmierung 3
L Fehler bei "Nochmal Spielen" (Java) Spiele- und Multimedia-Programmierung 1
N Minecraft Java Error Spiele- und Multimedia-Programmierung 6
M "Java Datei" Cannot be resolved to a variable Spiele- und Multimedia-Programmierung 2
1Spinne Minecraft Fabric Modding Java Error Spiele- und Multimedia-Programmierung 2
Joris Minecraft Minecraft Java Server Spiele- und Multimedia-Programmierung 6
Shanic Minecraft Minecraft Forge Server "Falsche Java Version" Spiele- und Multimedia-Programmierung 6
O Browser-basiertes online Pokerspiel mit Java Spiele- und Multimedia-Programmierung 1
M Spiel Mühle-Programmierung Java Spiele- und Multimedia-Programmierung 9
G VST-Plugins in Java verwenden Spiele- und Multimedia-Programmierung 0
P Audio Visualizer mit OpenGL in Java? Spiele- und Multimedia-Programmierung 4
P Snake Java Hilfe Spiele- und Multimedia-Programmierung 4
D Minecraft [Minecraft] Java Start Fehler (Core-Dump) Spiele- und Multimedia-Programmierung 1
T Welche packages aus der java api doku ist hilfreich zur Android Spieleprogrammierung Spiele- und Multimedia-Programmierung 2
A Programmieren eines Memorys mit Java (in Eclipse) Spiele- und Multimedia-Programmierung 5
L Sound in Java Spiel Spiele- und Multimedia-Programmierung 5
C Java findet FluidSynth nicht Spiele- und Multimedia-Programmierung 2
I Java Andere Fenster in Borderless-Mode setzen Spiele- und Multimedia-Programmierung 16
leon_krys Java-Bußgeldrechner Spiele- und Multimedia-Programmierung 5
G [Java/KryoNet/LibGDX] Mutliplayer Packet Frage Spiele- und Multimedia-Programmierung 2
P Website mit Java Backend? Spiele- und Multimedia-Programmierung 1
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
J Fertigungstechnik.. PLS HALP.. Quellcode vom Text in java-Klasse speichern Spiele- und Multimedia-Programmierung 2
E Kalah Java Implementation Spiele- und Multimedia-Programmierung 1
G [Java] Vereinfachung von Boolean Abfragen Spiele- und Multimedia-Programmierung 3
G [LibGDX/Java] ArrayList Object Speicher Spiele- und Multimedia-Programmierung 3
T Java 3D Spiele- und Multimedia-Programmierung 2
A Spielfelder erstellen mit Jogl Java durch ein Koordinaten Array Spiele- und Multimedia-Programmierung 1
J Java Buttons Spiele- und Multimedia-Programmierung 6
T Java Kalender Spiele- und Multimedia-Programmierung 5
Ice4P4rty Java Optische Oberfläche Spiele- und Multimedia-Programmierung 2
MABY Eine mp3 Datei in Java abspielen Spiele- und Multimedia-Programmierung 14
D Java Bomberman Probleme java.lang.NullPointerException Spiele- und Multimedia-Programmierung 1
N Spiele-Menü in Java Spiele- und Multimedia-Programmierung 9
J HDMI Ausgänge mit Java programmieren? Spiele- und Multimedia-Programmierung 18
H Yu-Gi-Oh! Mit Java was tun? Spiele- und Multimedia-Programmierung 6
S Pong java.lang.StackOverflowError Spiele- und Multimedia-Programmierung 3
C Java aus Klasse rausgehen Spiele- und Multimedia-Programmierung 2
MaxG. Java Internet Radio Spiele- und Multimedia-Programmierung 6
G [Java Server] Allgemeine Frage zum Thema Networking in Videospielen Spiele- und Multimedia-Programmierung 15
P java.lang.NoClassDefFoundError: in Greenfoot Spiele- und Multimedia-Programmierung 0
G Java Achsen invertieren Spiele- und Multimedia-Programmierung 2
G Java 2D Spiel mit LWJGL verbinden Spiele- und Multimedia-Programmierung 1
S Hilfe bei Java Gui Spiele- und Multimedia-Programmierung 2
D Java sound pulseaudio Spiele- und Multimedia-Programmierung 0
David Schwarzbeck Java 3 dimensionale Kollisions Abfrage Spiele- und Multimedia-Programmierung 2
M Gesellschaftsspiel Mühle in Java programmieren Spiele- und Multimedia-Programmierung 3
beatles Java Minesweeper - OS X und Win7 Unterschied Spiele- und Multimedia-Programmierung 2
D Minecraft Java JDK installiert - Minecraft läuft nichtmehr in 64 Bit Spiele- und Multimedia-Programmierung 2
E TMX - Dateien in Java laden Spiele- und Multimedia-Programmierung 1
K Erstellen eines Fotoalbums mit Java Spiele- und Multimedia-Programmierung 8
windl MoviePlayer in Java Spiele- und Multimedia-Programmierung 0
S 2D-Render Probleme LWJGL 2 (Java) Spiele- und Multimedia-Programmierung 1
F Klausurersatz: Ein Java-Programm erstellen und dieses präsentieren. Spiele- und Multimedia-Programmierung 2
E Java Jump and Run Map zu groß Spiele- und Multimedia-Programmierung 14
J programm mit java-plugin Spiele- und Multimedia-Programmierung 2
D Java Webgame, welche Frameworks oder Techs sind von Nöten? Spiele- und Multimedia-Programmierung 5
P Java 2D Bug? Spiele- und Multimedia-Programmierung 8
T Problem mit Eclipse (java)-(minecraft) Spiele- und Multimedia-Programmierung 3
R Java App sendet Midi Daten über Flash Spiele- und Multimedia-Programmierung 3
O Java Zeile aus Textdatei zufällig ausgeben Spiele- und Multimedia-Programmierung 8
K Bestes Bildformat für Spielegrafiken und deren Einbindung in Java Spiele- und Multimedia-Programmierung 2
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Spiele- und Multimedia-Programmierung 1
T Alle Referenzen zu einer Klasse aus Java Bytecode ersetzt, JVM sucht trotzdem diese Klasse Spiele- und Multimedia-Programmierung 1
J Java Kollisionsabfrage Spiele- und Multimedia-Programmierung 21
Flo. android java tastatureingaben abfangen. Spiele- und Multimedia-Programmierung 1
J Java Steuerberechnung hilfe Spiele- und Multimedia-Programmierung 17
C Export als .jar funktioniert nicht richtig (JAVA 3D) Spiele- und Multimedia-Programmierung 5
P Java Grafiken mit Rechnungen verknüpfen Spiele- und Multimedia-Programmierung 4
U Minecraft Mit Java auf Minecraft Server anmelden Spiele- und Multimedia-Programmierung 11
F Das sag mir einer Java ist plattform unabhänig ! Spiele- und Multimedia-Programmierung 10
C virtueller stereomix (java sound API) Spiele- und Multimedia-Programmierung 0
S Engine2D - Java 2D Engine Spiele- und Multimedia-Programmierung 20
C Java Kollisionserkennung Spiele- und Multimedia-Programmierung 4
U Blender in Java Spiele- und Multimedia-Programmierung 8
J Java Fussballspiel Player-KI in der Bewegungsphase Spiele- und Multimedia-Programmierung 4
K Java 15/Slide/Boss Puzzle Spiele- und Multimedia-Programmierung 2
T Java 3D - Step oder IGES Spiele- und Multimedia-Programmierung 1
H 3D Spiele mit Java - Diskussion Spiele- und Multimedia-Programmierung 35
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
M Bilder in Java Spiele- und Multimedia-Programmierung 7
A Minecraft Java Ubuntu Minecraft Server startet nicht - ERROR (SIGSEGV) Spiele- und Multimedia-Programmierung 7
N Minecraft java lernen minecraft Spiele- und Multimedia-Programmierung 20
J 2d Ansicht mit Java 3d Spiele- und Multimedia-Programmierung 13
F Abbyy finereader aus java starten, Ergebnis zurück? Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben