Kollisionserkennung in Slick2D... Mal wieder

Sessiolog

Mitglied
Moin Leute! Ich habe eine Frage zum Thema Kollisionserkennung zwischen Spieler und Map im 2D-Raum. Zurzeit arbeite ich mit Slick2D an einen kleinen Sidescroller und komme nicht mehr weiter. Also:
Zuerst wird mit einer zweifachen for(...)-Schleife die extern erstellte Map nach blockierenden Tiles abgesucht. Diese blockierenden Tiles werden dann als Rectangles in einer ArrayList gespeichert.
Das sieht dann so aus:
Java:
blocks = new ArrayList<Rectangle>();
for (int row = 0; row < tilemap.getWidth(); row++) {
	for (int col = 0; col < tilemap.getHeight(); col++) {
		line = tilemap.getTileProperty(tilemap.getTileId(row,col,0),"blocked", "false");
		if (line.equals("true") {
			blocks.add(new Rectangle(row * TILESIZE, col * TILESIZE, TILESIZE, TILESIZE));
		}
	}
}

In der update() Methode wird dann abgefragt, ob der Spieler-Sprite mit einem der blockierenden Tiles kollidieren würde.
Java:
public void update(GameContainer arg0, int delta)
	if (Keyboard.isKeyDown(Keyboard.KEY_W)) {
		if (!isBlocked()) { y -= delta * 0.1;} 
	}
		
	if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
		if (!isBlocked()) { y += delta * 0.1;}
	}
			
	if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
		if (!isBlocked()) { x -= delta * 0.1;}
	}
				
	if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
		if (!isBlocked()) {x += delta * 0.1;}
	}
}

boolean isBlocked() {
        for (int a = 0; a < blocks.size(); a++) {
               if (hitbox.intersects(blocks.get(a))) { //hitbox ist das Rectangle welches den Sprite umgibt
			return true;
		}
	}
	return false;
}

Das Problem: Sobald man mit einer blockierenden Tile kollidiert, ist man als Spieler völlig unfähig, sich überhaupt zu bewegen. Der Spieler steckt fest. Das Problem ließe sich natürlich beheben indem man im Falle einer Kollision, den Sprite ein bisschen zurück-bewegt, nur leider entsteht dadurch ein unangenehmes Flackern, weil der Sprite ständig um einen Pixel vor-und-zurück geschoben wird.. So als ob der Sprite "zittern" würde. Der hier demonstrierte Code, wird von vielen Online-Tutorials empfohlen. Scheinbar funktioniert das jedem nur nicht bei mir. Was habe ich falsch gemacht?
Über Hilfe in jeglicher Form wäre ich sehr dankbar.
 

Androbin

Bekanntes Mitglied
Das kannst du ganz einfach folgendermaßen lösen:
1. Du speicherst die aktuelle Position nochmal in einer lokalen Variable
2. Du bewegst den Spieler gemäß ...
3. Du prüfst, ob der Spieler kollidiert
3.1 Falls ja, setzte die Position auf das in 1. erstellte "Backup" zurück
3.2 Falls nein, bist du fertig

PS. Das ganze solltest du allerdings einmal für jede Koordinate machen,
sonst kannst du nicht an einem Hindernis "entlanggehen"!
 

Sessiolog

Mitglied
Danke schon mal für die Antwort. Leider funktioniert dein Vorschlag nicht so ganz, vielleicht habe ich es auch einfach nur falsch gemacht. Was die "Backup"-Variablen betrifft: Warum müssen die denn Lokal sein? Global würde hier doch mehr Sinn machen.
Java:
public void update(GameContainer arg0, int delta) throws SlickException {
		if (Keyboard.isKeyDown(Keyboard.KEY_W)) {
			if (!isBlocked()) {
				y -= delta * 0.1;
				yC = y;     //"Backup"-Variable für den Y-Wert. Global.
			} 
			else y = yC;
		}
		
		if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
			if (!isBlocked()) {
				y += delta * 0.1;
				yC = y;		
			}
			else y  = yC;
		}
			
		if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
			if (!isBlocked()) {
				x -= delta * 0.1;
				xC = x;     //"Backup"-Variable für den X-Wert. Global.
			}
			else x = xC;
		}
				
		if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
			if (!isBlocked()) {
				x += delta * 0.1;
				xC = x;
			}
			else x = xC;
		}
	}

Leider existiert der Fehler weiterhin. Sobald ich als Spieler mit der Map kollidiere stecke ich fest. hilfe?
 

Androbin

Bekanntes Mitglied
Danke schon mal für die Antwort. Leider funktioniert dein Vorschlag nicht so ganz, vielleicht habe ich es auch einfach nur falsch gemacht. Was die "Backup"-Variablen betrifft: Warum müssen die denn Lokal sein? Global würde hier doch mehr Sinn machen.
...
Leider existiert der Fehler weiterhin. Sobald ich als Spieler mit der Map kollidiere stecke ich fest. hilfe?
Nochmal von vorne! Was macht die Methode isBlocked() und müsstest das dann nicht so aussehen?:
Java:
...

