Problème avec les sprites

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Problème avec les sprites

Message par Micoute »

Bonjour à tous, je viens encore solliciter votre aide bienveillante pour un petit problème de couleur de trans parence.

Pourquoi sur toutes les autres surfaces de dessin, le sprite est affiché correctement sans problème alors que sur le sprite c'est pas bon ?

On sait que c'est parce que le sprite est créé avec la couleur noire, et que PB n'affiche pas le noir car c'est la couleur transparente par défaut, sauf que si on crée le sprite avec une couleur de fond transparente, idem ici, la couleur transparente est considérée comme du noir...

Donc en fait, il faut créer le sprite sans couleur transparente, lui coller un fond d'une autre couleur, le blanc par exemple, ensuite coller notre image sur le sprite, puis dire à PB de ne pas afficher le blanc, là ça fonctionne ok, pourquoi faire simple quand on peut faire compliqué ?

Code : Tout sélectionner

If InitSprite() = 0
    MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
    End
  EndIf
  
  UsePNGImageDecoder()
  
  LoadImage(1, "Images\Personnage de face immobile.png")
  
  If OpenWindow(0, 0, 0, 300, 200, "Un écran dans une fenêtre...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonImageGadget(0, 170, 10, 100, 100, ImageID(1))
    ImageGadget(1, 170, GadgetY(0) + GadgetHeight(0) + 10, ImageWidth(1), ImageHeight(1), ImageID(1), #PB_Image_Border)
    
    If StartDrawing(WindowOutput(0))
        DrawAlphaImage(ImageID(1), GadgetX(1) + GadgetWidth(1) + 10, GadgetY(0) + GadgetHeight(0) + 10)
        StopDrawing()
      EndIf
      
    If OpenWindowedScreen(WindowID(0), 0, 0, 160, 160)
      CreateSprite(0, ImageWidth(1), ImageHeight(1))
      If StartDrawing(SpriteOutput(0))
        DrawAlphaImage(ImageID(1), 0, 0)
        StopDrawing()
      EndIf
    Else
      MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
      End
    EndIf
  EndIf

  Repeat

    Repeat
      Event = WindowEvent()
      
      Select Event 
        Case #PB_Event_Gadget
    
        
        Case #PB_Event_CloseWindow
          End 
      EndSelect
    Until Event = 0
  
    FlipBuffers() 
    ClearScreen(RGB(255, 255, 255))
    DisplayTransparentSprite(0, 50, 50)
    
    Delay(1)
    
  ForEver

http://www.aht.li/2678367/Nouveau_dossier.7z

Je vous remercie beaucoup tous par anticipation.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème avec les sprites

Message par falsam »

Ajoute le flag #PB_Sprite_AlphaBlending lors de la création ou du load du sprite et ton souci sera résolu.

:arrow: http://www.purebasic.com/french/documen ... prite.html
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Problème avec les sprites

Message par Micoute »

Merci falsam, j'ai essayé et ça ne change rien du tout !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème avec les sprites

Message par falsam »

J'ai modifié la couleur de fond de ton Screen

Code : Tout sélectionner

If InitSprite() = 0
    MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
    End
  EndIf
  
  UsePNGImageDecoder()
  
  LoadImage(1, "Images\Personnage de face immobile.png")
  
  If OpenWindow(0, 0, 0, 300, 200, "Un écran dans une fenêtre...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    ButtonImageGadget(0, 170, 10, 100, 100, ImageID(1))
    
    ImageGadget(1, 170, GadgetY(0) + GadgetHeight(0) + 10, ImageWidth(1), ImageHeight(1), ImageID(1), #PB_Image_Border)
    
    ;If StartDrawing(WindowOutput(0))
    ;    DrawAlphaImage(ImageID(1), GadgetX(1) + GadgetWidth(1) + 10, GadgetY(0) + GadgetHeight(0) + 10)
    ;    StopDrawing()
    ;  EndIf
      
    If OpenWindowedScreen(WindowID(0), 0, 0, 160, 160)
    ; CreateSprite(0, ImageWidth(1), ImageHeight(1))
      LoadSprite(0, "Images\Personnage de face immobile.png", #PB_Sprite_AlphaBlending)
    Else
      MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
      End
    EndIf
  EndIf

  Repeat

    Repeat
      Event = WindowEvent()
      
      Select Event 
        Case #PB_Event_Gadget
    
        
        Case #PB_Event_CloseWindow
          End 
      EndSelect
    Until Event = 0
  
    FlipBuffers() 
    ClearScreen(RGB(0, 0, 255))
    DisplayTransparentSprite(0, 50, 50)
    
    Delay(1)
    
  ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème avec les sprites

Message par falsam »

Une autre solution sans recharger l'image une seconde fois pour le sprite et de dessiner l'image, préalablement chargé pour ton bouton, dans le sprite. D'ailleurs je pense que je suis vraiment dans ta demande.

Code : Tout sélectionner

If InitSprite() = 0
    MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
    End
  EndIf
  
  UsePNGImageDecoder()
  
  LoadImage(1, "Images\Personnage de face immobile.png")
  
  If OpenWindow(0, 0, 0, 300, 200, "Un écran dans une fenêtre...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    ButtonImageGadget(0, 170, 10, 100, 100, ImageID(1))
    
    ImageGadget(1, 170, GadgetY(0) + GadgetHeight(0) + 10, ImageWidth(1), ImageHeight(1), ImageID(1), #PB_Image_Border)
    
      
    If OpenWindowedScreen(WindowID(0), 0, 0, 160, 160)
      CreateSprite(0, ImageWidth(1), ImageHeight(1), #PB_Sprite_AlphaBlending)
      
      StartDrawing(SpriteOutput(0))
      DrawingMode(#PB_2DDrawing_AllChannels )
      DrawImage(ImageID(1), 0, 0)
      StopDrawing()
      
    Else
      
      MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
      End
      
    EndIf
  EndIf

  Repeat
    Repeat
      Event = WindowEvent()
      
      Select Event 
        Case #PB_Event_Gadget
    
        
        Case #PB_Event_CloseWindow
          End 
      EndSelect
    Until Event = 0
  
    FlipBuffers() 
    ClearScreen(RGB(0, 0, 255))
    DisplayTransparentSprite(0, 50, 50)
    
    Delay(1)
    
  ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Problème avec les sprites

Message par Micoute »

Merci infiniment falsam, en voilà du bon code qui fonctionne bien !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre