2 Prozeduren für 2D-Spiele - Winkel

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Robert Wünsche
Beiträge: 243
Registriert: 29.08.2004 12:46
Wohnort: Irgendwo im nirgendwo
Kontaktdaten:

Beitrag von Robert Wünsche »

ich benutze andere nur in extremen ausnamefällen !
(der text ist urheberrechtlich geschützt, also dürft ihr ihn mir nicht nachtragen ! :mrgreen: )
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag von MLK »

Kaeru Gaman hat geschrieben:... aber geht auch einfacher:
stimmt!

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

Beitrag von Kaeru Gaman »

...und als kleine zugabe :

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)
...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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@MLK:

ich habe PB 3.30... wenn ich mich recht entsinne, ging abs() nur mit floats (oder wars nich mit floats ??? :freak: )

... 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.
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag von MLK »

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

Beitrag von Kaeru Gaman »

...neee...

hab eben gerade die koordinatenbegrenzung ausprobiert:

x + stp + 832*(x<-32) - 832*(x>800)

x ist als long definiert... funzt nich... oder hab ich mich da verproggt ?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

MLK hat geschrieben:
Kaeru Gaman hat geschrieben:... aber geht auch einfacher:
stimmt!

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 
Bin ich jetzt zu blöd um das System zu verstehen, oder wie soll das Funktionieren?

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)
Ich erhalte alle 3 Mal den Wert 2 zurück, was soll ich denn bitte damit anfangen? Bei den ersten beiden Beispielen ist der Abstand größer, somit müsste das Ergebnis doch 0 oder -1 oder sowas sein. Beim 3ten Debugg ist es in der Reichweite, dennoch ist der Rückgabewert 2. Wie soll ich nun diese 2 von den anderen beiden unterscheiden? :?
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

Beitrag von Kaeru Gaman »

HA!

sage ich doch... boole'sche ausdrücke funzen nich richtig....

.... erst testen, dann posten :wink:

@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.
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag von MLK »

tatsache.. das geht nur solange ohne variablen gearbeitet wird:

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

Beitrag von Kaeru Gaman »

... und damit ist es praktisch nutzlos....

... sagt jemand fred bescheid ?


fred ? bescheid !
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten