Bug ? Affichage partiel hors limite

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Bug ? Affichage partiel hors limite

Message par Fig »

Code : Tout sélectionner

If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitNetwork()=0:MessageRequester("Error","Error DirectX",0):EndIf
If OpenWindow(0,200,0,800,500, "test bug hors limite ", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
    If OpenWindowedScreen(WindowID(0),0,0,800,500,0,0,0,#PB_Screen_WaitSynchronization)=0:MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0):End:EndIf
EndIf

;créé un sprite carré rouge de 256x128
CreateSprite(0,256,128)
StartDrawing(SpriteOutput(0))
Box(0,0,256,128,#Red)
StopDrawing()
;transforme le sprite en un losange de 512x256
TransformSprite(0,256,0,512,128,256,256,0,256)

Repeat
FlipBuffers()
ClearScreen(#Black)
ExamineKeyboard()
WaitWindowEvent(4)
;ok fonctionne tant qu'on ne l'affiche pas au dela de sa largeur d'origine en dehors de l'écran cf 256
DisplaySprite(0,-255,0)
;ne fonctionne pas car on l'affiche hors de l'écran de plus que sa largeur d'origine cf 256
DisplaySprite(0,-256,256)
Until KeyboardPushed(#PB_Key_Escape)
Ce programme devrait afficher 2 losanges rouges, partiellement hors de l'écran à gauche.
Un seul s'affiche, il semble qu'un clipping soit fait sur le sprite en question de la largeur du sprite initial avant redimensionnement.(cad 256)
L'ennui c'est que je redimensionne les losanges en fonction de mon zoom, sur une carte isométrique (dimétrique pour être précis).
J'ai donc des "trous noirs" à la place des tiles de bords.

la solution serait bien sûr de charger des sprites de la taille initiale maximale à mon plus gros zoom, mais pour des question de mémoire c'est une solution que je ne peux envisager.
Une alternative serait de "remettre" mes losanges dans un sprite carré, mais ce n'est vraiment pas élégant, ça devrait marcher nativement avec la transformation ! De plus, je me sers de la transformation pour faire les reliefs en "pliant" les deux triangles du losange.

J'ai posté ds la section bug du fofo anglais, mais je sais que quoique moins nombreux, nous sommes plus réactifs sur ce forum
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Bug ? Affichage partiel hors limite

Message par Backup »

Code : Tout sélectionner

;ok fonctionne tant qu'on ne l'affiche pas au dela de sa largeur d'origine en dehors de l'écran cf 256
DisplaySprite(0,-255,0)
;ne fonctionne pas car on l'affiche hors de l'écran de plus que sa largeur d'origine cf 256
DisplaySprite(0,-256,256)
je ne comprends pas trop ce que tu désires, mais tu affiche 2 sprites a la meme coordonnée X

-255 pour l'un et
-256 pour l'autre
alors c'est peut etre normal de n'en voir qu'un non ? vu qu'ils sont superposé ...

[reedit]

je viens de comprendre :)

oui c'est bizarre cette disparition
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Bug ? Affichage partiel hors limite

Message par Backup »

mis en evidence ici :

Code : Tout sélectionner

If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitNetwork()=0:MessageRequester("Error","Error DirectX",0):EndIf
If OpenWindow(0,200,0,800,500, "test bug hors limite ", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
	If OpenWindowedScreen(WindowID(0),0,0,800,500,0,0,0,#PB_Screen_WaitSynchronization)=0:MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0):End:EndIf
EndIf

;créé un sprite carré rouge de 256x128
CreateSprite(0,256,128)
StartDrawing(SpriteOutput(0))
	Box(0,0,256,128,#Red)
StopDrawing()
;transforme le sprite en un losange de 512x256
TransformSprite(0,256,0,512,128,256,256,0,256)
x.f=-249
Repeat
	
	ExamineKeyboard()
	WaitWindowEvent(4)
	;ok fonctionne tant qu'on ne l'affiche pas au dela de sa largeur d'origine en dehors de l'écran cf 256
	DisplaySprite(0,-255,0)
	;ne fonctionne pas car on l'affiche hors de l'écran de plus que sa largeur d'origine cf 256
	x.f=x.f-00.1
	
	if X.f<-255
		Beep_(440,100) ; beep si disparait
	Endif
	DisplaySprite(0,x.f,256)  ; Disparition si x<256
	
	
	FlipBuffers()
	ClearScreen(#Black)
Until KeyboardPushed(#PB_Key_Escape) 
; Epb

Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Bug ? Affichage partiel hors limite

Message par Fig »

Dobro a écrit : oui c'est bizarre cette disparition
C'est surtout gênant dans mon cas :wink:

Je ne sais pas si c'est un bug de Pb (crop à la taille initiale du sprite) ou si c'est spécifique à directx (ou à certaines cartes graphiques ?) ... :?
C'est embêtant.

"Beep, Beep, Beep, Beep..." :lol:
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Répondre