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 !! :| :cry: :oops:

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 8)

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 :wink:

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 8)

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 :wink:

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 :D
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à :D

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
:lol: j'ai une erreur en ligne 7 avec ton code ! :roll: :)

ça sert a rien tout tes trucs !! :lol:

je vous fait un exemple :)