Au sujet des écrans graphiques

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Au sujet des écrans graphiques

Message par Backup »

bon alors , j'ai refait mon code

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

Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Au sujet des écrans graphiques

Message par Backup »

petite correction sur l'emplacement du label de retour
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Au sujet des écrans graphiques

Message par pat »

A Dobro.
Merci pour ton code.
Si j'ai bien compris, si l'utilisateur change la résolution, tu forces la résolution de l'écran de début.
C'est pas mal mais ton programme s'alourdit.
Il est clair que pour le mode plein écran, tout est OK.
Le problème c'est le mode fenêtré.
Si tu avais lu mes premiers mails de ce post, tu aurais vu que j'avais déjà résolu le problème de changement de résolution d'écran : il suffit d'utiliser la commande (merci PB) AvailableScreenMemory().
Par exemple :
If IsScreenActive=0 And AvailableScreenMemory()=0;si je sors du programme et je change de résolution
CloseScreen();je mets quand même le close même si l'écran graphique est fermé par le système.
OpenScreenWindowed(.....)
;ici tu redessines ou recharge tes objets
Endif
De sorte que si tu changes la résolution d'écran et sors de ton programme, et uniquement, tu rouvres l'écran et recharge ou redessine.
Ce qui évite que systématiquement un scintillement s'effectue lorsque, par exemple, l'utilisateur ouvre ton programme, va sur le bloc-notes, et rentre à nouveau dans ton programme. Scintillement, obligatoire, uniquement lorsqu'il y a changement de résolution d'écran mais pas pour autre chose.
Le problème, comme je l'ai dit, c'est au sujet de Windows Defender qui lui ferme l'écran graphique, comme lorsqu'on change de résolution, mais n'a pas la bonne idée de mettre AvailableScreenMemory() à 0. D'où mon insistante demande de connaître quand on ferme ou ouvre un écran graphique puisque c'est la seule façon de régler le problème. Et si on connaît ça, on pourra en même temps oublier la commande AvailableScreenMemory() puisque dans les deux cas (changement de résolution et Windows Defender) on pourrait réagir car on saura quand il faudra rouvrir un écran graphique et recharger ou redessiner les objets.
Maintenant il semblerai qu'on se comprenne mieux.
Et tu peux comprendre aussi pourquoi vos exemples précédents m'étaient d'aucune utilité.
Je repose donc la question, et je pense que tu comprends pourquoi je la pose, COMMENT FAIT-ON POUR SAVOIR QUAND UN ECRAN GRAPHIQUE EST OUVERT OU FERME ET CECI DANS LA REALITE.
J'ai lu également, dans ce forum, que tu étais un spécialiste de programmation des jeux, alors je me suis dit que peut-être tu pourrais me donner la solution et si ce n'est pas le cas, si quelqu'un aurait la solution, cela pourrait te servir aussi, comme aussi à ceux qui s'intéressent aux jeux et qui souhaitent créer des jeux qui sont fait de manière correctes.
8)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Au sujet des écrans graphiques

Message par Backup »

je t'ai pourtant deja donné une solution ...

ton probleme c'est manifestement ce Windows Defender ...

qu'est ce qui t'empeche lorsque tu sais que ton jeux est lancé , de virer Windows Defender de la ram
et de relancer Windows Defender lorsque ton prg n'as plus la main ( quitté ) ?

sans dec .. je ne comprends ou est le soucis :roll:

... apparemment il est desactivé chez moi ( Seven )
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Au sujet des écrans graphiques

Message par djes »

Ta question était mal posée dès le départ. Il ne s'agit pas de "COMMENT FAIT-ON POUR SAVOIR QUAND UN ECRAN GRAPHIQUE EST OUVERT OU FERME ET CECI DANS LA REALITE.", mais comment savoir si le contexte graphique est perdu et s'il y a nécessité de recharger les objets graphiques. Ton AvailableScreenMemory() n'est d'aucune utilité car très souvent sous Windows avec DirectX, lors d'un changement de contexte, la mémoire graphique est corrompue et nécessite un rechargement des images, ce que n'indiquera pas AvailableScreenMemory().

