[Mini-Tut] Animation per Sprite3D: rollender Ball

Hier kannst du häufig gestellte Fragen/Antworten und Tutorials lesen und schreiben.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

[Mini-Tut] Animation per Sprite3D: rollender Ball

Beitrag 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.
Zuletzt geändert von Kaeru Gaman am 07.04.2009 00:26, insgesamt 2-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Neiß. :D
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@KG
Bild
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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
Zuletzt geändert von KeyKon am 07.04.2009 16:07, insgesamt 1-mal geändert.
(\/) (°,,,°) (\/)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Crawler
Beiträge: 110
Registriert: 08.02.2009 19:52
Computerausstattung: PB 4.41
Win7 64bit

Beitrag von Crawler »

Code: Alles auswählen

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

[edit] Komma durch Punkt ersetzt...
Zuletzt geändert von Crawler am 07.04.2009 15:46, insgesamt 1-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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...
(\/) (°,,,°) (\/)
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

nette Sache :D
Win11 x64 | PB 6.00 (x64)
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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)
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten