Mit Winkeln arbeiten

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag von Jilocasin »

Falls dich's interessiert....
Hier was, wo du vielleicht was rauskopieren kannst:

Code: Alles auswählen

InitSprite()
InitSprite3D()
InitKeyboard()

OpenScreen(1024,768,16,"Test")

CreateSprite(0,32,32,#pb_sprite_texture)
StartDrawing(SpriteOutput(0))
  Box(0,0,32,32,$FFFFFF) ; Der weiße Hintergrund
  Box(8,0,16,16,$808080) ; Die graue Box
StopDrawing()

CreateSprite3D(0,0)

pi.f = 3.14159265
direction.f= 0
Speed = 2
x.f = 512
y.f = 384

Repeat
  ExamineKeyboard()
  ClearScreen(0,0,0)
  
  If KeyboardPushed(#pb_key_right)
    direction + 2 ; Die Richtung wird gedreht
  EndIf
  If KeyboardPushed(#pb_key_left)
    direction - 2 ; Die Richtung wird gedreht
  EndIf
  
  If KeyboardPushed(#pb_key_up)
    x + Cos(direction*2*pi/360)*Speed ; Bewegung
    y + Sin(direction*2*pi/360)*Speed ; Bewegung
  EndIf
  
  If KeyboardPushed(#pb_key_down)
    x - Cos(direction*2*pi/360)*Speed ; Bewegung
    y - Sin(direction*2*pi/360)*Speed ; Bewegung
  EndIf
  
  Start3D()
    DisplaySprite3D(0,x,y)
    RotateSprite3D(0,direction,0)
  Stop3D()
  
  FlipBuffers()
Until KeyboardReleased(#pb_key_escape)

End
Bild
Rockmaster
Beiträge: 105
Registriert: 28.04.2006 22:19

Beitrag von Rockmaster »

Danke der Code sieht schon Welten besser aus!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Jilocasin hat geschrieben:

Code: Alles auswählen

direction.f= 0
...
  If KeyboardPushed(#pb_key_right)
    direction + 2 ; Die Richtung wird gedreht
  EndIf
  If KeyboardPushed(#pb_key_left)
    direction - 2 ; Die Richtung wird gedreht
  EndIf
dazu eine anmerkung:

es wäre praktisch, ein If direction >/< einzubauen.

hintergrund:
wenn du ein paar hundert mal in die selbe richtung drehst, wird der winkelwert so hoch, dass die winkeländerung der ungenauigkeit der float zum opfer fällt.
auch bei integer würdest du im extremfall ein overflow riskieren.

grundsätzlich immer höchstwerte abfragen.


außerdem:
komplexe rechnungen kann man aus performancegründen zusammenfassen:

Code: Alles auswählen

pi.f = 3.14159265 
fact.f = 2*pi/360
angl.f = 0

...

  If KeyboardPushed(#pb_key_up)
    angl = direction*fact 
    x + Cos(angl)*Speed ; Bewegung 
    y + Sin(angl)*Speed ; Bewegung 
  EndIf 

und für fortgeschrittene:
die Sinus/Cosinus-funktionen sind weit langsamer als ein vorberechnetes Array:
http://www.purebasic.fr/german/viewtopic.php?t=5884
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag von Jilocasin »

Ich weiß.
Hab ich bei meinen Programmen ja auch gemacht.
Hab jetzt nur aus Zeitgründen das nicht extra hingeschrieben.

Trotzdem nützlich dein Code.
Bild
Rockmaster
Beiträge: 105
Registriert: 28.04.2006 22:19

Beitrag von Rockmaster »

Da ich kein aufwenidiges 3D-game progge kann es mir egal sein ob sin langsamer ist als ein array aber trotzdem danke!

Wie hoch sollte der Winkelwert denn sein damit ich ihn wieder auf 0 setzen sollte?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Wie hoch sollte der Winkelwert denn sein damit ich ihn wieder auf 0 setzen sollte?

*räusper*

wenn du wie hier in dem beispiel mit *2pi/360 arbeitest, hat dein vollkreis natürlich 360 grad.

natürlich kannst du auch mit 512 grad arbeiten*, dann rechnest du eben *2pi/512,
das hat den vorteil, dass du kein >/< braucht,
sondern einfach überschreitungen abschneidest mit

Code: Alles auswählen

 direction & 511 
(* oder mit jeder beliebigen anderen zweierpotenz)


PS:
> Da ich kein aufwenidiges 3D-game progge kann es mir egal sein ob sin langsamer ist als ein array aber trotzdem danke!

wenn du viele sprites hast, bei denen du winkelberechnungen durchführst kann das schon auf die performance gehen, grad wenn du umständlich rechnest, und auch sonst nicht extrem auf die performance achtest...
probiers halt einfach aus, du wirst schon merken, bei welchem aufwand deine framerate in den keller geht, dann kannste ja die ganzen tricks einbaun... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Rockmaster
Beiträge: 105
Registriert: 28.04.2006 22:19

Beitrag von Rockmaster »

Ok werds mir merken THX
Antworten