Page 1 sur 2
J'ai oublié une instruction (EDIT : IsScreenActive())
Publié : jeu. 29/avr./2010 22:41
par SPH
salut,
je cherche, je cherche, mais j'ai completement oublié comment s'appelais l'instruction pour passer mon jeu sous win avec ALT+TAB, puis revenir au jeu sans qu'il plante.......
je l'ai lu dans la notice mais je sais pu ou !!

Re: J'ai totalement oublié une instruction
Publié : ven. 30/avr./2010 6:33
par cederavic
IsScreenActive()
Syntaxe
Resultat = IsScreenActive()
Description
Les jeux et les applications en mode plein écran programmés en PureBasic fonctionnent toujours en mode multitâche, pour éviter de bloquer tout le système (que ce soit sur AmigaOS, Windows ou Linux). En d'autre termes, l'utilisateur peut à tout moment revenir sur son bureau pour faire autre chose. Si c'est le cas cette commande renverra 0, indiquant au programmeur de prendre les mesures nécessaires (libérer le clavier et la souris, arrêter les sons et les musiques, mettre le jeu en pause etc...) Cette commande doit être obligatoirement placée après FlipBuffers().
OS Supportés
Tous
Je pense que c'est ce que tu cherche, mais elle fonctionne pas toute seulle

Re: J'ai totalement oublié une instruction
Publié : ven. 30/avr./2010 7:48
par SPH
Grand merci cadaveric
Ne sachant pas ce que veux concretement dire 'liberer le clavier et la suoris', j'ai juste fais ca :
Code : Tout sélectionner
While IsScreenActive()=0
Delay(100);ce qui evite les lags
Wend
Ca n'a pas marché, evidement. Comment on peux liberer ce qu'il faut pour pouvoir revenir dans le jeu apres un nouveau ALT+TAB ?
Re: J'ai totalement oublié une instruction
Publié : ven. 30/avr./2010 8:38
par Le Soldat Inconnu
c'est ce que j'appelle le gros point noir, ce truc. Je voudrais bien savoir également.
Re: J'ai totalement oublié une instruction
Publié : ven. 30/avr./2010 10:43
par G-Rom
Si IsScreenActive() = 0
alors tu n'affiches plus rien à l'écran , via un flag , tu stoppe le FlipBuffers() aussi.
Re: J'ai totalement oublié une instruction
Publié : ven. 30/avr./2010 10:48
par SPH
G-Rom a écrit :Si IsScreenActive() = 0
alors tu n'affiches plus rien à l'écran , via un flag , tu stoppe le FlipBuffers() aussi.
Et bin ,c'est ce que je fais ?!! :
Code : Tout sélectionner
While IsScreenActive()=0
Delay(100);ce qui evite les lags
Wend
Re: J'ai totalement oublié une instruction
Publié : ven. 30/avr./2010 10:51
par G-Rom
SPH a écrit :G-Rom a écrit :Si IsScreenActive() = 0
alors tu n'affiches plus rien à l'écran , via un flag , tu stoppe le FlipBuffers() aussi.
Et bin ,c'est ce que je fais ?!! :
Code : Tout sélectionner
While IsScreenActive()=0
Delay(100);ce qui evite les lags
Wend
j'ai pas dis le contraire

