voilà, j'ai fait un joli écran de veiile basé sur la rotation de carré (pas une rotation suivant l'axe Z perpendiculaire à l'écran mais une rotation sur l'axe X) avec un léger effet de lumière tout simple.
Attention, c'est un écran de veille alors éviter de danser la samba avec votre souris

Pour obtenir des infos au cour du fonctionnement, faire F1 (c'est les infos de débogguage)
Code : Tout sélectionner
Structure InfoSprite
x.l ; Position X
y.l ; Position Y
Sprite.l ; Numéro du sprite
Angle.f ; Angle de rotation
Inversion.l ; Inverser l'image avec une autre
Etat.b ; Etat d'affichage
x_Origine.l ; Position d'orignie de l'image
y_Origine.l
Cpt.b ; Savoir si l'image a été compter comme déplacée
EndStructure
#Rotation.f = 0.03
#Carre = 64
#Aleatoire = 750
#RapportAleatoire = 6
#Pourcentage = 96
#IntensiteLumineuseBlanc = 100 ; entre 0 et 255
#IntensiteLumineuseNoir = 80 ; entre 0 et 255
; On récupère la taille de l'écran
If ExamineDesktops()
Ecran_Largeur = DesktopWidth(0)
Ecran_Hauteur = DesktopHeight(0)
ProfondeurCouleur = DesktopDepth(0)
Else
End
EndIf
; On fait une copie d'écran
DC = GetDC_(0)
CreateImage(0, Ecran_Largeur, Ecran_Hauteur)
Dessin = StartDrawing(ImageOutput())
BitBlt_(Dessin, 0, 0, Ecran_Largeur, Ecran_Hauteur, DC, 0, 0, #SRCPAINT | $40000000)
StopDrawing()
ReleaseDC_(0, DC)
; On ouvre l'openscreen
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSprite3D() = 0
MessageRequester("Erreur", "Impossible d'initialiser la souris ,le clavier ou l'écran. Vérifiez la présence de DirectX 7 ou supérieur.", 0)
End
EndIf
Sprite3DQuality(0)
If OpenScreen(Ecran_Largeur, Ecran_Hauteur, ProfondeurCouleur, "Rotation") = 0
MessageRequester("Erreur", "Impossible d'ouvrir l'écran.", 0)
End
EndIf
; On découpe la copie d'acran en carré
CarreX = Round(Ecran_Largeur / #Carre, 1) - 1 ; Nombre de carré
CarreY = Round(Ecran_Hauteur / #Carre, 1) - 1
Dim Ecran.InfoSprite(CarreX, CarreY) ; On redim la liste des sprites
For n = 0 To CarreX
For nn = 0 To CarreY
Temp = CreateSprite(#PB_Any, #Carre, #Carre, #PB_Sprite_Texture) ; Création du sprite
TransparentSpriteColor(Temp, 255, 0, 255)
; Temp = LoadSprite(#PB_Any, "test.bmp", #PB_Sprite_Texture)
Ecran(n, nn)\x = #Carre * n + #Carre / 2 ; Positoion du centre du carré
Ecran(n, nn)\y = #Carre * nn + #Carre / 2
StartDrawing(SpriteOutput(Temp)) ; On dessine le carré
DrawImage(UseImage(0), -Ecran(n, nn)\x + #Carre / 2, -Ecran(n, nn)\y + #Carre / 2)
StopDrawing()
Ecran(n, nn)\Sprite = CreateSprite3D(#PB_Any, Temp)
Ecran(n, nn)\Angle = 0
Ecran(n, nn)\Etat = 1
Ecran(n, nn)\Inversion = 1
Ecran(n, nn)\x_Origine = n
Ecran(n, nn)\y_Origine = nn
Next
Next
; On crée un sprite blanc
CreateSprite(1, #Carre, #Carre, #PB_Sprite_Texture)
StartDrawing(SpriteOutput(1))
Box(0, 0, #Carre, #Carre, $FFFFFF)
StopDrawing()
CreateSprite3D(0, 1)
; Compteur
Cpt_Image_Total = (CarreX + 1) * (CarreY + 1) ; Nombre d'image total
Cpt_Image = 0 ; Nombre d'image n'étant plus à sa place d'origine
Objectif = 0 ; Objectif recherché
; = 0 si on veut mettre toutes les images dans le désordre
; = 1 si on veut remettre les images à leur place d'origine
Repeat
ClearScreen(0, 0, 0)
Start3D()
For n = 0 To CarreX
For nn = 0 To CarreY
If Ecran(n, nn)\Angle <> 0 Or (Random(#Aleatoire) = 0 And Objectif = 0) Or (Random(#Aleatoire / #RapportAleatoire) = 0 And Objectif = 1 And (n <> Ecran(n, nn)\x_Origine Or nn <> Ecran(n, nn)\y_Origine)) ; On fait tourner la case et on lance la rotation en aléatoire
; Si l'angle est supérieur à 0 donc si on est en train de faire tourner le sprite
; ou
; on veut mettre dans le désordre et on choisit un sprite à faire tourner au hazard
; ou
; on veut remettre les sprites dans le bon ordre et on choisit un sprite à faire tourner au hazard si celui-ci n'est pas à la bonne place
Ecran(n, nn)\Angle + #Rotation ; On augmente l'angle pour faire tourner le sprite
If Ecran(n, nn)\Angle >= 2 * #Pi ; Si on a fait un tour complet, on arrête la rotation
Ecran(n, nn)\Angle = 0
EndIf
EndIf
RedimY = Cos(Ecran(n, nn)\Angle) * #Carre ; On redimensionne l'image pour donner l'effet d'une rotation
If RedimY > 0 ; Si la taille est supérieur à 0 donc si l'image est à l'endroit car donc un tour complet, l'image se retrouve forcément à l'envers
Ecran(n, nn)\Etat = 1 ; Etat de l'image : 1 = à l'endroit
Ecran(n, nn)\Inversion = 1 ; On dit qu'on peutinverser à nouveau l'image avec une autre lors de la prochaine rotation
; On joue avec l'éclairage de la pièce qui tourne
If Ecran(n, nn)\Angle < #Pi
Transparence = 255 - Int(#IntensiteLumineuseNoir * Ecran(n, nn)\Angle * 2 / #Pi)
; Quand on commence la rotation de l'image, on la fonce de plus en plus car elle est de moins en moins éclairé.
; Pour foncé l'image, on joue avec la transparence de l'image sur un fond noir.
Else
ZoomSprite3D(0, #Carre, RedimY)
DisplaySprite3D(0, Ecran(n, nn)\x - #Carre / 2, Ecran(n, nn)\y - RedimY / 2, 255) ; On affiche du blanc sous le sprite
Transparence = 255 - Int(#IntensiteLumineuseBlanc * (2 * #Pi - Ecran(n, nn)\Angle) * 2 / #Pi)
; Quand on finit la rotation de l'image, on l'éclaircie au départ car elle est très bien éclairé jusqu'à revenir a un éclairage normal.
; Pour éclaircir l'image, on joue avec la transparence de l'image sur un fond blanc, doù le sprite blanc affiché ci-dessus.
EndIf
ZoomSprite3D(Ecran(n, nn)\Sprite, #Carre, RedimY)
DisplaySprite3D(Ecran(n, nn)\Sprite, Ecran(n, nn)\x - #Carre / 2, Ecran(n, nn)\y - RedimY / 2, Transparence) ; On affiche le Sprite3D
; On compte le nombre d'image n'atant plus à sa place
If Ecran(n, nn)\Cpt ; Si l'image a déjà été déplacé
If n = Ecran(n, nn)\x_Origine And nn = Ecran(n, nn)\y_Origine ; Si l'image est revenu à sa place
Ecran(n, nn)\Cpt = 0
Cpt_Image - 1
If Cpt_Image = 0 ; Quand toutes les images sont à leur place
Objectif = 0 ; On mets les images dans le désordre
EndIf
EndIf
Else ; Sinon
If n <> Ecran(n, nn)\x_Origine Or nn <> Ecran(n, nn)\y_Origine ; Si l'image n'est plus à sa place
Ecran(n, nn)\Cpt = 1
Cpt_Image + 1
If Cpt_Image = Cpt_Image_Total * #Pourcentage / 100 ; Quand un certain pourcentage des images ne sont plus à leur place
Objectif = 1 ; On remet les images dans l'ordre
EndIf
EndIf
EndIf
Else
Ecran(n, nn)\Etat = -1 ; Etat de l'image : -1 = à l'envers
If Ecran(n, nn)\Inversion = 1 ; Si on peut inverser l'image avec une autre
If Objectif = 1
i = Ecran(n, nn)\x_Origine
ii = Ecran(n, nn)\y_Origine
If Ecran(i, ii)\Inversion = 1 And Ecran(i, ii)\Etat = -1 And (i <> n Or ii <> nn)
; L'inversion se fait uniquement sur 2 images à l'envers (donc que l'on ne voit pas) et si on peut encorefaire l'inversion
; On échange simplement les numéros de sprite et la position d'origine de l'image
Temp = Ecran(n, nn)\Sprite
Ecran(n, nn)\Sprite = Ecran(i, ii)\Sprite
Ecran(i, ii)\Sprite = Temp
Temp = Ecran(n, nn)\x_Origine
Ecran(n, nn)\x_Origine = Ecran(i, ii)\x_Origine
Ecran(i, ii)\x_Origine = Temp
Temp = Ecran(n, nn)\y_Origine
Ecran(n, nn)\y_Origine = Ecran(i, ii)\y_Origine
Ecran(i, ii)\y_Origine = Temp
Ecran(i, ii)\Inversion = 0 ; On met lavaleur inversuion à 0 ce qui signifie que cette image image a déjà été échanger pendant cette rotation
Ecran(n, nn)\Inversion = 0
EndIf
Else
For i = 0 To CarreX ; On cherche une autre image avec laquelle on peut faire l'inversion
For ii = 0 To CarreY
If Ecran(i, ii)\Inversion = 1 And Ecran(i, ii)\Etat = -1 And (i <> n Or ii <> nn) ; Si on peut faire l'inversion
; L'inversion se fait uniquement sur 2 images à l'envers (donc que l'on ne voit pas) et si on peut encorefaire l'inversion
; On échange simplement les numéros de sprite et la position d'origine de l'image
Temp = Ecran(n, nn)\Sprite
Ecran(n, nn)\Sprite = Ecran(i, ii)\Sprite
Ecran(i, ii)\Sprite = Temp
Temp = Ecran(n, nn)\x_Origine
Ecran(n, nn)\x_Origine = Ecran(i, ii)\x_Origine
Ecran(i, ii)\x_Origine = Temp
Temp = Ecran(n, nn)\y_Origine
Ecran(n, nn)\y_Origine = Ecran(i, ii)\y_Origine
Ecran(i, ii)\y_Origine = Temp
Ecran(i, ii)\Inversion = 0 ; On met lavaleur inversuion à 0 ce qui signifie que cette image image a déjà été échanger pendant cette rotation
Ecran(n, nn)\Inversion = 0
Break 2
EndIf
Next
Next
EndIf
EndIf
EndIf
Next
Next
Stop3D()
; On lit les évènements clavier et souris
ExamineMouse()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_F1)
StartDrawing(ScreenOutput())
; Calcul du FPS
#DefinitionFPS = 20
Cpt + 1
If Cpt = #DefinitionFPS
Cpt = 0
FPS.f = #DefinitionFPS * 1000 / (ElapsedMilliseconds() - Temps)
Temps = ElapsedMilliseconds()
EndIf
FrontColor(0, 0, 0)
Locate(0, 0)
DrawText("FPS = " + StrF(FPS, 1))
Locate(0, 20)
DrawText("Cpt_Image = " + Str(Cpt_Image) + " / " + Str(Cpt_Image_Total))
Locate(0, 40)
DrawText("Objectif = " + Str(Objectif))
StopDrawing()
EndIf
FlipBuffers()
If IsScreenActive() = 0
End
EndIf
Until (KeyboardPushed(#PB_Key_All) And KeyboardPushed(#PB_Key_F1) = 0) Or MouseDeltaX() <> 0 Or MouseDeltaY() <> 0