2015-05-12 6 views
7

Ich arbeite an einem einfachen 2D-Spiel mit Java, Swing und ohne Rahmen. Ich habe einen rechteckigen Player, den der Benutzer bewegen kann. Auf der Karte sind einige Hindernisse, die der Spieler nicht durchmachen darf. Ich habe das gemacht, indem ich ein neues Rectangle-Objekt für den Spieler und jedes Hindernis mit ihren Grenzen erstellt habe. Aber ich bin mir nicht sicher, ob das der richtige Weg ist. Es funktioniert, aber die Bewegungen des Spielers sind nicht wirklich benutzerfreundlich. Wenn der Spieler zwei Hindernisse überwinden will, muss er an den perfekten Koordinaten vorbeikommen.Java Spiel Hitbox Detection & Rounded Corners

Ist es sogar eine gute Idee, mit einem Rectangle-Objekt nach Überschneidungen zwischen dem Spieler und dem Hindernis zu suchen, oder sollte ich es anders machen?

Jetzt für meine zweite Frage:
Ich möchte die rechteckigen Hitboxen mit der gleichen Hitbox aber mit abgerundeten Ecken ersetzen, so dass der Spieler leichter passieren konnte.

My game with hitboxes enabled
So sieht das Spiel aus, wenn Hitboxen aktiviert sind.

Der Code, der Spieler und die Hindernisse überprüft, ob noch durchschnitten haben:

for (Player p : this.getPlayerArray()) { 
    Rectangle recPlayer = p.playerBounds(); 
     for (Obstacle kiste : obstacleArray) { 
      Rectangle recKiste = kiste.obstBounds(); 

      if (recPlayer.intersects(recKiste)) { 
       p.setX(100); //Not actual code here 
      } 
     } 
} 

Die Funktion, die die Hitbox des Spielers/Hindernis zurückgibt:

public Rectangle obstBounds() { 
    return new Rectangle(this.getX(), 
    this.getY(), image.getImage().getWidth(null), 
    image.getImage().getHeight(null)); 
} 
+0

Ich denke, dass Sie die Kollision basierend auf einem Kachel-Karten-System basieren können. – GiantTree

+1

@GiantTree So habe ich die Karte erstellt. Aber es ist alles selbst codiert. Gibt es einen Unterschied bei der Kartenerkennung? – Aruloci

+0

Nur zur Verdeutlichung: Bewegst du dich auf einer Kachelkarte oder gibt es freie Bewegung? Wenn sich Ihr Spieler auf einer Kachelkarte bewegt, können Sie einfach prüfen, ob die Kachel, auf die Sie sich bewegen möchten, passierbar ist und sich entsprechend bewegen. – GiantTree

Antwort

0

Vor vielen Jahren schrieb ich einen Khepera-Simulator als Teil des Abschlussjahrprojekts meiner Undergrads. Ich habe damit angefangen, Kollisionserkennung zu machen, das sind sich überschneidende Bereiche ... Mein Vorgesetzter ließ mich erkennen, dass, da die Form meines Roboters ein Kreis war, ich einfach überprüfen konnte, ob das Zentrum des Roboters in einer anderen Form war war der Fall eine Kollision aufgetreten.

Ihr Fall ist noch einfacher, da Sie auf Kacheln bewegen ... also entweder Sie (wie in den Kommentaren vorgeschlagen) eine Reihe von "move/no move" Kacheln beibehalten und überprüfen, oder Sie überprüfen nur, dass die Position deines Spielers ist innerhalb oder nicht, ein 'verbotenes' Rechteck, dh ein Hindernis. Wenn dies der Fall ist, müssen Sie die Position des Charakters auf 'außerhalb' des Hindernisses zurücksetzen (natürlich abzüglich der Begrenzungsbox des Charakters).

Ich empfehle dringend, die Kacheln zu machen: nur auf/ab zulassen/links/rechts Bewegungen und prüfen gegen eine 'verbotene' Reihe von Bewegungen gegeben eine Kachel-Position.Wenn du wirklich 'Freiheit' von Bewegungen haben willst, dann gehe mit Kreisen (Begrenzungsboxen/Kreisen), weil sie einfach zu verstehen sind, leicht einen Positionsreset (im Falle von Kollisionen) durchzuführen und perfekt für deinen Fall (jede Fliese kann ein enthalten) Kreis, ob ein Hindernis oder der Spieler.)

0

Es gibt viele Möglichkeiten, um zu gehen über Kollisionsprüfung, aber ich denke, ein einfacher Ansatz würde für Ihren Anwendungsfall gut tun.

Zuerst aus dem Aussehen Ihres Screenshots, eine Kachel ist entweder ein Hindernis oder passierbar, aber nie die Hälfte von jedem. In diesem Fall wäre es am einfachsten zu überprüfen, welche Fliese die Mitte (oder Füße, wählen Sie, was am besten aussieht) des Charakters sind.

Wenn es ein Hindernis ist, können sie t dorthin gehen, einfach so. Beachten Sie, dass dies dem Spieler ermöglicht, sich teilweise in ein Hindernis zu bewegen, aber viele Spiele machen es auf diese Weise und die Spieler sind sicherlich an dieses Verhalten gewöhnt, besonders in 2D-Spielen mit Grafiken, die wie eine isometrische Projektion aussehen Klasse als). Eine Variante davon wäre, das Spieler-Kollisionsrechteck einfach kleiner zu machen (sagen wir eine halbe Kachel, wiederum zentriert auf der Brust oder den Füßen der Spielersprites).