Page 1 sur 1

[Resolu]Bug graphique ? (sur certain PC)

Publié : mer. 22/avr./2009 20:18
par scaraber
Bonjour,

Voila je rencontre un bug que dont je ne trouve pas d'explication:
J'ai pour un projet une macro qui permet de générer des "fenêtre" et chez un copain le bug suivant apparaît
http://img12.imageshack.us/img12/1/buggraphique.png
Chez moi la fenêtre apparaît parfaitement et d'autre potes aussi.
Le bug est présent en mode 16 et 32 bit

Le code est ici:
http://subversion.assembla.com/svn/pomm ... tWindow.pb

Et voici les image:
http://code.assembla.com/pommo/subversi ... system.png
http://code.assembla.com/pommo/subversi ... cursor.png

Voila si quelqu'un a une idée sur le problèmes...

++
Scaraber

Publié : mer. 22/avr./2009 20:28
par Anonyme
n'utilise pas des "clips" mais des sprite à part entière. Fait le découpage à coup de grabsprite.

@+

Publié : mer. 22/avr./2009 20:35
par scaraber
Daccord merci je vais regarder sa.

Publié : mer. 22/avr./2009 21:15
par scaraber
Apres modification mon pote a toujours ce bug

Code : Tout sélectionner


InitSprite()
InitSprite3D()
UsePNGImageDecoder()
Enumeration
  #SpriteWindow
  #SpriteWindowPart
  #SpriteWindowBack
  #SpriteWindowBack3D
  #SpriteCoinHG
  #SpriteCoinHD
  #SpriteCoinBG
  #SpriteCoinBD
  #SpriteBas
  #SpriteDroit
  #SpriteGauche
  #SpriteHaut
  #SpriteSBas
  #SpriteSDroit
  #SpriteSGauche
  #SpriteSHaut
  #WindowTest
  #WindowTest2
EndEnumeration