Le mode fenêtré et le mode plein écran n'ont pas de réelle différence sous Windows, dans le deuxième cas la fenêtre remplit l'écran et n'a pas de bords. Un écran graphique, tel que tu en parles, est une fenêtre qui utilise DirectX pour profiter de l'accélération matérielle. Bien souvent les jeux sous Windows n'utilisent pas DirectX, et ne nécessitent pas de rechargement des objets graphiques ; il n'y a pas de scintillement lors du passage d'une fenêtre à l'autre. (A nuancer puisqu'avec aero, tout est sous directx). PB permet les deux, avec le concept d'écran (screen), qui peut prêter à confusion. Pour savoir si quelqu'un sort d'un écran DirectX, la commande PB officielle est IsScreenActive().

Nos exemples sont donc à reconsidérer ; si tu veux utiliser le mode fenêtré (qui est d'ailleurs préférable), sans avoir à recharger, tu n'as qu'à modifier mon exemple pour éviter la fermeture de la 1ère fenêtre et l'ouverture de la seconde. Tu verras, ça fonctionne très bien, sans clignotement.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Au sujet des écrans graphiques

Message par Backup »

au passage voici comment desactiver et relancer Window Defender

Code : Tout sélectionner




procedure WindowService(nom$,etat=1)
    ; de Stefou
    Select etat
        Case 1
            option$="START "
        Case 0
            option$="STOP "
        Case 2
            option$="PAUSE "
        Case 3
            option$="CONTINUE "
    EndSelect
    
   RunProgram("c:\WINDOWS\system32\net.exe",option$+Chr(34)+nom$+Chr(34),"c:\WINDOWS\system32\",#PB_Program_Wait | #PB_Program_Hide )
    
    
EndProcedure


WindowService("WinDefend",0) ; arrete windows defender 


delay ( 5000 )

WindowService("WinDefend",1) ;relance windows defender 

au passage ça montre la puissance de la defense de windows , :roll:
c'est tres simple de faire un prg qui commence par désactiver les protections de windows
avant de s'amuser ...
et ....
de tout remettre en place avant de partir :lol:
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Au sujet des écrans graphiques

Message par Ar-S »

Dobro a écrit : au passage ça montre la puissance de la defense de windows , :roll:
Effectivement c'est risible !
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Au sujet des écrans graphiques

Message par pat »

A Dobro et djes.
Merci pour vos réponses respectives.
Dobro : tu m'as fourni quelque chose que je ne connaissais pas pour désactiver un programme, le relancer, etc. Très appréciable et voilà peut-être une alternative à mon problème : désactiver Windows Defender.
Djes : tu as tout à fait raison quant à ma formulation, elle n'était pas correcte, mais tu oublies que je n'ai pas ta connaissance ni ton expérience. Je m'exprime en fonction de ce que je sais.
Par contre je ne comprends pas ce que tu dis : " tu n'as qu'à modifier mon exemple pour éviter la fermeture de la 1ère fenêtre et l'ouverture de la seconde". Je n'ai pas l'intention d'éviter la fermeture de quelconque fenêtre ni d'éviter l'ouverture de la seconde. Tout doit se faire naturellement, comme je l'ai vu dans des jeux.
Le plein écran n'est rien d'autre qu'une fenêtre, mais si le mode plein écran fonctionnait pour moi, c'est que le problème du clignotement n'était pas de mise et pour moi ce problème était gênant.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Au sujet des écrans graphiques

Message par Backup »

pat a écrit :A Dobro et djes.
Merci pour vos réponses respectives.
Dobro : tu m'as fourni quelque chose que je ne connaissais pas pour désactiver un programme, le relancer, etc. Très appréciable et voilà peut-être une alternative à mon problème : désactiver Windows Defender.
ce code Active/désactive un SERVICE Windows ...

pour forcer un prg Lamba a quitter , et le relancer c'est un autre code.. :)
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Au sujet des écrans graphiques

Message par Golfy »

Ar-S a écrit :
Dobro a écrit : au passage ça montre la puissance de la defense de windows , :roll:
Effectivement c'est risible !
N'y-at'il pas besoin d'être connecté avec les droits admin ?
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Au sujet des écrans graphiques

Message par Backup »

Golfy a écrit : N'y-at'il pas besoin d'être connecté avec les droits admin ?
peut etre .. le fait est que beaucoup (moi le premier) sont en permanence avec les droits d'admin ..

de plus il y a surement moyen de bidouiller ça :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Au sujet des écrans graphiques

Message par Backup »

ben tiens :lol:

Code : Tout sélectionner

; lancer un appli en mode administrateur
ShellExecute_(hWnd, "runas", "C:\Windows\Notepad.exe", 0, 0, #SW_SHOWNORMAL) 
dans le meme genre :

Desactiver le Firewall XP (pas testé sur Seven )

Code : Tout sélectionner

Procedure Parefeu(mode.c)
;désactive le firewall XP
    fich$ = GetHomeDirectory() + "acfeu.bat"
    If mode = 0
        etat$ = "netsh firewall set opmode disable"
    Else
        etat$ = "netsh firewall set opmode enable"
    EndIf
    CreateFile(0,fich$)
    WriteStringN(0,etat$)
    CloseFile(0)
    Delay(20)
    RunProgram(fich$,"","",#PB_Program_Hide | #PB_Program_Wait)
    Delay(30)
    DeleteFile(fich$)
EndProcedure

;------------( 0 = désactivé | 1 = activé ) -----------
Parefeu(0) 
; IDE Options = PureBasic 4.31 (Windows - x86)
; CursorPosition = 1
; Folding = -
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Au sujet des écrans graphiques

Message par djes »

pat a écrit :Par contre je ne comprends pas ce que tu dis : " tu n'as qu'à modifier mon exemple pour éviter la fermeture de la 1ère fenêtre et l'ouverture de la seconde". Je n'ai pas l'intention d'éviter la fermeture de quelconque fenêtre ni d'éviter l'ouverture de la seconde. Tout doit se faire naturellement, comme je l'ai vu dans des jeux.
Mon exemple prenait en compte le plein écran, mais en mode fenêtré, tout se passe naturellement. Tu n'as qu'à essayer...
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Au sujet des écrans graphiques

Message par pat »

Merci djes. Je vais voir ça de plus près.
Répondre