(der text ist urheberrechtlich geschützt, also dürft ihr ihn mir nicht nachtragen !
2 Prozeduren für 2D-Spiele - Winkel
-
Robert Wünsche
- Beiträge: 243
- Registriert: 29.08.2004 12:46
- Wohnort: Irgendwo im nirgendwo
- Kontaktdaten:
stimmt!Kaeru Gaman hat geschrieben:... aber geht auch einfacher:
Code: Alles auswählen
Procedure angle_is_close ( angle1.l, angle2.l, range.l )
If angle1+angel2 >= 0 And angle1 <= 360 And angle2 <= 360
Diff = Int(Abs(angle1-angle2))
ProcedureReturn (Diff < range)
Else
ProcedureReturn -1
EndIf
EndProcedure
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
...und als kleine zugabe :
...diese proc gibt null aus, wenn einer der beiden winkel <0 oder >360 ist,
oder wenn beide winkel gleich sind...
sonst den zu drehenden winkel...
Code: Alles auswählen
;**********************************************************
Procedure get_rotate_angle ( start_angle.l, end_angle.l )
Result.l
If start_angle >= 0 And start_angle <= 360 And end_angle >= 0 And end_angle <= 360
sign.l
Diff.l
Diff = end_angle-start_angle ; die Winkel-differenz
sign = 1
If Diff < 0 : Diff = -Diff : sign = -sign : EndIf
If Diff > 180 : Diff = 360-Diff :sign =-sign: EndIf
; den längeren weg genommen ? dann jetzt den kürzeren...
Result = sign*Diff
Else
Result = 0
EndIf
ProcedureReturn Result
EndProcedure
;**********************************************************
;testwerte hier einsetzen
a = 335
b = 25
d = get_rotate_angle( a, b )
out$ = "start_angle = " + Str(a) + Chr(10)
out$ + "end_angle = " + Str(b) + Chr(10)
out$ + "to rotate = " + Str(d)
MessageRequester("get_rotate_angle Testrun", out$ , 0)
oder wenn beide winkel gleich sind...
sonst den zu drehenden winkel...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
@MLK:
ich habe PB 3.30... wenn ich mich recht entsinne, ging abs() nur mit floats (oder wars nich mit floats ???
)
... und die boole'schen ausdrücke funzen nich richtig...
sonst hätte ichs auch in eine zeile gepackt...
@Sunny
wollte dich ja auch nich vorführen....
... und wie du siehst, hat MLK noch einen draufgesetzt...
ich habe PB 3.30... wenn ich mich recht entsinne, ging abs() nur mit floats (oder wars nich mit floats ???
... und die boole'schen ausdrücke funzen nich richtig...
sonst hätte ichs auch in eine zeile gepackt...
@Sunny
wollte dich ja auch nich vorführen....
... und wie du siehst, hat MLK noch einen draufgesetzt...
Zuletzt geändert von Kaeru Gaman am 11.11.2004 19:05, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
abs() liefert ne float zurück, int() macht sie dann wieder ganz. und boolsche ausdrücke gehen scheinbar nur mit floats nicht.
Code: Alles auswählen
Debug 3<6
Debug 2.1<2.0
Zuletzt geändert von MLK am 11.11.2004 19:08, insgesamt 1-mal geändert.
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Bin ich jetzt zu blöd um das System zu verstehen, oder wie soll das Funktionieren?MLK hat geschrieben:stimmt!Kaeru Gaman hat geschrieben:... aber geht auch einfacher:
Code: Alles auswählen
Procedure angle_is_close ( angle1.l, angle2.l, range.l ) If angle1+angel2 >= 0 And angle1 <= 360 And angle2 <= 360 Diff = Int(Abs(angle1-angle2)) ProcedureReturn (Diff < range) Else ProcedureReturn -1 EndIf EndProcedure
Code: Alles auswählen
Procedure angle_is_close ( angle1.l, angle2.l, range.l )
If angle1+angel2 >= 0 And angle1 <= 360 And angle2 <= 360
Diff = Int(Abs(angle1-angle2))
ProcedureReturn (Diff < range)
Else
ProcedureReturn -1
EndIf
EndProcedure
Debug angle_is_close(300, 291, 2)
Debug angle_is_close(300, 303, 2)
Debug angle_is_close(300, 301, 2)Mir gibt deine Prozedur nur immer den Range-Wert zurück, was soll ich denn damit anfangen?
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
HA!
sage ich doch... boole'sche ausdrücke funzen nich richtig....
.... erst testen, dann posten
@MLK schönes beispiel... mit konstanten funzt es ja auch... nur nich mit variablen
@Sunny:
normalerweise sollte ein ausdruck in klammern seinen true/false wert liefern: boole'sche ausdrücke..
(5=5) = true = 1
(5=6) = false = 0
sage ich doch... boole'sche ausdrücke funzen nich richtig....
.... erst testen, dann posten
@MLK schönes beispiel... mit konstanten funzt es ja auch... nur nich mit variablen
@Sunny:
normalerweise sollte ein ausdruck in klammern seinen true/false wert liefern: boole'sche ausdrücke..
(5=5) = true = 1
(5=6) = false = 0
Zuletzt geändert von Kaeru Gaman am 11.11.2004 19:17, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
tatsache.. das geht nur solange ohne variablen gearbeitet wird:
und der hier sollte aber gehen:
Code: Alles auswählen
x=5
y=4
Debug 23*(x<4)
Debug 23*(x>4)
Debug 23*(5<4)
Debug 23*(5>4)
Debug 23*(x<y)
Debug 23*(x>y)
Debug 23*(5<y)
Debug 23*(5>y)
und der hier sollte aber gehen:
Code: Alles auswählen
Procedure angle_is_close ( angle1.l, angle2.l, range.l )
If angle1>= 0 And angle2 >= 0 And angle1 <= 360 And angle2 <= 360
Diff = Int(Abs(angle1-angle2))
If Diff <= range
ProcedureReturn 1
EndIf
Else
ProcedureReturn -1
EndIf
EndProcedure
Zuletzt geändert von MLK am 11.11.2004 21:13, insgesamt 3-mal geändert.
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22