[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.
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
-
- 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)]
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