Page 1 sur 1

Rotation avec changement de l'éclairage

Publié : mar. 23/nov./2004 21:28
par Le Soldat Inconnu
Salut,

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 :lol:

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
Sinon, c'est plutot gourmand comme code, je vous conseille d'avoir une bonne config pour avoir un FPS conséquent (85 chez moi vu que mon écran est en 85HZ)

Publié : mar. 23/nov./2004 23:23
par filperj
Oui, amusant :D
Ça me semble pas si gourmand que ça, tant qu'il y a une carte 3D...

Suggestion: que le prog refuse de se fermer tant que l'utilisateur n'a pas remis les morceaux dans le bon ordre :twisted:

Publié : mer. 24/nov./2004 11:13
par Le Soldat Inconnu
On est pas sorti avec cette méthode :lol:
surtout si on avait l'explorateur d'ouvert sur un dossier vide, remettre en ordre des cases blanches, c'est très facile :mrgreen:

Re: Rotation avec changement de l'éclairage

Publié : mar. 03/mai/2011 22:41
par Le Soldat Inconnu
une petite mise à jour du code (compatible 7)

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

Global Ecran_Largeur, Ecran_Hauteur

#Rotation = 0.03
#Carre = 64
#Aleatoire = 750
#Pourcentage = 96
#IntensiteLumineuseBlanc = 200 ; entre 0 et 255
#IntensiteLumineuseNoir = 200 ; entre 0 et 255
#Attente = 5 ; Attente avant de faire l'inversion en seconde

