il suffit de regarder les signets ;-nouveau pour voir ce qu'il y a de nouveau
avant je fermais l'ecran , pour le réouvrir ..
et redessinais les sprites , d'ou le clignotement
maintenant je le reduit ( c'est plus cool )
j'ai ajouté dans le code un test de la resolution au moment du lancement du "jeux"
si quelqu'un s'amuse a changer la résolution ; lorsqu'on recliquera sur le jeux , il remettra sa résolution de lancement ..
de cette façon plus de probleme de proportion

tu peux aussi obliger une resolutions Precise genre 800x600
voila le truc qui tue sa race :
Code : Tout sélectionner
; Purebasic 4.41
;By Dobro
; exemple de l'utilisation de IsScreenActive()
; quittez le pseudo jeux avec Alt+TAB
; on retourne dans le jeux d'un clique sur la fenetre en barre des taches
Declare SetResolution(RezX, RezY, NbCoul, Frequence, Memoriser) ; si SetResolution=2 la résolution est identique à l'actuelle, si 1 erreur lors de la recherche des infos, sinon regarder #DISP_CHANG_...
initsprite ()
initmouse ()
initkeyboard ()
Enumeration
#sprite
EndEnumeration
Structure sprite
x.i
y.i
pas_x.i
pas_y.i
EndStructure
Dim sprite.sprite(1)
examinedesktops ()
x_screen= desktopwidth (0) ; je recup la rez de l'ecran ;)
y_screen= desktopheight (0)
flag=0
; FlipBuffers(0)
openscreen (x_screen, y_screen, 32, "Fullscreen + ALT-TAB démo" )
releasemouse (0)
createsprite ( #sprite , 64, 64)
startdrawing ( spriteoutput ( #sprite ))
box (0,0,64,64, rgb (255,13,40))
stopdrawing ()
debut: ; le label qui permet le retour dans le jeux !!
;********* initialisation du sprite **********
If flag=0 ; le joueur n'est jamais sorti du jeu , s'il est sorti on ne fais pas ce bloc de code !!
sprite(1)\x=x_screen/2 ; on place le sprite au centre
sprite(1)\y=y_screen/2 ; on place le sprite au centre
sprite(1)\pas_x=2 ; on donne une vitesse de deplacement a notre sprite
sprite(1)\pas_y=2 ; on donne une vitesse de deplacement a notre sprite
Else
;-nouveau
ShowWindow_(ScreenID(),#SW_SHOW) ; reaffiche l'ecran ;o)
EndIf
Repeat
examinekeyboard () ; ne sert que pour quitter le prg avec la touche esc
; ************* gere le deplacement du sprite ***************
sprite(1)\x=sprite(1)\x+sprite(1)\pas_x
sprite(1)\y=sprite(1)\y+sprite(1)\pas_y
; ----------------------------------------------------------------------------
If sprite(1)\x+64>=x_screen:sprite(1)\pas_x=-sprite(1)\pas_x: EndIf
If sprite(1)\y+64>=y_screen:sprite(1)\pas_y=-sprite(1)\pas_y: EndIf
; ----------------------------------------------------------------------------
If sprite(1)\x<=0:sprite(1)\pas_x=-sprite(1)\pas_x: EndIf
If sprite(1)\y<=0:sprite(1)\pas_y=-sprite(1)\pas_y: EndIf
; *******************************************************
; ********** affichage du sprite *********************
displaytransparentsprite ( #sprite , sprite(1)\x, sprite(1)\y)
flipbuffers ()
clearscreen (0)
; *************** attention toute l'astuce est la !! *******************
x_screen2= desktopwidth (0) ; je recup la rez de l'ecran .. encore;)
y_screen2= desktopheight (0)
If isscreenactive () = 0 or (x_screen2<>x_screen and y_screen2<>y_screen) ; le joueur a quitter le jeu (Alt-tab) ou on a changé la resolution !!!
releasemouse (1) ; je libere la souris ... inutile ici mais bon
flag=1 ; on note que l'utilisateur est sorti du jeux
;-nouveau
ShowWindow_(ScreenID(),#SW_HIDE) ; reduit l'ecran le temps du redessin ( avant je fermais )
; ******* la ruse de guerre !! ****************************
openwindow (1,1,1,1,1, "toto le jeu " , #PB_Window_Minimize ) ; j'ouvre une fenetre que je minimise en bar des taches
Repeat :Event= waitwindowevent (2): Until Event= #PB_Event_ActivateWindow ; j'attend qu'on clique sur la fenetre
closewindow (1) ; je ferme la fenetre
; je remet la resolution du jeux :
;-nouveau
SetResolution(x_screen,y_screen,32,60,1) ; on remet notre resolution
Goto debut ; je retourne dans le jeux sans réinitialiser les variables de déplacement (on reprends ou on en etait! !!! )
EndIf
Until keyboardpushed ( #PB_Key_Escape ) ; là , on veux vraiment quitter le jeux LOL
End
Procedure SetResolution(RezX, RezY, NbCoul, Frequence, Memoriser) ; Force la resolution
; si SetResolution=2 la résolution est identique à l'actuelle, si 1 erreur lors de la recherche des infos, sinon regarder #DISP_CHANG_...
dm.DEVMODE
If EnumDisplaySettings_ (0, -1, @dm)
If RezX = dm\dmPelsWidth And RezY = dm\dmPelsHeight And NbCoul = dm\dmBitsPerPel And Frequence=dm\dmDisplayFrequency : ProcedureReturn 2 : EndIf
dmEcran.DEVMODE
dmEcran\dmSize = SizeOf (dmEcran)
dmEcran\dmFields = #DM_PELSWIDTH|#DM_PELSHEIGHT|#DM_BITSPERPEL|#DM_DISPLAYFREQUENCY
dmEcran\dmPelsWidth = RezX
dmEcran\dmPelsHeight = RezY
dmEcran\dmBitsPerPel = NbCoul
dmEcran\dmDisplayFrequency = Frequence
If Memoriser=1 : Memoriser= #CDS_UPDATEREGISTRY Or #CDS_NORESET : Else : Memoriser= #CDS_FULLSCREEN : EndIf
dmx = ChangeDisplaySettings_ (@dmEcran,Memoriser)
ProcedureReturn dmx
Else
ProcedureReturn 1
EndIf
EndProcedure
;
; EPB