[Resolu]Bug graphique ? (sur certain PC)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

[Resolu]Bug graphique ? (sur certain PC)

Message 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
Dernière modification par scaraber le jeu. 23/avr./2009 16:20, modifié 2 fois.
Anonyme

Message par Anonyme »

n'utilise pas des "clips" mais des sprite à part entière. Fait le découpage à coup de grabsprite.

@+
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

Message par scaraber »

Daccord merci je vais regarder sa.
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
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)]
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

Message par scaraber »

Ok je vais tester avec des image tout de suite
merci de ton aide
Anonyme

Message 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)

++
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

Message 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
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

Demandes à ton copain de mettre à jour les pilotes graphique de sa carte graphique, le problème peut venir de là.
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

Message 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
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

J'ai testé ton premier code avec une carte ATI et les pilotes à jour, je ne rencontre aucun problème.
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

Message par scaraber »

c'est bon, j'ai remodifié un peu le code sa marche chez tout ceux qui ont tester now (voir premier lien)
Répondre