;-Ouverture de la fenetre
OpenWindow(0,0,0,800,600,"test ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)

;-


LoadSprite(#SpriteWindowPart,"Image\Skin\system.png")
TransparentSpriteColor(#SpriteWindowPart,RGB(0,255,0))

LoadSprite(#SpriteWindowBack,"Image\Skin\system.png",#PB_Sprite_Texture)
TransparentSpriteColor(#SpriteWindowBack,RGB(0,255,0))
StartDrawing(SpriteOutput(#SpriteWindowBack))
  Box(128,0,64,128,RGB(0,255,0))
StopDrawing()
CreateSprite3D(#SpriteWindowBack3D,#SpriteWindowBack)


;-Macro

Macro DrawWindow(id,Posx,Posy,WindowLargeur,WindowHauteur,TransCoef)
  If id=#Null
    spriteid=#SpriteWindow
    If IsSprite(spriteid)
      FreeSprite(spriteid)
    EndIf 
  Else
    spriteid=id  
  EndIf
  If Not IsSprite(spriteid)
    CreateSprite(spriteid,WindowLargeur,WindowHauteur,#PB_Sprite_Texture)
    TransparentSpriteColor(spriteid,RGB(0,255,0))
    
    UseBuffer(#SpriteWindowPart)
    
    GrabSprite(#SpriteCoinHG  ,128,0,8,8)
    GrabSprite(#SpriteCoinHD  ,184,0,8,8)
    GrabSprite(#SpriteCoinBG  ,128,56,8,8)
    GrabSprite(#SpriteCoinBD  ,184,56,8,8)
    
    GrabSprite(#SpriteHaut    ,144,0,32,8)
    GrabSprite(#SpriteBas     ,144,56,32,8)
    GrabSprite(#SpriteDroit   ,128,16,8,32)
    GrabSprite(#SpriteGauche  ,184,16,8,32)
    
    GrabSprite(#SpriteSHaut   ,144,0,1,8)
    GrabSprite(#SpriteSBas    ,144,56,1,8)
    GrabSprite(#SpriteSDroit  ,128,16,8,1)
    GrabSprite(#SpriteSGauche ,184,16,8,1)
    
    UseBuffer(spriteid)
    ClearScreen(RGB(0,255,0))
    
    ;Contour (coin)
    DisplaySprite(#SpriteCoinHG,0,0)
    DisplaySprite(#SpriteCoinBG,0,WindowHauteur-8)
    DisplaySprite(#SpriteCoinHD,WindowLargeur-8,0)
    DisplaySprite(#SpriteCoinBD,WindowLargeur-8,WindowHauteur-8)
    
    ;Contour (bord)
    Nb32=(WindowLargeur-16)/32
    If Nb32>0
      For x=8 To (Nb32*32)-16 Step 32
        DisplaySprite(#SpriteHaut,x,0)
      Next
      For x=(Nb32*32)-16 To WindowLargeur-8
        DisplaySprite(#SpriteSHaut,x,0)
      Next
      
      For x=8 To (Nb32*32)-16 Step 32
        DisplaySprite(#SpriteBas,x,WindowHauteur-8)
      Next
      For x=(Nb32*32)-16 To WindowLargeur-8
        DisplaySprite(#SpriteSBas,x,WindowHauteur-8)
      Next
    Else
      For x=8 To WindowLargeur-8
        DisplaySprite(#SpriteSHaut,x,0)
      Next
      For x=8 To WindowLargeur-8
        DisplaySprite(#SpriteSBas,x,WindowHauteur-8)
      Next
    EndIf
    
    
    Nb32=(WindowHauteur-16)/32
    If Nb32>0
      For y=8 To (Nb32*32)-16 Step 32
        DisplaySprite(#SpriteDroit,0,y)
      Next
      For y=(Nb32*32)-16 To WindowHauteur-8
        DisplaySprite(#SpriteSDroit,0,y)
      Next
      
      For y=8 To (Nb32*32)-16 Step 32
        DisplaySprite(#SpriteGauche,WindowLargeur-8,y)
      Next
      For y=(Nb32*32)-16 To WindowHauteur-8
        DisplaySprite(#SpriteSGauche,WindowLargeur-8,y)
      Next
    Else
      For y=8 To WindowHauteur-8
        DisplaySprite(#SpriteSDroit,0,y)
      Next
      For y=8 To WindowHauteur-8
        DisplaySprite(#SpriteSGauche,WindowLargeur-8,y)
      Next
    EndIf
  EndIf 
  Start3D()
    ZoomSprite3D(#SpriteWindowBack3D,WindowLargeur*1.5,WindowHauteur)
    DisplaySprite3D(#SpriteWindowBack3D,Posx,Posy,TransCoef)
  Stop3D()
  UseBuffer(#PB_Default)

  CreateSprite3D(spriteid,spriteid)
  Start3D()
    DisplaySprite3D(spriteid,Posx,Posy,TransCoef)
  Stop3D()

 ; DisplayTransparentSprite(spriteid,Posx,Posy)
  
EndMacro
;-Boucle
Repeat
  WindowEvent=WindowEvent()
  ClearScreen(RGB(255,255,255))

  DrawWindow(#WindowTest,0,400,800,32,125)
  DrawWindow(#WindowTest2,0,400,800,32,125)
  FlipBuffers()
  Delay(1)
Until WindowEvent=#PB_Event_CloseWindow

Publié : mer. 22/avr./2009 22:01
par Le Soldat Inconnu
bug chez moi aussi, j'ai isolé le problème a grand coup de commentaire

Donc le bug viens de l'utilisation de dessin de sprite sur une texture.

Ta méthode pour dessiner ta fenêtre est trop compliqué.

Ton défaut d'affichage viens de l'interprétation 3D des sprites dessiner sur une texture. On est en 3D, suivant la carte graphique, elle va interprété différemment le fait de dessiner sur une texture.

A coup sur, tu dois avoir une carte NVidia, et chez toi marche, ton pote à une carte ATI et ça marche pas.
J'ai déjà d'autre soucis de ce type avec ATI.
Les cartes ATI sont beaucoup moins souple au niveau de la dimension des textures.
En d'autres termes, si tu t'amuses trop à jouer avec des texture qui n'ont pas la taille standard (32*32, 64*64, etc)
tu te retrouves avec ce genre de problèmes.



La solution qui sera bien plus simple :

On ne travail pas avec des sprites pour créer un autre sprite
charge une image qui est le skin,
découpe l'image
assemble les morceaux pour donner ta fenêtre dans une nouvelle image
puis transforme l'image en sprite3D
et ça devrait marcher

Publié : mer. 22/avr./2009 22:04
par scaraber
Ok je vais tester avec des image tout de suite
merci de ton aide

Publié : mer. 22/avr./2009 23:01
par Anonyme
le plus simple ( et + gourmand ) pour réalisé un système de skin a base de sprite3d , c'est de créer des sprites de taille n² comme le dit LSI

Si ta fenetre fait 640x128 , tu créer un sprite de 640x640 , tu met une couleur transparente pour ne pas affiché l'excédent.

(ps : Beaucoup de "pro" utilisait se genre de chose a l'époque des limitations des CG , j'avais chopé une routine de chez blizzard qui fait se que je viens de te dire avec SDL & OpenGL)

++

Publié : mer. 22/avr./2009 23:48
par scaraber
J'ai modifier encore le code pour que les sprites 'texture' soit caré, le bug est moindre et différent mais persiste toujours

Code : Tout sélectionner

InitSprite()
InitSprite3D()
UsePNGImageDecoder()
Enumeration
  #SpriteWindow
  #SpriteWindowPart
  #SpriteWindowBack
  #WindowTest
  #WindowTest2
EndEnumeration

Enumeration
  #ImageWindowPart
  #ImageCoinHG
  #ImageCoinHD
  #ImageCoinBG
  #ImageCoinBD
  #ImageBas
  #ImageDroit
  #ImageGauche
  #ImageHaut
  #ImageSBas
  #ImageSDroit
  #ImageSGauche
  #ImageSHaut
  #ImageWinFond
EndEnumeration

;-Ouverture de la fenetre
OpenWindow(0,0,0,800,600,"test ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)

;-
LoadImage(#ImageWindowPart,"Image\Skin\system.png")
LoadSprite(#SpriteWindowPart,"Image\Skin\system.png",#PB_Sprite_Texture)
UseBuffer(#SpriteWindowPart)
GrabSprite(#SpriteWindowBack,0,0,128,128,#PB_Sprite_Texture)
UseBuffer(#PB_Default)
CreateSprite3D(#SpriteWindowBack,#SpriteWindowBack)

;-Macro

Macro DrawWindow(id,Posx,Posy,WindowLargeur,WindowHauteur,TransCoef)
  If id=#Null
    spriteid=#SpriteWindow
    If IsSprite(spriteid)
      FreeSprite(spriteid)
    EndIf 
  Else
    spriteid=id  
  EndIf
  If Not IsSprite(spriteid)
    
    If WindowLargeur>WindowHauteur
      WinMaxSize=WindowLargeur
    Else
      WinMaxSize=WindowHauteur
    EndIf
    
    CreateSprite(spriteid,WinMaxSize,WinMaxSize,#PB_Sprite_Texture)
    TransparentSpriteColor(spriteid,RGB(0,255,0))
    
    GrabImage(#ImageWindowPart,#ImageCoinHG  ,128,0,8,8)
    GrabImage(#ImageWindowPart,#ImageCoinHD  ,184,0,8,8)
    GrabImage(#ImageWindowPart,#ImageCoinBG  ,128,56,8,8)
    GrabImage(#ImageWindowPart,#ImageCoinBD  ,184,56,8,8)
    
    GrabImage(#ImageWindowPart,#ImageHaut    ,144,0,32,8)
    GrabImage(#ImageWindowPart,#ImageBas     ,144,56,32,8)
    GrabImage(#ImageWindowPart,#ImageDroit   ,128,16,8,32)
    GrabImage(#ImageWindowPart,#ImageGauche  ,184,16,8,32)
    
    GrabImage(#ImageWindowPart,#ImageSHaut   ,144,0,1,8)
    GrabImage(#ImageWindowPart,#ImageSBas    ,144,56,1,8)
    GrabImage(#ImageWindowPart,#ImageSDroit  ,128,16,8,1)
    GrabImage(#ImageWindowPart,#ImageSGauche ,184,16,8,1)
    
    GrabImage(#ImageWindowPart,#ImageWinFond ,0,0,128,128)
    
    If StartDrawing(SpriteOutput(spriteid))
      Box(0,0,WinMaxSize,WinMaxSize,RGB(0,255,0))
      
      ;Contour (coin)
      DrawImage(ImageID(#ImageCoinHG),0,0)
      DrawImage(ImageID(#ImageCoinBG),0,WindowHauteur-8)
      DrawImage(ImageID(#ImageCoinHD),WindowLargeur-8,0)
      DrawImage(ImageID(#ImageCoinBD),WindowLargeur-8,WindowHauteur-8)
      
      ;Contour (bord)
      Nb32=(WindowLargeur-16)/32
      If Nb32>0
        For x=8 To (Nb32*32)-16 Step 32
          DrawImage(ImageID(#ImageHaut),x,0)
        Next
        For x=(Nb32*32)-16 To WindowLargeur-8
          DrawImage(ImageID(#ImageSHaut),x,0)
        Next
        
        For x=8 To (Nb32*32)-16 Step 32
          DrawImage(ImageID(#ImageBas),x,WindowHauteur-8)
        Next
        For x=(Nb32*32)-16 To WindowLargeur-8
          DrawImage(ImageID(#ImageSBas),x,WindowHauteur-8)
        Next
      Else
        For x=8 To WindowLargeur-8
          DrawImage(ImageID(#ImageSHaut),x,0)
        Next
        For x=8 To WindowLargeur-8
          DrawImage(ImageID(#ImageSBas),x,WindowHauteur-8)
        Next
      EndIf
      
      Nb32=(WindowHauteur-16)/32
      If Nb32>0
        For y=8 To (Nb32*32)-16 Step 32
          DrawImage(ImageID(#ImageDroit),0,y)
        Next
        For y=(Nb32*32)-16 To WindowHauteur-8
          DrawImage(ImageID(#ImageSDroit),0,y)
        Next
        For y=8 To (Nb32*32)-16 Step 32
          DrawImage(ImageID(#ImageGauche),WindowLargeur-8,y)
        Next
        For y=(Nb32*32)-16 To WindowHauteur-8
          DrawImage(ImageID(#ImageSGauche),WindowLargeur-8,y)
        Next
      Else
        For y=8 To WindowHauteur-8
          DrawImage(ImageID(#ImageSDroit),0,y)
        Next
        For y=8 To WindowHauteur-8
          DrawImage(ImageID(#ImageSGauche),WindowLargeur-8,y)
        Next
      EndIf
    EndIf 
    StopDrawing()
  EndIf
 
  CreateSprite3D(spriteid,spriteid)

  Start3D()
    ZoomSprite3D(#SpriteWindowBack,WindowLargeur,WindowHauteur)
    DisplaySprite3D(#SpriteWindowBack,Posx,Posy,TransCoef)
    DisplaySprite3D(spriteid,Posx,Posy,TransCoef)
  Stop3D() 
EndMacro

;-Boucle
Repeat
  WindowEvent=WindowEvent()
  ClearScreen(RGB(255,255,255))
  DrawWindow(#WindowTest,128,128,256,32,125)
  DrawWindow(#WindowTest2,0,400,800,32,125)
  FlipBuffers()
  Delay(1)
Until WindowEvent=#PB_Event_CloseWindow

Publié : jeu. 23/avr./2009 9:21
par Atomo
Demandes à ton copain de mettre à jour les pilotes graphique de sa carte graphique, le problème peut venir de là.

Publié : jeu. 23/avr./2009 9:24
par scaraber
Le connaissant ces pilotes doivent être a jour mais je lui demanderais de vérifier.
Quelqu'un avec une carte ATI a encore le bug graphique ? ou sa viens du pc de mon pote :p ?
++
Scaraber

Publié : jeu. 23/avr./2009 15:19
par Atomo
J'ai testé ton premier code avec une carte ATI et les pilotes à jour, je ne rencontre aucun problème.

Publié : jeu. 23/avr./2009 16:20
par scaraber
c'est bon, j'ai remodifié un peu le code sa marche chez tout ceux qui ont tester now (voir premier lien)