PureBoard
https://www.purebasic.fr/german/

[Mini-Tut] Animation per Sprite3D: rollender Ball
https://www.purebasic.fr/german/viewtopic.php?f=9&t=19661
Seite 1 von 2

Autor:  Kaeru Gaman [ 06.04.2009 16:23 ]
Betreff des Beitrags:  [Mini-Tut] Animation per Sprite3D: rollender Ball

nur mal ein winziges Beispielchen für Neueinsteiger.

Code:
InitSprite()
InitKeyboard()
InitSprite3D()

; heute mal nur ein Windowed-Screen
; anstatt eines Fullscreens
OpenWindow( 0, #PB_Ignore,0, 400,300, "Animations-Demo")
  OpenWindowedScreen( WindowID(0), 0,0, 400,300, 0,0,0 )

; jetzt erzeugen wir einen lustigen bunten Ball als Sprite

CreateSprite( 0, 128, 128, #PB_Sprite_Texture )
  TransparentSpriteColor( 0, RGB( 255, 0, 255 ) ) ; Transparenzfarbe PUR
  StartDrawing( SpriteOutput(0) )
    Box(0,0,128,128, RGB( 255, 0, 255 ) ) ; Hintergrund in PUR
    For n=0 To 31
      Circle( 64+n, 64+n, 64 - 2*n, RGB( 0, 8*n, 248) )
    Next
  StopDrawing()

; nur mal vorzeigen, wie der Ball aussieht
DisplayTransparentSprite( 0, 136, 86 )
; für 1.5 sec
FlipBuffers()
Delay( 1500 )

; jetzt machen wir'n Sprite3D draus, um den Ball rotieren zu können
CreateSprite3D( 0, 0 )

BallX.l = -128
BallY.l = 170
BallR.l = 0
SetFrameRate(60)
Repeat
;************************************ 
; Eventhandling wird fürn WindowedScreen gebraucht,
; fürn Fullscreen ist das überflüssig.
  Repeat
    Event = WaitWindowEvent(10)
    If Event = #PB_Event_CloseWindow
      EXIT = 1
    EndIf
  Until Event = #Null
;************************************
 
  ClearScreen( $200810 )          ; Screen löschen
  ; Farbe ist RGB( 16, 8, 32 ) als HEX geschrieben
 
  BallR = (BallR + 1) % 360  ; Ball Rotation um #PI erhöhen und auf 360° beschränken
  BallX +1                        ; BallX um 1 erhöhen
  If BallX > 400                  ; rechts verschwunden?
    BallX = -128                  ; links außen hinsetzen
  EndIf
;********
  Start3D()
    RotateSprite3D( 0, BallR, 0 )       ; aktuelle Rotation
    DisplaySprite3D( 0, BallX, BallY )  ; anzeigen
  Stop3D()
;********
  FlipBuffers( #PB_Screen_SmartSynchronization )
Until EXIT

[edit] Drehungsschritte auf 3° geändert.

[edit2] Drehungsschritte auf 1° geändert.

Autor:  Fluid Byte [ 06.04.2009 16:47 ]
Betreff des Beitrags: 

Neiß. :D

Autor:  RSBasic [ 06.04.2009 16:48 ]
Betreff des Beitrags: 

@KG
Bild

Autor:  KeyKon [ 06.04.2009 17:50 ]
Betreff des Beitrags: 

Damit das ganze bei allen Roll-Geschwindigkeiten gut aussieht sollte man die Rotation vom Radius und der Bewegung abhängig machen, so kann man zum Beispiel schön Beschleunigungen simulieren, zum Beispiel wie auf einer schiefen Ebene:


Code:
InitSprite()
InitKeyboard()
InitSprite3D()

; heute mal nur ein Windowed-Screen
; anstatt eines Fullscreens
OpenWindow( 0, #PB_Ignore,0, 800,600, "Animations-Demo")
  OpenWindowedScreen( WindowID(0), 0,0, 800,600, 0,0,0 )

; jetzt erzeugen wir einen lustigen bunten Ball als Sprite


BallUmfang.d = 64*2*#PI ;Umfang des Balls ausrechnen

CreateSprite( 0, 128, 128, #PB_Sprite_Texture )
  TransparentSpriteColor( 0, RGB( 255, 0, 255 ) ) ; Transparenzfarbe PUR
  StartDrawing( SpriteOutput(0) )
    Box(0,0,128,128, RGB( 255, 0, 255 ) ) ; Hintergrund in PUR
    For n=0 To 31
      Circle( 64+n, 64+n, 64 - 2*n, RGB( 0, 8*n, 248) )
    Next
  StopDrawing()


; jetzt machen wir'n Sprite3D draus, um den Ball rotieren zu können
CreateSprite3D( 0, 0 )

BallX.d = -128
BallY.d = 170
BallR.d = 0
Mov.d = 1
SetFrameRate(60)
Repeat
;************************************
; Eventhandling wird fürn WindowedScreen gebraucht,
; fürn Fullscreen ist das überflüssig.
  Repeat
    Event = WaitWindowEvent(10)
    If Event = #PB_Event_CloseWindow
      EXIT = 1
    EndIf
  Until Event = #Null
;************************************
 
  ClearScreen( $200810 )          ; Screen löschen
  ; Farbe ist RGB( 16, 8, 32 ) als HEX geschrieben
 
  Mov*1.02                        ; Bewegunggeschwindigkeit potenzieren
  BallX + Mov                     ; Waagrechte Bewegung hinzufügen
  BallY = BallX*3/4               ; Senkrechte Position im Verhältnis zur Waagrechte Position setzen
  BallR = (BallR + (Mov*BallUmfang/360)) ; DrehungsWinkel im Verhältnis zur BallBewegung und Umfang dazurechnen
 
  If BallR > 360                  ; ist der Winkel über 360°
    BallR-360                     ; wieder auf 0 setzen...
  EndIf
 
  If BallX > 900                  ; rechts unten verschwunden?
    BallX = -128                  ; links oben hinsetzen
    Mov = 1
  EndIf
;********
  Start3D()
    RotateSprite3D( 0, BallR, 0 )       ; aktuelle Rotation
    DisplaySprite3D( 0, BallX, BallY )  ; anzeigen
  Stop3D()
;********
  FlipBuffers( #PB_Screen_SmartSynchronization )
Until EXIT

Autor:  Kaeru Gaman [ 07.04.2009 15:08 ]
Betreff des Beitrags: 

nette idee.

... ich habe den eindruck, dass die bewegung abschnittsweise schneller wird, sehe allerdings in dem code nichts, was das erklären könnte.

bei so berechnungen wie
Code:
(BallR + (Mov*BallUmfang/360))
musst du echt mit dem typecasting aufpassen, da das bei PB nicht immer völlig selbsterklärend ist.
für BallUmfang auch eine Float zu nehmen, würde schon helfen, ich würde sogar für ALLE Werte Doubles vorziehen.

Autor:  Crawler [ 07.04.2009 15:16 ]
Betreff des Beitrags: 

Code:
Mov*1.02

sollte für die Beschleunigung sorgen, oder?

[edit] Komma durch Punkt ersetzt...

Autor:  Kaeru Gaman [ 07.04.2009 15:41 ]
Betreff des Beitrags: 

Crawler hat geschrieben:
Code:
Mov*1,02

sollte für die Beschleunigung sorgen, oder?

1.02 ist die Beschleunigung, allerdings solltest du einen Dezimalpunkt verwenden, kein Komma.

Autor:  KeyKon [ 07.04.2009 16:08 ]
Betreff des Beitrags: 

Jo, hab mal noch alles auf Double umgeschrieben, stimmt schon, bei solchen Single-Berechnungen kann man eigentlich immer getrost Double statt Float nehmen...

Autor:  Andesdaf [ 07.04.2009 16:31 ]
Betreff des Beitrags: 

nette Sache :D

Autor:  bobobo [ 07.04.2009 16:43 ]
Betreff des Beitrags: 

Noch netter wär's, wenn der Ball aus 2 Bällen bestünde. Einer
der sich dreht (Gittermuster z.B.) und einer der fix mitläuft (Reflexion)

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/