Rotation avec changement de l'éclairage

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Rotation avec changement de l'éclairage

Message 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)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Rotation avec changement de l'éclairage

Message 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

Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Rotation avec changement de l'éclairage

Message 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
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Rotation avec changement de l'éclairage

Message par Le Soldat Inconnu »

c'est corrigé, merci :)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Rotation avec changement de l'éclairage

Message 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





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Rotation avec changement de l'éclairage

Message 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:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre