Page 1 sur 3
Openscreen et gestion du temps.
Publié : jeu. 15/févr./2018 11:13
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.
Re: Openscreen et gestion du temps.
Publié : jeu. 15/févr./2018 18:01
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
Re: Openscreen et gestion du temps.
Publié : jeu. 15/févr./2018 19:38
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().
Re: Openscreen et gestion du temps.
Publié : jeu. 15/févr./2018 19:41
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)

Re: Openscreen et gestion du temps.
Publié : jeu. 15/févr./2018 20:22
par Ar-S
Exemple
- J'ai mon Openscreen avec des starfields qui défilent
- Au bout de 5 sec je fais traverser un asteroid
Re: Openscreen et gestion du temps.
Publié : jeu. 15/févr./2018 22:20
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)
Re: Openscreen et gestion du temps.
Publié : jeu. 15/févr./2018 22:48
par Ar-S
Merci c'est bien ce que je craignais, ellapsemil indispensable.
Re: Openscreen et gestion du temps.
Publié : jeu. 15/févr./2018 22:57
par SPH
Ha heuuuu, oui, je crois qu'on ne peux pas y couper...

Re: Openscreen et gestion du temps.
Publié : ven. 16/févr./2018 8:52
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)
Re: Openscreen et gestion du temps.
Publié : ven. 16/févr./2018 12:32
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
Re: Openscreen et gestion du temps.
Publié : ven. 16/févr./2018 13:00
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
Re: Openscreen et gestion du temps.
Publié : ven. 16/févr./2018 13:54
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...
Re: Openscreen et gestion du temps.
Publié : ven. 16/févr./2018 14:32
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
Sinon volià le 1er rendu. Le lag et la qualité viennent de la capture et de l'encodage moisi ^^
https://youtu.be/Qev05UyQ5WQ
Re: Openscreen et gestion du temps.
Publié : ven. 16/févr./2018 15:04
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...
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.
Re: Openscreen et gestion du temps.
Publié : ven. 16/févr./2018 15:40
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()