Seite 1 von 2

[Mini-Tut] Animation per Sprite3D: rollender Ball

Verfasst: 06.04.2009 16:23
von Kaeru Gaman
nur mal ein winziges Beispielchen für Neueinsteiger.

Code: Alles auswählen

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.

Verfasst: 06.04.2009 16:47
von Fluid Byte
Neiß. :D

Verfasst: 06.04.2009 16:48
von RSBasic
@KG
Bild

Verfasst: 06.04.2009 17:50
von KeyKon
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: Alles auswählen

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

Verfasst: 07.04.2009 15:08
von Kaeru Gaman
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: Alles auswählen

(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.

Verfasst: 07.04.2009 15:16
von Crawler

Code: Alles auswählen

Mov*1.02
sollte für die Beschleunigung sorgen, oder?

[edit] Komma durch Punkt ersetzt...

Verfasst: 07.04.2009 15:41
von Kaeru Gaman
Crawler hat geschrieben:

Code: Alles auswählen

Mov*1,02
sollte für die Beschleunigung sorgen, oder?
1.02 ist die Beschleunigung, allerdings solltest du einen Dezimalpunkt verwenden, kein Komma.

Verfasst: 07.04.2009 16:08
von KeyKon
Jo, hab mal noch alles auf Double umgeschrieben, stimmt schon, bei solchen Single-Berechnungen kann man eigentlich immer getrost Double statt Float nehmen...

Verfasst: 07.04.2009 16:31
von Andesdaf
nette Sache :D

Verfasst: 07.04.2009 16:43
von bobobo
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)