J'ai oublié une instruction (EDIT : IsScreenActive())

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

J'ai oublié une instruction (EDIT : IsScreenActive())

Message 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:
Dernière modification par SPH le dim. 09/mai/2010 12:21, modifié 1 fois.

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: J'ai totalement oublié une instruction

Message 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)
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: J'ai totalement oublié une instruction

Message 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 ?

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: J'ai totalement oublié une instruction

Message par Le Soldat Inconnu »

c'est ce que j'appelle le gros point noir, ce truc. Je voudrais bien savoir également.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: J'ai totalement oublié une instruction

Message par G-Rom »

Si IsScreenActive() = 0
alors tu n'affiches plus rien à l'écran , via un flag , tu stoppe le FlipBuffers() aussi.
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: J'ai totalement oublié une instruction

Message 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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: J'ai totalement oublié une instruction

Message 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:
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: J'ai totalement oublié une instruction

Message 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)
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: J'ai totalement oublié une instruction

Message 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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: J'ai totalement oublié une instruction

Message 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
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: J'ai totalement oublié une instruction

Message 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)
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: J'ai totalement oublié une instruction

Message 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 ? :?:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: J'ai totalement oublié une instruction

Message 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.
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: J'ai totalement oublié une instruction

Message par SPH »

Le "probleme" de ALT+TAB se trouve aussi sous linux ?

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: J'ai totalement oublié une instruction

Message 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 :)
Répondre