Re: J'ai totalement oublié une instruction
Publié : ven. 30/avr./2010 10:55
par cederavic
Il te faut utiliser
ReleaseMouse()
Syntaxe
Resultat = ReleaseMouse(Etat)
Description
Capture ou libère la souris pour rendre son usage possible dans le système d'exploitation. On utilise typiquement cette fonction après avoir vérifié le résultat de la commande IsScreenActive(). Si 'Etat' = 1, la souris est libérée, sinon la souris est capturée par le programme PureBasic.
OS Supportés
Tous
Le clavier n'a pas besoin d'être libéré (et puis il n'y a pas de commandes pour...). Quand ton ecran n'a pas le "focus" n'utilise plus ExamineMouse/ExamineKeyboard.
Dans certains cas il te faudra aussi recharger tes sprites une foi que l'écran a à nouveau le focus!
Il y a eu enormement de discutions sur le sujet dans le forum

Re: J'ai totalement oublié une instruction
Publié : ven. 30/avr./2010 21:07
par SPH
Cederavic, je te met dans la liste des codeurs indispensables
Je vais essayer ca. Ce sera la premiere fois que j'utilise cette instruction...
EDIT : ca veux pas (ou il manque juste un petit truc)
Code : Tout sélectionner
If IsScreenActive()=0
ReleaseMouse(1)
While IsScreenActive()=0
Delay(100)
Wend
ReleaseMouse(0)
EndIf
Re: J'ai totalement oublié une instruction
Publié : ven. 30/avr./2010 23:02
par G-Rom
Code : Tout sélectionner
If IsScreenActive()=0
ReleaseMouse(1)
While IsScreenActive()=0
Delay(100)
Wend
ReleaseMouse(0)
EndIf
Ton code est foireux , regarde , si on enlève le block While / wend :
Code : Tout sélectionner
If IsScreenActive()=0
ReleaseMouse(1)
...
ReleaseMouse(0)
EndIf
Donc , quand ton écran n'est pas actif , tu libères et tu capture la souris , le tout en un tour de boucle

et avec le block while / end , quand l'écran est actif , tu colles un délais de 100ms , y a comme un gros soucis là
Quand mon écran est actif , IsScreenActive() me renvois 1 sinon 0.
Code : Tout sélectionner
InitSprite() : InitKeyboard() : InitMouse()
ExamineDesktops()
OpenWindow(0,0,0,DesktopWidth(0),DesktopHeight(0),"")
OpenWindowedScreen(WindowID(0),0,0,DesktopWidth(0),DesktopHeight(0),1,0,0)
; OpenScreen(DesktopWidth(0),DesktopHeight(0),DesktopDepth(0),"")
FlipBuffers()
Repeat
If IsScreenActive()
ExamineKeyboard()
ExamineMouse()
;AFFICHAGE
FlipBuffers()
Else
Delay(100)
EndIf
ForEver
Re: J'ai totalement oublié une instruction
Publié : sam. 01/mai/2010 12:06
par djes
Code : Tout sélectionner
InitSprite()
InitMouse()
InitKeyboard()
OpenScreen(1024, 768, 32, "Fullscreen + ALT-TAB démo")
CreateSprite(0, 64, 64)
StartDrawing(SpriteOutput(0))
Line( 0, 0, 48, 32,$0FF0FF)
Line( 0, 0, 64, 64,$0FF0FF)
Line( 0, 0, 32, 48,$0FF0FF)
StopDrawing()
Repeat
ExamineMouse()
ExamineKeyboard()
ClearScreen(0)
DisplayTransparentSprite(0, MouseX(), MouseY())
FlipBuffers()
If IsScreenActive() = 0
ReleaseMouse(1)
Repeat
While PeekMessage_(msg.MSG, 0, 0, 0, #PM_REMOVE)
TranslateMessage_(msg)
DispatchMessage_(msg)
Wend
Delay(100)
Until IsScreenActive() <> 0
CloseScreen()
Delay(1000)
OpenScreen(1024, 768, 32, "Fullscreen + ALT-TAB démo")
ReleaseMouse(0)
CreateSprite(0, 64,64)
StartDrawing(SpriteOutput(0))
Line( 0, 0, 48, 32, $0FF0FF)
Line( 0, 0, 64, 64, $0FF0FF)
Line( 0, 0, 32, 48, $0FF0FF)
StopDrawing()
EndIf
Until KeyboardPushed(#PB_Key_Escape)
Re: J'ai totalement oublié une instruction
Publié : dim. 02/mai/2010 14:00
par SPH
Merci djes pour ton code. Je vois qu'il ne faut pas 'simplement' release la souris. Il faut fermer le screen et recharger les sprites (non dit dans la notice mais qu'importe, c'est facile a faire). Non seulement ca mais en plus, un morceau de ton code semble essenciel. Ca :
Code : Tout sélectionner
While PeekMessage_(msg.MSG, 0, 0, 0, #PM_REMOVE)
TranslateMessage_(msg)
DispatchMessage_(msg)
Wend
Il veux dire quoi ce bout de code ?

Re: J'ai totalement oublié une instruction
Publié : dim. 02/mai/2010 14:21
par djes
Quand on a basculé avec ALT-TAB, la fonction IsScreenActive() ne fonctionne pas si les événements ne sont pas traités par le programme.
Or, en plein écran :
1. Flipbuffers() ne fonctionne plus si on est revenu sur le bureau (c'est lui qui gère les événements en plein écran)
2. On ne peut pas utiliser WindowEvent() (puisque ça ne fonctionne qu'en mode fenêtré) ; en fait on pourrait, mais le débogueur ne veut pas et signale une erreur.
Donc, ces petites lignes de code permettent de traiter les événements, même si on a basculé sur le bureau. Ca ne fonctionne que sous Windows (c'est une des façons officielles de traiter les événements).
J'ai trouvé cette méthode de façon empirique, Fred ne l'a pas trop commentée pour l'instant. Je pense qu'on pourrait le faire autrement en gérant les événements avec des threads (d'ailleurs je l'ai déjà fait

), mais cette méthode a l'avantage de bien s'intégrer à Pure, et d'être facile à comprendre.
Re: J'ai totalement oublié une instruction
Publié : dim. 02/mai/2010 14:31
par SPH
Le "probleme" de ALT+TAB se trouve aussi sous linux ?
Re: J'ai totalement oublié une instruction
Publié : dim. 02/mai/2010 15:12
par Backup