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 <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<