Procedure.s GetWallpaper()
  lpcbData = 255 
  lpData.s = Space(255) 
  RegOpenKeyEx_(#HKEY_CURRENT_USER, "Control panel\Desktop", 0, #KEY_READ, @hKey)
  GetHandle = RegQueryValueEx_(hKey, "ConvertedWallpaper", 0, @lType, @lpData, @lpcbData)
	If lpData = "" Or FileSize(lpData) = -1
		lpcbData = 255 
		lpData.s = Space(255) 
		GetHandle = RegQueryValueEx_(hKey, "Wallpaper", 0, @lType, @lpData, @lpcbData)
	EndIf
  ProcedureReturn lpData
EndProcedure

Parametre.s = ProgramParameter()
Select Left(Parametre, 2)
  Case "/p" ; Pour l'aperçu en petit
    End
  Case "/s" ; Pour lancer normalement
    
  Case "/c" ; pour la configuration
    End
EndSelect

; On récupère la taille de l'écran
If ExamineDesktops()
  Ecran_Largeur = DesktopWidth(0)
  Ecran_Hauteur = DesktopHeight(0)
  ProfondeurCouleur = DesktopDepth(0)
  Raffraichissement = DesktopFrequency(0)
Else
  End
EndIf

; On fait une copie d'écran
; DC = GetDC_(0)
; CreateImage(0, Ecran_Largeur, Ecran_Hauteur)
; Dessin = StartDrawing(ImageOutput(0))
  ; BitBlt_(Dessin, 0, 0, Ecran_Largeur, Ecran_Hauteur, DC, 0, 0, #SRCPAINT | $40000000)
; StopDrawing()
; ReleaseDC_(0, DC)

UseJPEGImageDecoder()
LoadImage(0, GetWallpaper())
ResizeImage(0, Ecran_Largeur, Ecran_Hauteur)

; 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 9 ou supérieur.", 0)
  End
EndIf
Sprite3DQuality(0)

If OpenScreen(Ecran_Largeur, Ecran_Hauteur, ProfondeurCouleur, "Rotation", #PB_Screen_WaitSynchronization, Raffraichissement) = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran.", 0)
  End
EndIf

; Chargement des polices 
LoadFont(0, "Verdana", 14, #PB_Font_HighQuality | #PB_Font_Bold)

; On découpe la copie d'écran 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, $FF00FF)
    ; Temp = LoadSprite(#PB_Any, "test.bmp", #PB_Sprite_Texture)
    Ecran(n, nn)\x = #Carre * n + #Carre / 2 ; Position du centre du carré
    Ecran(n, nn)\y = #Carre * nn + #Carre / 2
    StartDrawing(SpriteOutput(Temp)) ; On dessine le carré
      DrawImage(ImageID(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)
  
  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 * Cpt_Image / Cpt_Image_Total) = 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 avec 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 peut inverser à 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
						Transparence = 255 - Int(#IntensiteLumineuseBlanc * (2 * #PI - Ecran(n, nn)\Angle) * 2 / #PI)
						If Transparence <> 255
							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
						EndIf
            ; 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'étant 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
                Attente = 1
              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 encore faire 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 la valeur inversion à 0 ce qui signifie que cette image image a déjà été échangée 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 encore faire 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 la valeur inversion à 0 ce qui signifie que cette image image a déjà été échangée pendant cette rotation
                    Ecran(n, nn)\Inversion = 0
                    Break 2
                  EndIf
                Next
              Next
              
            EndIf
            
          EndIf
        EndIf
      Next
    Next
  Stop3D()
  
  If Attente >= 1
    Attente + 1
  EndIf
  
  If Attente >= Raffraichissement * #Attente
    Objectif = 0 ; On mets les images dans le désordre
    Attente = 0
  EndIf
  
  ; On lit les évènements clavier et souris
  ExamineMouse()
  ExamineKeyboard()
  
  If KeyboardReleased(#PB_Key_F1)
		Debogage = 1 - Debogage
	EndIf
	If Debogage
    StartDrawing(ScreenOutput())
      ; Calcul du FPS
      #DefinitionFPS = 20
      Cpt + 1
      If Cpt = #DefinitionFPS
        Cpt = 0
        fps.f = #DefinitionFPS * 1000 / (ElapsedMilliseconds() - Temps)
        Temps = ElapsedMilliseconds()
      EndIf
			BackColor(0)
      FrontColor($FFFFFF)
      DrawText(0, 0, "FPS = " + StrF(fps, 1))
      DrawText(0, 20, "Cpt_Image = " + Str(Cpt_Image) + " / " + Str(Cpt_Image_Total))
      DrawText(0, 40, "Objectif = " + Str(Objectif))
    StopDrawing()
  EndIf
  
  
  ; Affichage de l'heure
  StartDrawing(ScreenOutput())
    TexteHeure.s = FormatDate("%hh:%ii:%ss", Date())
    ; DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(FontID(0))
    BackColor(0)
    DrawText(Ecran_Largeur - TextWidth(TexteHeure), Ecran_Hauteur - TextHeight(TexteHeure), TexteHeure, $FFFFFF)
  StopDrawing()
  
  FlipBuffers()
  
  If IsScreenActive() = 0
    End
  EndIf
  
Until (KeyboardPushed(#PB_Key_All) And KeyboardPushed(#PB_Key_F1) = 0) Or MouseDeltaX() <> 0 Or MouseDeltaY() <> 0


Re: Rotation avec changement de l'éclairage

Publié : jeu. 05/mai/2011 8:15
par Kwai chang caine
Juste pour info, j'ai une erreur mais c'est p'tete normal ligne 165 Sprite specifié non initialisé avec la 4.51 et la 4.60

Code : Tout sélectionner

 If SpriteHeight(Ecran(n, nn)\Sprite) <> RedimY
Pc portable Vista SP1

Re: Rotation avec changement de l'éclairage

Publié : jeu. 05/mai/2011 18:29
par Le Soldat Inconnu
c'est corrigé, merci :)

Re: Rotation avec changement de l'éclairage

Publié : jeu. 05/mai/2011 18:33
par venom
sympa en effet sauf que moi j'ai un dual screen :wink: par conséquent l'image est légèrement beaucoup écraser sur la largeur :P :lol:

Mais belle effet





@++

Re: Rotation avec changement de l'éclairage

Publié : ven. 06/mai/2011 7:49
par Kwai chang caine
Le Soldat Inconnu a écrit :c'est corrigé, merci :)
Merci à toi 8)
C'est splendide cet effet 8O
Nadine ça m'a mis le "WAÏ" à mon ecran :lol: :lol:

Encore merci :wink: