[Resolu]Bug graphique ? (sur certain PC)
[Resolu]Bug graphique ? (sur certain PC)
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
			
			
													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
 
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 :
 
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
			
			
									
									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)]
						[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
- 
				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)
++
			
			
									
									
						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)
++
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