Page 1 sur 1

Problème avec les sprites

Publié : ven. 12/juin/2015 14:14
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.

Re: Problème avec les sprites

Publié : ven. 12/juin/2015 14:27
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

Re: Problème avec les sprites

Publié : ven. 12/juin/2015 14:34
par Micoute
Merci falsam, j'ai essayé et ça ne change rien du tout !

Re: Problème avec les sprites

Publié : ven. 12/juin/2015 14:47
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

Re: Problème avec les sprites

Publié : ven. 12/juin/2015 14:57
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

Re: Problème avec les sprites

Publié : ven. 12/juin/2015 18:02
par Micoute
Merci infiniment falsam, en voilà du bon code qui fonctionne bien !