Openscreen et gestion du temps.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Openscreen et gestion du temps.

Message par Ar-S »

Hello,
Voilà un problème récurent que j'aimerai régler.
Quel est le moyen en OpenScreen (et pas openwindowscreen) de gérer une timeline (ligne de temps) d'évènements à la manière d'un timer en mode fenêtré.
J'ai commencé avec le même code en fenêtré + openwindowscreen mais ça lag plus et je me retrouve toujours avec le bug de lag de souris haut dpi.
J'aimerai si possible ne pas créer de fenetre invisible pour gruger.
Tous les jeux du marché proposent un mode fenêtré sans bord et n'ont pas ce soucis de souris, ça devient pénible.
~~~~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
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Openscreen et gestion du temps.

Message par SPH »

Pour empecher la souris de bugguer, il faut utiliser un autre system; celui ci (code a nettoyer) :

Code : Tout sélectionner

UseJPEGImageDecoder()
UseOGGSoundDecoder() 

Global win, LMB, RMB, MMB, OldMouseX, OldMouseY

Procedure CrisotResetMouseDelta()
  OldMouseX=WindowMouseX(win)
  OldMouseY=WindowMouseY(win)
EndProcedure

Procedure CrisotMouseDeltaX()
  DeltaMouseX=WindowMouseX(win)-OldMouseX
  OldMouseX=WindowMouseX(win)
  ProcedureReturn DeltaMouseX
EndProcedure

Procedure CrisotMouseDeltaY()
  DeltaMouseY=WindowMouseY(win)-OldMouseY
  OldMouseY=WindowMouseY(win)
  ProcedureReturn DeltaMouseY
EndProcedure

Procedure CrisotMouseButton()
   Repeat
      Event = WindowEvent()
      Select Event
         Case #WM_LBUTTONDOWN         ; API Windows
            LMB=#True
         Case #PB_Event_LeftClick   ; bricolage - #WM_LBUTTONUP plante
            LMB=#False
         Case #WM_RBUTTONDOWN         ; API Windows
            RMB=#True
         Case #PB_Event_RightClick   ; bricolage - #WM_RBUTTONUP plante
            RMB=#False
         Case #WM_MBUTTONDOWN         ; API Windows
            MMB=#True
         Case #WM_MBUTTONUP         ; API Windows
            MMB=#False
      EndSelect
   Until Event=0
EndProcedure

Procedure CrisotLeftMouseButton()   
   CrisotMouseButton()
   ProcedureReturn LMB
EndProcedure

Procedure CrisotRightMouseButton()
   CrisotMouseButton()
   ProcedureReturn RMB
EndProcedure

Procedure CrisotMiddleMouseButton()
   CrisotMouseButton()
   ProcedureReturn MMB
 EndProcedure
 

If InitSprite() And InitKeyboard() And InitSound() ;And InitMouse() 
Else
  MessageRequester("Erreur", "InitSprite() And InitMouse() And InitKeyboard() And InitSound() : impossible")
  End 
EndIf
If LoadFont(1, "Arial", 8) 
Else : MessageRequester("Erreur", "LoadFont(1, ''Arial'', 8) : impossible")
  End
EndIf
;Andalus$="Andalus"
Andalus$="Times New Roman"
If LoadFont(2, Andalus$, 50)
Else : MessageRequester("Erreur", "LoadFont(2, Andalus$, 50) : impossible")
  End
EndIf



