2016-05-15 15 views
0

Ich habe ein großes Fenster, in dem ich Grafiken in Form von Sprites anzeigen. Ich habe ein Problem, mit dem ich mich befassen muss:Teilen Grafikfenster mit Linien und sagen, welche Sprites auf welcher Seite ist

Angenommen, ich möchte eine "Wand" in diesem Fenster zeichnen. Die Wand darf nur aus vertikalen und horizontalen Linien bestehen. Zum Beispiel kann eine Wand wie eine "Treppe" aussehen, aber sie könnte auch wie die Buchstaben "L" "|" "_". Angenommen, die Enden dieser Wand (Anfang und Ende) sind entweder mit einer Wand oder mit der Kante des Grafikfensters verbunden.

Jetzt möchte ich sagen, welches Sprite auf welcher Seite dieser Wand ist. Jedes Mal, wenn ich das Fenster mit einer Wand teile, möchte ich wissen, welches Sprite auf welcher Seite gelandet ist.

Gibt es einen Algorithmus oder eine Methode, die ich verwenden könnte, um darüber zu gehen?

Antwort

0

Sie können die X- und Y-Koordinaten des Sprite-Rect einstellen und einfach größer als und kleiner als für die horizontalen und vertikalen Wände verwenden. Geben Sie dem Sprite ein Rechteck wie hier beschrieben: http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Sprite und setzen Sie die Attribute rect.x und rect.y und verwenden Sie diese, um das Sprite zu positionieren.

Für eine diagonale Wand müssten Sie sowohl x als auch y testen, um zu sehen, auf welcher Seite sie sich befindet.

1

Vector Cross Produkt zu finden, welche Seite einen Punkt ist

zu sagen, wird ein Punkt links oder rechts einer Linie erhalten Sie das Kreuzprodukt der Linie und Punkt. Sie müssen die Linie so übersetzen, dass ihr Anfang am Ursprung liegt, und den Punkt gleichmäßig verschieben. Dann erhält man das Kreuzprodukt und wenn der Wert negativ ist, dann ist der Punkt links (gegen den Uhrzeigersinn), wenn der Wert 0 ist, dann ist der Punkt auf der Linie, und wenn der Wert positiv ist, ist der Punkt rechts (im Uhrzeigersinn) der Linie.

So eine Linie

x1 = 100; // line start coord 
y1 = 100; 
x2 = 300; // line end coord 
y2 = 300; 

px = 300; // the point to test 
py = 100; 

// first translate the line and point so that the line start is at 0,0 
px = px - x1; 
py = py - y1; 
x2 = x2 - x1; // no need to move the start as dont need it after translation 
y2 = y2 - y1; 

// And now just the cross product 

cross = x2 * py - y2 * px; 
if(cross < 0){ // point is left of line 
if(cross > 0){ // point is right of line 
else { // point is on the line 

Das indem jede Ecke wiederum an einem Sprite anzupassen einfach ist. Wenn Sie zu irgendeinem Zeitpunkt einen Punkt auf der anderen Seite als alle vorherigen Punkte finden, wissen Sie, dass das Sprite auf der Linie ist und auf weitere Tests verzichten kann.

Für mehr über das Kreuzprodukt siehe wiki