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:
In der update() Methode wird dann abgefragt, ob der Spieler-Sprite mit einem der blockierenden Tiles kollidieren würde.
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.
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.