; CRISOT
;If ExamineDesktops()
;	scr_w = DesktopWidth(0)
;	scr_h = DesktopHeight(0)
;	OpenScreen(scr_w,scr_h,32,"");   OpenWindowedScreen(WindowID(window),0,0,sWidth,sHeight,1,0,0,#PB_Screen_SmartSynchronization)
;Else
;MessageRequester("Erreur", "OpenScreen impossible")
;End
;EndIf 

; CRISOT - Remplace avantageusement l'OpenScreen()

win=OpenWindow(#PB_Any, 0, 0, 0, 0, "HexaScrabble2",  #PB_Window_Maximize |  #PB_Window_BorderLess )
;win=OpenWindow(#PB_Any, 0, 0, 800,600, "HexaScrabble2")
scr_w=WindowWidth(win) : scr_h=WindowHeight(win)
OpenWindowedScreen (WindowID(win),0 , 0, scr_w, scr_h,0, 0, 0, #PB_Screen_SmartSynchronization)
ShowCursor_(0) ; CRISOT - On cache le curseur.



;FlipBuffers();-;FlipBuffers()

; Repeat
;   ;  ExamineMouse() ; CRISOT
;   ExamineKeyboard() 
; Until CrisotLeftMouseButton() Or KeyboardPushed(#PB_Key_Space)


; If LoadModule(1,chemin$+"zik\0.mod");- zik
;   ModuleVolume(1, 80)
;   PlayModule(1)
; EndIf


  ;ExamineMouse()										; CRISOT
  ;mx=MouseX()											; CRISOT
  ;my=MouseY()											; CRISOT
  ;Mb_Left=MouseButton(#PB_MouseButton_Left)	; CRISOT
  mx=WindowMouseX(win)									; CRISOT
  my=WindowMouseY(win)                  ; CRISOT
  Mb_Left=CrisotLeftMouseButton()       ; CRISOT
  
  

  
  ClearScreen(0)
  LoadFont(1, "Arial", 8)
  StartDrawing(ScreenOutput()) 
  DrawingMode( #PB_2DDrawing_Default) ;#PB_2DDrawing_Transparent)
  DrawingFont(FontID(1)) 
  BackColor(0)
  
  StopDrawing() 
  
  ;ExamineMouse()										; CRISOT
  ;mx=MouseX()											; CRISOT
  ;my=MouseY()											; CRISOT
  ;Mb_Left=MouseButton(#PB_MouseButton_Left)	; CRISOT
  mx=WindowMouseX(win)									; CRISOT
  my=WindowMouseY(win)                  ; CRISOT
  Mb_Left=CrisotLeftMouseButton()       ; CRISOT
  
  FlipBuffers();-;FlipBuffers()
  ExamineKeyboard() 
  


Repeat
  ;ExamineMouse() ; CRISOT
  ;Mb_Left=MouseButton(#PB_MouseButton_Left) ; CRISOT
  Mb_Left=CrisotLeftMouseButton() ; CRISOT
Until Mb_Left<>0
http://HexaScrabble.com/
!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.00 - 64 bits
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Openscreen et gestion du temps.

Message par Ar-S »

Merci, j'ai déjà un code (plus court) pour le bug souris mais c'est de la bidouille avec un Thread. (il faut vraiment que Fantaisie Software offre une solution native à ce problème).
La vraie question à mon soucis de timing est toujours là en openscreen().
~~~~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
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Openscreen et gestion du temps.

Message par SPH »

Peut tu donner un petit code et dire ce que tu veux que ca fasse (je maitrise le temps dans les openscreen, je ne vois pas ou est le probleme) :?:
Dernière modification par SPH le sam. 17/févr./2018 19:46, modifié 1 fois.
http://HexaScrabble.com/
!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.00 - 64 bits
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Openscreen et gestion du temps.

Message par Ar-S »

Exemple
- J'ai mon Openscreen avec des starfields qui défilent
- Au bout de 5 sec je fais traverser un asteroid
~~~~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
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Openscreen et gestion du temps.

Message par SPH »

Une comete qui passe apres 3 secondes de stars scrolling :

Code : Tout sélectionner

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Erreur", "Impossible d'initialiser l'écran.")
  End
EndIf


;Ouverture de l'écran
If OpenScreen(1024,768,32,"Exemple OpenScreen") = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran.")
  End
EndIf

Dim stars_x(100)
Dim stars_y(100)
For i=0 To 100
  stars_x(i)=Random(1023)
  stars_y(i)=Random(767)
Next

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Boucle principale
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
timer=ElapsedMilliseconds()

Repeat
  
  ;Effacer complètement l'écran et afficher un fond gris
  ClearScreen(0)
  
  ;On lit les évènements clavier et souris
  ExamineKeyboard()
  
  StartDrawing(ScreenOutput())
  For i=0 To 100
    stars_x(i)+5
    If stars_x(i)>1023
      stars_x(i)-1023
    EndIf
    Plot(stars_x(i),stars_y(i),RGB(200,200,200))
  Next
  
  If comete=0 And ElapsedMilliseconds()-timer>3000
    comete=1
  EndIf
  
  If comete=1
    comete_x+3
    comete_y+1
    Circle(comete_x,comete_y,30,RGB(255,100,100))
    If comete_x>1040
      comete=2
    EndIf
  EndIf
  

  StopDrawing()
  
  FlipBuffers()
  
Until KeyboardPushed(#PB_Key_Escape) ;On quitte l'application en  appuyant sur la touche Echap (ESC)
http://HexaScrabble.com/
!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.00 - 64 bits
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Openscreen et gestion du temps.

Message par Ar-S »

Merci c'est bien ce que je craignais, ellapsemil indispensable.
~~~~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
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Openscreen et gestion du temps.

Message par SPH »

Ha heuuuu, oui, je crois qu'on ne peux pas y couper... 8)
http://HexaScrabble.com/
!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.00 - 64 bits
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Openscreen et gestion du temps.

Message par Ar-S »

Du coup j'ai fait une petite macro sympa pour simplifier l'écriture

Code : Tout sélectionner

Macro Active(_flag,_NbrSec)
If _flag=0 And ElapsedMilliseconds()-timer> (_NbrSec*1000)
  _flag=#True
EndIf  
EndMacro
Dans ton exemple ça donne

Code : Tout sélectionner

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Erreur", "Impossible d'initialiser l'écran.")
  End
EndIf

Macro Active(_flag,_NbrSec)
If _flag=0 And ElapsedMilliseconds()-start> (_NbrSec*1000)
  _flag=#True
EndIf  
EndMacro


;Ouverture de l'écran
If OpenScreen(1024,768,32,"Exemple OpenScreen") = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran.")
  End
EndIf

Dim stars_x(100)
Dim stars_y(100)
For i=0 To 100
  stars_x(i)=Random(1023)
  stars_y(i)=Random(767)
Next

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Boucle principale
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
timer=ElapsedMilliseconds()

Repeat
 
  ;Effacer complètement l'écran et afficher un fond gris
  ClearScreen(0)
 
  ;On lit les évènements clavier et souris
  ExamineKeyboard()
 
  StartDrawing(ScreenOutput())
  For i=0 To 100
    stars_x(i)+5
    If stars_x(i)>1023
      stars_x(i)-1023
    EndIf
    Plot(stars_x(i),stars_y(i),RGB(200,200,200))
  Next
 
; Macro de gestion du temps
  Active (comete,4) ; Lance la comete dans 4 sec
 
  If comete=1
    comete_x+3
    comete_y+1
    Circle(comete_x,comete_y,30,RGB(255,100,100))
    If comete_x>1040
      comete=2
    EndIf
  EndIf
 

  StopDrawing()
 
  FlipBuffers()
 
Until KeyboardPushed(#PB_Key_Escape) ;On quitte l'application en  appuyant sur la touche Echap (ESC)
~~~~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
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Openscreen et gestion du temps.

Message par djes »

Petite astuce pour les étoiles, les faire réapparaître sur le côté gauche de l'écran, AVANT la position 0, pour éviter de les voir apparaître dans l'écran...

Code : Tout sélectionner

    If stars_x(i)>1023
      stars_x(i)-1023 - spritewidth(stars_x(i))
    EndIf
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Openscreen et gestion du temps.

Message par Ar-S »

Oui c'est vrai j'aurai pu le mettre dans l'exemple que j'ai copié collé ^^
Dans ma proce j'utilise - Random(25) histoire de varier un poil l’écart des étoiles
~~~~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
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Openscreen et gestion du temps.

Message par djes »

Oui, sinon, je n'ai pas bien compris le problème de départ... Il y a plusieurs façons de gérer le temps en mode plein écran. On peut compter le nombre de frames, sachant que quand il n'y a pas de ralentissement, chaque frame vaut 1/60ème de seconde. Ce n'est pas fiable pour des événements en temps long, parce qu'il y aura forcément sous Windows des "frame drop". Par contre, c'est très fiable pour être sûr de faire partir un élément et de réagir après un certain déplacement correspondant à un certain nombre d'images. Il y a aussi les timers, mais il faut prévoir cette forme d'interruption du "program flow", avec éventuellement sauvegarde/restauration du contexte. Les outils sont là, c'est à chacun de bien les utiliser...
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Openscreen et gestion du temps.

Message par Ar-S »

Il y a aussi les timers, mais il faut prévoir cette forme d'interruption du "program flow", avec éventuellement sauvegarde/restauration du contexte.
Les timers nécessitent forcement une fenêtre non ? Sinon je n'ai pas trop compris ce que j'ai mis en gras dans ta phrase :oops:

Sinon volià le 1er rendu. Le lag et la qualité viennent de la capture et de l'encodage moisi ^^
https://youtu.be/Qev05UyQ5WQ
~~~~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
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Openscreen et gestion du temps.

Message par djes »

Ben ça va, c'est un bon début ! Par contre il faut mettre les étoiles en arrière-plan (premier truc dessiné).

Les timers nécessitent une fenêtre oui c'est exact, mais je pensais aux threads et le mot timer est sorti... :oops:

Dans la logique d'un jeu, il y a les sorties (ex affichage, son, réseau), celles qui ne peuvent souffrir aucun délai et dont l'actualisation est régulière (comme l'affichage), ou événementielle (réseau) ; il y a les entrées et d'autres événements (par ex les interactions avec l'utilisateur et le réseau, mais aussi certaines formes de logique de jeu) qui doivent être traitées avec une priorité à définir.

Dans les jeux à l'ancienne, on découpe le temps d'une frame en temps impartis à telle ou telle tâche (la plus grosse partie du temps étant consacré à l'affichage), en s'assurant qu'aucune n'est bloquante, et on passe de l'une à l'autre dans l'ordre et puis on recommence.

Dans les jeux récents, certaines tâches sont threadées ou mises dans des files d'attente ; il faut alors s'assurer que les tâches fonctionnant en parallèle ne vont pas empiéter les unes sur les autres. Par exemple, commencer à afficher un sprite alors qu'on n'a pas fini de le charger. C'est beaucoup plus compliqué à gérer. Autre exemple avec Ogre, on a un moteur capable de gérer plein de choses tout seul ; bref, son flux et le flux du programme principal sont détachés : pour les faire interagir, on utilise une sorte de communication par messages, ce n'est plus aussi "impératif". De plus en plus nos programmes fonctionnent ainsi.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Openscreen et gestion du temps.

Message par Ar-S »

Merci pour ces précisions.
Je pense threader les évènements sonores... à voir si c'est bloquant (faut d'abord que je me digitalise^^).
Par contre il faut mettre les étoiles en arrière-plan (premier truc dessiné).
Petit oublie de ma part effectivement.
ShowStar() : ShowMoon() : ShowShip() : ShowAstero()
~~~~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
Répondre