Rosace 2D Sprite Demo

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Rosace 2D Sprite Demo

Message par Guimauve »

Bonjour à tous !

Je viens de terminer une petite SpriteDemo similaire à celle de Danillo.

Il est possible que le compilateur vous signale qu'il manque des commandes, si ça arrive décommenter lignes 100 à 116 inclusivement.

Le code est en anglais, mais il est facile à suivre.

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Exemple : Rosace 2D Sprite Demo
; Author : Guimauve
; Date : 05-08-2006
; Last Update : 05-08-2006
; Coded for PureBasic V4.00
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; AUTOMATICALLY GENERATED CODE, DO NOT MODIFY
; UNLESS YOU REALLY, REALLY, REALLY MEAN IT !!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Structure declaration >>>>>

Structure Sprite
   
   id.l
   Radius.l
   Theta.l
   PositionX.w
   PositionY.w
   
EndStructure

; <<<<<<<<<<<<<<<<<<<<
; <<<<< Mutators >>>>>

Macro SetSpriteID(ObjetA, P_ID)
   
   ObjetA\id = P_ID
   
EndMacro

Macro SetSpriteRadius(ObjetA, P_Radius)
   
   ObjetA\Radius = P_Radius
   
EndMacro

Macro SetSpriteTheta(ObjetA, P_Theta)
   
   ObjetA\Theta = P_Theta
   
EndMacro

Macro SetSpritePositionX(ObjetA, P_PositionX)
   
   ObjetA\PositionX = P_PositionX
   
EndMacro

Macro SetSpritePositionY(ObjetA, P_PositionY)
   
   ObjetA\PositionY = P_PositionY
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Observators >>>>>

Macro GetSpriteID(ObjetA)
   
   ObjetA\id
   
EndMacro

Macro GetSpriteRadius(ObjetA)
   
   ObjetA\Radius
   
EndMacro

Macro GetSpriteTheta(ObjetA)
   
   ObjetA\Theta
   
EndMacro

Macro GetSpritePositionX(ObjetA)
   
   ObjetA\PositionX
   
EndMacro

Macro GetSpritePositionY(ObjetA)
   
   ObjetA\PositionY
   
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code generated in : 16 ms <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Customs Macro - Uncomment if needed >>>>>

; Macro RandomMinMax(min, max)
; 
;   (max - Random(max - min))
;
; EndMacro
; 
; Macro RGBColor(Red, Green, Blue)
;
;    (((Blue << 8 + Green) << 8) + Red)
; 
; EndMacro
; 
; Macro DegToRad(Angle)
;
;   (Angle * #PI / 180)
;
; EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Constants and variables >>>>>

Screen_W = GetSystemMetrics_(#SM_CXSCREEN)
Screen_H = GetSystemMetrics_(#SM_CYSCREEN)

#Quantity = 500
#SpriteSize = 12
#MinRadius = 200
#MaxRadius = 500
 
Dim SpriteList.Sprite(#Quantity)

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Initialize DirectX >>>>>

If InitKeyboard() = 0 Or InitSprite() = 0 
   MessageRequester("ERROR","Cant initialize DirectX!",#MB_ICONERROR)
   End 
EndIf 

; <<<<<<<<<<<<<<<<<<<<<<
; <<<<< OpenScreen >>>>>

If OpenScreen(Screen_W, Screen_H, 32, "Rosace 2D Sprite Demo") = 0 
   If OpenScreen(Screen_W, Screen_H, 24, "Rosace 2D Sprite Demo") = 0 
      If OpenScreen(Screen_W, Screen_H, 16, "Rosace 2D Sprite Demo") = 0 
         MessageRequester("ERROR", "Cant open DirectX screen!", #MB_ICONERROR)
         End
      EndIf
   EndIf
EndIf 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Create 21 differents Sprites >>>>>

For SpriteID = 0 To 20 
   
   If CreateSprite(SpriteID, #SpriteSize, #SpriteSize) 
      StartDrawing(SpriteOutput(SpriteID)) 
      Circle(#SpriteSize >> 1, #SpriteSize >> 1, #SpriteSize >> 1, RGBColor(RandomMinMax($50, $FF), RandomMinMax($50, $FF), RandomMinMax($50, $FF))) 
      StopDrawing() 
   Else 
      CloseScreen() 
      MessageRequester("ERROR","Cant create Sprite!",#MB_ICONERROR)
      End 
   EndIf 
   
Next  

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Animation Setup >>>>>

For Index = 0 To #Quantity
   
   SetSpriteID(SpriteList(Index), Random(20))
   SetSpriteRadius(SpriteList(Index), RandomMinMax(#MinRadius, #MaxRadius))
   SetSpriteTheta(SpriteList(Index), Random(1800))
   
Next 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Run Sprite Demo >>>>>

Repeat 
   
   FlipBuffers() 
   ExamineKeyboard() 
   
   If IsScreenActive() 
      
      ClearScreen(0)
      
      For Index = 0 To #Quantity
         
         ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
         ; We compute a new positions and we display sprites to 
         ; their new positions.
         
         SetSpritePositionX(SpriteList(Index), GetSpriteRadius(SpriteList(Index)) * Sin(8*DegToRad(GetSpriteTheta(SpriteList(Index))) /5) * Cos(DegToRad(GetSpriteTheta(SpriteList(Index)))) + (Screen_W / 2))
         SetSpritePositionY(SpriteList(Index), GetSpriteRadius(SpriteList(Index)) * Sin(8*DegToRad(GetSpriteTheta(SpriteList(Index))) /5) * Sin(DegToRad(GetSpriteTheta(SpriteList(Index)))) + (Screen_H / 2))
         
         DisplaySprite(GetSpriteID(SpriteList(Index)), Int(GetSpritePositionX(SpriteList(Index))), Int(GetSpritePositionY(SpriteList(Index))))
         
         ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
         ; We prepare the next loop. If Theta angle are bigger than 
         ; 1800°, we set it to 0. We also change the Radius.
         
         SetSpriteTheta(SpriteList(Index), GetSpriteTheta(SpriteList(Index))+ 1)
         
         If GetSpriteTheta(SpriteList(Index)) > 1800
            SetSpriteTheta(SpriteList(Index), 0)
            SetSpriteRadius(SpriteList(Index), RandomMinMax(#MinRadius, #MaxRadius))
         EndIf
         
      Next 
      
   Else 
      
      Delay(10) 
      
   EndIf 
   
Until KeyboardPushed(#PB_Key_Escape) 

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Il manque DegToRad pour continuer la compilation
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

@Denis
faut décomenter la macro

sinon faut pas regarder le centre de l'écran sous pein de choper la migraine

Dri :10:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Dr. Dri a écrit :@Denis
faut décomenter la macro

sinon faut pas regarder le centre de l'écran sous pein de choper la migraine

Dri :10:
Merci,

j'avais oublié quelques lignes :D
Répondre