Seite 2 von 2

Verfasst: 01.06.2006 12:38
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

Verfasst: 01.06.2006 14:35
von Rockmaster
Danke der Code sieht schon Welten besser aus!

Verfasst: 01.06.2006 15:23
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

Verfasst: 01.06.2006 17:23
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.

Verfasst: 01.06.2006 17:29
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?

Verfasst: 01.06.2006 19:33
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... ;)

Verfasst: 01.06.2006 20:47
von Rockmaster
Ok werds mir merken THX