ich hab mich dazu entschlossen, meine 2 Prozeduren für 2D-Winkelsachen zu veröffentlichen.
Prozedur 1:
Dabei handelt es sich in der ersten Prozedur lediglich um die Errechnung eines Winkels im 360 Grad Bereich aus 2 Punkten. Wer also schnell und einfach den Winkel von Objekt 1 zu Objekt 2 sucht, der kann mit dieser Prozedur sich etwas Arbeit einsparen. (Gibt es schon mehrmals irgendwo aufgeschrieben, wollte es aber in Verbindung mit der 2ten Prozedur nochmals posten).
Der Rückgabewert ist der Winkel in Grad. Also von 0 - 360 Grad, wobei 360 Grad logischer Weise wieder 0 Grad ist. (keine Float sondern nur Ganzkomma-Werte).
Code: Alles auswählen
Procedure get_angle(start_x, start_y, end_x, end_y)
Protected angle.w
Protected delta_x.w
Protected delta_y.w
delta_x = start_x - end_x
delta_y = start_y - end_y
angle = (ATan(delta_y / delta_x) * 180 / 3.1415) * (-1)
If angle < 0
angle = 180 + angle
EndIf
If start_y < end_y
angle = 180 + angle
EndIf
If angle = 0 And start_x > end_x
angle = 180
EndIf
If angle = 180 And start_x < end_x
angle = 0
EndIf
ProcedureReturn angle
EndProcedure
Prozedur 2:
Die zweite Prozedur dient dazu, aus 2 Winkeln den kürzesten Weg zu errechnen. Als Beispiel nehme man eine Figur und die Maus. Die Figur soll sich zur Maus hin drehen. Jetzt ist es wichtig zu wissen, in welche Richtung sich die Figur drehen muss, damit der kürzeste Weg gewählt wird. Also entweder nach links oder nach rechts rum.
Diese Prozedur also errechnet aus Ausgangswinkel und neuem Zielwinkel die Drehrichtung, Rückgabewert ist entweder 0 für links herum oder 1 für rechts herum drehen.
Code: Alles auswählen
Procedure get_rotate_direction(start_angle, end_angle)
Protected temp.w
Protected temp2.w
If start_angle > end_angle
temp = start_angle - end_angle
temp2 = end_angle + (360 - start_angle)
If temp < temp2
ProcedureReturn 1 ;Rechtsrum ist kuerzester Weg
Else
ProcedureReturn 0 ;Linksrum ist kuerzester Weg
EndIf
Else
temp = end_angle - start_angle
temp2 = start_angle + (360 - end_angle)
If temp < temp2
ProcedureReturn 0 ;Linksrum ist kuerzester Weg
Else
ProcedureReturn 1 ;Rechtsrum ist kuerzester Weg
EndIf
EndIf
EndProcedure
Die Maus steht zur Figur um 90 Grad Winkel, also über der Figur. Die Figur schaut nach links, also 180 Grad gedreht. Gibt man nun die Werte 180 und 90 ein, so ergibt sich der Rückgabewert der Prozedur = 1, also nach rechts rotieren. Denn rechtsrum muss nur ein 90 Grad Winkel überbrückt werden, linksherum sind es dann 270 Grad um zum Ziel zu gelangen.
Hat man die Drehrichtung, könnte man jetzt die Figur in diese Richtung drehen lassen. Also eigentlich ganz einfach und nützlich wenn man ein 2D-Spiel macht, indem man die Figur per Maus drehen kann, oder die Figur zu einem bestimmten Punkt drehen will, aber nicht weiß, ob rechts rum oder links herum der kürzere Weg ist.
Um nun ein praktisches Anwendungsbeispiel zu geben, habe ich diesen Code erstellt:
http://derfeind2k.de/daten/rotate_prozedure.rar (1,65 Kilobyte)
Das erste Objekt im Beispielprogramm dreht sich immer automatisch zur Maus hin. Das zweite Objekt dreht sich nur dann, wenn die linke Maustaste gedrückt wird. Dabei nutzt sie die Prozedur 2 und errechnet den kürzesten Weg und dreht sich dann in die entsprechende Richtung. Links herum oder rechts herum, kommt darauf an wo sich die Maus befindet. Wichtig dabei, die linke Maustaste gedrückt halten zum rotieren lassen.
So, ich hoffe es finden sich Leute die damit etwas anfangen können. Gedacht ist das Ganze für 2D-Spiele indem man Winkel abfragt oder kürzeste Drehrichtungen benötigt.
mfg.
Sunny