if ( Keyboard.isKeyDown( Keyboard.KEY_W ) ) {
    
    yC = y;
    y -= delta * 0.1;
    
    if ( isBlocked() )
    	 y = yC;
    
}

...
 
Zuletzt bearbeitet:

Sessiolog

Mitglied
Wunderschön! Jetzt funktioniert es, Vielen Dank!
PS: Was die isBlocked() Methode betrifft: Die wurde schon in meinem ersten Post erwähnt. Sieht nach wie vor so aus:
Java:
boolean isBlocked() {
	for (int a = 0; a < blocks.size(); a++) {
		if (hitbox.intersects(blocks.get(a))) { //"hitbox" ist das Rechteck, welches den Sprite umgibt
			return true;
		}
	}
		
	return false;
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Kollisionserkennung und -behandlung Spiele- und Multimedia-Programmierung 3
N Kollisionserkennung Spiele- und Multimedia-Programmierung 5
BraunBerry Java Game verbesserte Kollisionserkennung Spiele- und Multimedia-Programmierung 18
Cromewell JavaFX Kollisionserkennung Spiele- und Multimedia-Programmierung 6
S Jump 'n' Run-Spiel Kollisionserkennung Spiele- und Multimedia-Programmierung 3
C Java Kollisionserkennung Spiele- und Multimedia-Programmierung 4
Androbin Pixel-genaue Kollisionserkennung Spiele- und Multimedia-Programmierung 5
Kenan89 Kollisionserkennung - Idee Spiele- und Multimedia-Programmierung 5
T Kollisionserkennung mit AABBs und Spielerobjekt Spiele- und Multimedia-Programmierung 4
P Kollisionserkennung Spiele- und Multimedia-Programmierung 6
R Java3D Kollisionserkennung und Schwerkraft Spiele- und Multimedia-Programmierung 17
Apo Kollisionserkennung bei Jump'n'Run Spiele- und Multimedia-Programmierung 69
B Kollisionserkennung bei gezeichneten Objekten Spiele- und Multimedia-Programmierung 2
M Kollisionserkennung optimieren Spiele- und Multimedia-Programmierung 7
M Kollisionserkennung Spiele- und Multimedia-Programmierung 4
E Probleme mit Kollisionserkennung ! Spiele- und Multimedia-Programmierung 2
P Kollisionserkennung Spiele- und Multimedia-Programmierung 3
R Kollisionserkennung funktioniert nicht Spiele- und Multimedia-Programmierung 3
C Kollisionserkennung Spiele- und Multimedia-Programmierung 3
B HILFE bei Spieleprogrammierung mit Slick2D Spiele- und Multimedia-Programmierung 9
G Vektor2f Slick2d Spiele- und Multimedia-Programmierung 2
G Slick2D SpriteSheet drehen in kuckrichtung Spiele- und Multimedia-Programmierung 1
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
S Slick2D KeyInput reagiert nicht. Spiele- und Multimedia-Programmierung 3
D Landkarte mit Slick2D Spiele- und Multimedia-Programmierung 4
J [Slick2D] Anti Aliasing erzeugt Dreiecke Spiele- und Multimedia-Programmierung 4
L [Slick2D] Problem bei Speicherfreigabe Spiele- und Multimedia-Programmierung 2
S [SLICK2D] Rendern erzwingen Spiele- und Multimedia-Programmierung 4
O Thread pausieren und wieder starten Spiele- und Multimedia-Programmierung 2
T [LWJGL] Textur / File wieder freigeben Spiele- und Multimedia-Programmierung 4
C Schon wieder ein Mastermind Spiele- und Multimedia-Programmierung 0
1 JOGL: Fensterinhalt verschwindet sofort wieder Spiele- und Multimedia-Programmierung 3
baddestpoet Animation startet bei gedrückter Taste immer wieder von vorn Spiele- und Multimedia-Programmierung 12
aze Java 3D : 3D Objekte speichern und später wieder einlesen Spiele- und Multimedia-Programmierung 9
J JOGL - Bild wird immer wieder weiß Spiele- und Multimedia-Programmierung 2
Apo ApoPrism - Bringe die Sterne wieder zum Leuchten Spiele- und Multimedia-Programmierung 19
D Map wieder Tilemap =( Spiele- und Multimedia-Programmierung 4
A Ich mal wieder :-) - Problem mit Interpolatoren Spiele- und Multimedia-Programmierung 3
D wieder einer von anfang an. Spiele- und Multimedia-Programmierung 4

Ähnliche Java Themen

Neue Themen


Oben