2017-01-22 5 views
0

Two RectanglesStopp zwei Rechtecke aus

Diese kleine Welt sich schneid enthält eine Person (blaues Rechteck), und einen Baum (großes grünes Rechteck). Die Person kann durch Drücken der Tasten nach oben, unten, links, rechts auf der Tastatur gesteuert werden. Das blaue Rechteck bewegt sich nur, wenn die Tasten gedrückt werden. Das blaue Rechteck darf nicht aus der Karte verschwinden (d. H. Darf nicht aus dem grauen Bereich herauskommen) und darf das grüne Rechteck nicht überlappen.

Ich bin der Methode bewusst von den blauen Rechteck zu verhindern, dass die Grauzone aussteigen:

if (blueRect.rightEdge >= (canvas.width - 1)) { 
    // Don't allow going further to the right 
    // But allow going up, down, and to the left 
} 

// Check the same thing for the other sides of the grey area 

Was ich nicht sicher bin, ist, wie die beiden Rechtecke aus sich kreuz zu verhindern. Two Rectangles

In der obigen Abbildung, wie kann ich "deaktivieren" nach rechts gehen (um eine Kreuzung zu verhindern)? Ich wäre immer noch gerne in der Lage, nach oben, nach unten und nach links zu gehen.

+0

über Kollisionserkennung erfahren? Ich bin mir sicher, dass es genug Tutorials und Ressourcen gibt, die Sie mit der Suchmaschine Ihrer Wahl finden können. – UnholySheep

+0

@UnholySheep Das Problem ist, dass die meisten Tutorials zeigen, wie man Kreuzungen erkennt. Ich brauche keine Überschneidungen zu erkennen. Ich muss Kreuzungen verhindern. – Flux

+0

Das nennt man "Kollisionsauflösung" - das ist der nächste Schritt nach dem Erkennen einer Kollision. Wenn Sie eine Überschneidung verhindern möchten, müssen Sie zuerst feststellen, dass eine passiert, wenn Sie Ihr Objekt verschieben. – UnholySheep

Antwort

3

Mit was Sie zu tun haben heißt collision detection. Ich glaube nicht, dass es eine einfache Antwort gibt, die immer zutrifft.

jedoch in Ihrem Fall, da Sie einfache Rechtecke haben, können Sie überprüfen, ob eine der vier Ecken des KLEINER Rechteck innerhalb des GRÖSSER Rechteck ist.

Wenn Sie nicht wissen, welche kleiner und welche größer ist, können Sie in beide Richtungen prüfen (d. H. Ist die Ecke von Rechteck A innerhalb von Rechteck B und dann, wenn die Ecke von Rechteck B innerhalb von Rechteck A ist). Stellen Sie sicher, dass Sie> = und < = verwenden, um diese lästige Randbedingung zu erfassen.

Vielleicht so etwas wie dies angemessen ist (Pseudo-Code):

nextLocation = translate(rectangleA, "up") 
if (isIntersecting(rectangleB, nextLocation)) { 
    error("collision!") 
} else { 
    rectangleA = nextLocation 
} 
+0

Aber würde Ihre vorgeschlagene Methode keine Kreuzung erzeugen? Das Problem mit einer Kreuzung ist, dass, wenn ich den rechten Knopf drücke und mit etwas kollidiere, es keine Möglichkeit gibt, zu wissen, dass der richtige Weg, um aus dem Durcheinander zu kommen, ist, indem man den linken Knopf drückt. – Flux

+0

Sie möchten feststellen, ob die angeforderte Bewegung zu einer Kreuzung führen würde. Wenn dies der Fall ist, verweigern Sie diese Bewegung basierend auf "Kollision". Vergiss nicht - das ist kein einfaches Thema, mit dem du es zu tun hast. –