Re: Pour YOGI
Publié : lun. 24/oct./2016 15:57
Voilà Yogi, tu peux mater ça : http://www.purebasic.fr/french/viewtopi ... =8&t=16343
Code : Tout sélectionner
Enumeration
#FEN ; ta fenetre
#TIM; ton timer
#BAR; ta barre
EndEnumeration
Global Duree = 1000 ; durrée en millisec donc là on part sur un timer de 1 sec
If OpenWindow(#fen, 0, 0, 400, 100, "Exemple Minuteur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ProgressBarGadget(#BAR, 10, 10, 380, 20, 0, 100)
; Ajout du minuteur #TIM dans la fenêtre #FEN qui se déclenchera toutes les 1sec
AddWindowTimer(#FEN, #TIM, Duree)
Value = 0
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Timer And EventTimer() = #TIM
; Toutes les sec il va se passer ça !
Value = (Value + 5) % 100
SetGadgetState(#BAR, Value)
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Code : Tout sélectionner
; S'obliger à déclarer les variables
; (évite les les erreurs par bêtes fautes de frppae ;-)
EnableExplicit
; Laisser PB affecter des numéros aux objets
; On est ainsi sûr de ne pas utiliser le même numéro par erreur
Enumeration
#Win
#Txt
#Timer
EndEnumeration
; Dans un programme plus grand on utilise les énumération nommées
; Ouvrir une fenêtre (centrée et avec le menu système et la case de fermeture)
; (Note: Pour la lisibilité, en PB on peut couper les lignes après , + - * / )
; (L'indentation automatique va aligner correctement le tout)
; (Note2: Avant "livraison" il est conseillé de faire CTRL+A puis CTRL+I)
; (Ce qui va tout réindenter correctement)
OpenWindow(#Win, 0, 0, 300, 100, "Horloge",
#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; Créer une zone de texte (le texte sera centré horizontalement)
TextGadget(#Txt, 100, 40, 90, 20, "Hello World!", #PB_Text_Center)
; Ajouter un timer (délai en milliseconde)
; Un timer est toujours lié à une fenêtre!
AddWindowTimer(#Win, #Timer, 1000)
; Boucle principale (méthode classique)
; On utilise maintenant souvent la méthode Bind...
; Qui permet le déclenchement immédiat. (à suivre...)
Repeat
; Scruter la file d'évènement
; = s'arrêter dès qu'il se passe quelque-chose
; + Voir si un des évènements correspond à un cas listé
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
; L'utilisateur a cliqué sur la case de fermeture de la fenêtre
; Quitter la boucle principale
Break
; On aurait pu aussi mettre directement End
; Mais on peut parfois avoir des choses à faire
; avant de quitter complètement un programme (sauvegarde)
Case #PB_Event_Timer
; Un évènement de type timer s'est déclenché
If EventTimer() = #Timer
; Si ce timer est le timer 1
; On écrit la nouvelle heure
; (FormatDate() utilise le même système que printf en C)
SetGadgetText(#Txt, FormatDate("%hh:%ii:%ss", Date()))
EndIf
EndSelect
ForEver
End
Code : Tout sélectionner
; S'obliger à déclarer les variables
; (évite les les erreurs par bêtes fautes de frppae ;-)
EnableExplicit
; Laisser PB affecter des numéros aux objets
; On est ainsi sûr de ne pas utiliser le même numéro par erreur
Enumeration
#Win
#Txt
#Timer
EndEnumeration
; Dans un programme plus grand on utilise les énumération nommées
; Ouvrir une fenêtre (centrée et avec le menu système et la case de fermeture)
; (Note: Pour la lisibilité, en PB on peut couper les lignes après , + - * / )
; (L'indentation automatique va aligner correctement le tout)
; (Note2: Avant "livraison" il est conseillé de faire CTRL+A puis CTRL+I)
; (Ce qui va tout réindenter correctement)
OpenWindow(#Win, 0, 0, 300, 100, "Horloge",
#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; Créer une zone de texte (le texte sera centré horizontalement)
TextGadget(#Txt, 100, 40, 90, 20, "Hello World!", #PB_Text_Center)
; Ajouter un timer (délai en milliseconde)
; Un timer est toujours lié à une fenêtre!
AddWindowTimer(#Win, #Timer, 1000)
; --- Procédures appelées par les déclencheurs
Procedure Quit()
End
EndProcedure
Procedure Update_Clock()
SetGadgetText(#Txt, FormatDate("%hh:%ii:%ss", Date()))
EndProcedure
; --- Déclencheurs
BindEvent(#PB_Event_CloseWindow, @Quit())
BindEvent(#PB_Event_Timer, @Update_Clock())
; Avantages:
; - Les appels se font à tout moment
; - Plus rapide (effet visible sur le redimensionnement de fenêtres avec gadgets)
; - Un gadget système peut être appelé avec uniquement la fenêtre concernée
; (utile pour la Case de fermeture, si on utilise plusieurs fenêtres)
; voir aussi:
; - BindGadgetEvent()
; - BindMenuEvent()
; --- Boucle principale (c'est tout :-)
Repeat
WaitWindowEvent()
ForEver
Code : Tout sélectionner
; S'obliger à déclarer les variables
; (évite les les erreurs par bêtes fautes de frppae ;-)
EnableExplicit
; Laisser PB affecter des numéros aux objets
; On est ainsi sûr de ne pas utiliser le même numéro par erreur
Enumeration
#Win
#Txt
#Timer_1
EndEnumeration
Declare timerproc(hwnd.l, umsg.l, idevent.l, dwtime.l)
OpenWindow(#Win, 0, 0, 300, 100, "Horloge", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; Créer une zone de texte (le texte sera centré horizontalement)
TextGadget(#Txt, 100, 40, 90, 20, "Hello World!", #PB_Text_Center)
; Ajouter un timer (délai en milliseconde)
SetTimer_(WindowID(#Win), #timer_1, 1000, @TimerProc()) ; defnition du timer , toutes les 1 secondes, on appel la procedure TimerProc()
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
; L'utilisateur a cliqué sur la case de fermeture de la fenêtre
; Quitter la boucle principale
Break
; On aurait pu aussi mettre directement End
; Mais on peut parfois avoir des choses à faire
; avant de quitter complètement un programme (sauvegarde)
EndSelect
ForEver
;Zone procedure
; cette procedure contient les actions a effectuer par le timer
Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Select uMsg
Case #WM_TIMER
Select idEvent
Case #timer_1 ; se qui se passe lors de l'appel du timer
SetGadgetText(#Txt, FormatDate("%hh:%ii:%ss", Date())) ; on affiche l'heure
EndSelect
EndSelect
EndProcedure
End
oui c'est pareille !!yogi a écrit : en lua je définie l'effet et l'appelle dans le timer, j'ai l'impression que c'est la même chose ?
stéphane
Code : Tout sélectionner
AddWindowTimer(#Win, #Timer, 1000)
Code : Tout sélectionner
Case #PB_Event_Timer
; Un évènement de type timer s'est déclenché
If EventTimer() = #Timer
Code : Tout sélectionner
SetGadgetText(#Txt, FormatDate("%hh:%ii:%ss", Date()))
Code : Tout sélectionner
gachette.b
Code : Tout sélectionner
Enumeration
#Window
#timer
#ball
EndEnumeration
Structure ball
x.l
y.l
sensy.l
EndStructure
Declare SetResolution(RezX, RezY, NbCoul, Frequence, Memoriser) ; si SetResolution=2 la résolution est identique à l'actuelle, si 1 erreur lors de la recherche des infos, sinon regarder #DISP_CHANG_...
ExamineDesktops()
global x_ecran1=DesktopWidth(0) ; on note la resolution actuelle
global y_ecran1=DesktopHeight(0) ; on note la resolution actuelle
SetResolution(800,600,32,60,1) ; on force la resolution en 800x600
ExamineDesktops()
global x_ecran=DesktopWidth(0) ; recupe la resolution changé pour le jeux
global y_ecran=DesktopHeight(0); recupe la resolution changé pour le jeux
Dim ball.ball(1)
ball(1)\x =x_ecran/2
ball(1)\y=y_ecran
ball(1)\sensy.l=-32 ; sens de deplacement de la balle ( monte )
Global gachette.b,compteur_de_tir
InitSprite():InitKeyboard()
If OpenWindow(#Window, 0, 0, x_ecran, y_ecran,"", #PB_Window_BorderLess )
OpenWindowedScreen(WindowID(#Window),0,0,x_ecran, y_ecran,1,0,0)
StickyWindow(#window,1)
; ********** creation du sprite ********************
CreateSprite(#ball,32,32)
StartDrawing(SpriteOutput(#ball))
Circle(16,16,16,RGB(255,255,0))
StopDrawing()
; **********************************************
AddWindowTimer(#Window, #timer, 1000)
SetFrameRate(60)
; *********** boucle principale ******************************************
Repeat
ExamineKeyboard()
If compteur_de_tir>50
beep_(440,100)
gachette.b=0 ; on a arreté le tir parceque le compteur est superieur a 10
; mais le timer tourne toujours ..... ;o)
EndIf
If gachette.b=1 ; le timer a declenché la gachette
ball(1)\y=ball(1)\y+ball(1)\sensy.l
If ball(1)\y<0
ball(1)\y=y_ecran
gachette.b=0 ; la balle est arrivé en haut on la remet a sa place, et la gachette reviens a sa place
EndIf
Else
ball(1)\y=y_ecran
gachette.b=0 ; on remet la gachette a zero pour le prochain timer
EndIf
; ******************* les events *****************************************
select waitWindowEvent(2) ; le 20 permet de rendre la main au system , sinon il faut creer un evenement pour faire bouger la balle ( en bougeant la souris par ex )
case #PB_Event_Timer ; un evenement timer a lieu
if EventTimer() = #timer; il s'agit de notre timer (on peut bien sur en avoir plusieurs )
;Debug "--------------------1 seconde"
; Ici, le code à executer toutes les secondes
compteur_de_tir=compteur_de_tir+1 ; on incrmente le nombre de tir , pour pouvoir l'arreter
gachette.b=1
endif
EndSelect
; CallDebugger
DisplaySprite(#ball,ball(1)\x,ball(1)\y)
FlipBuffers()
ClearScreen(RGB(0,0,0))
Until KeyboardPushed(#PB_Key_Escape) Or Event=#PB_Event_CloseWindow
; **********************************************************************
EndIf
SetResolution(x_ecran1,y_ecran1,32,60,1) ; on remet la resolution du debut !!
Procedure SetResolution(RezX, RezY, NbCoul, Frequence, Memoriser)
; si SetResolution=2 la résolution est identique à l'actuelle, si 1 erreur lors de la recherche des infos, sinon regarder #DISP_CHANG_...
dm.DEVMODE
If EnumDisplaySettings_ (0, -1, @dm)
If RezX = dm\dmPelsWidth And RezY = dm\dmPelsHeight And NbCoul = dm\dmBitsPerPel And Frequence=dm\dmDisplayFrequency : ProcedureReturn 2 : EndIf
dmEcran.DEVMODE
dmEcran\dmSize = SizeOf (dmEcran)
dmEcran\dmFields = #DM_PELSWIDTH|#DM_PELSHEIGHT|#DM_BITSPERPEL|#DM_DISPLAYFREQUENCY
dmEcran\dmPelsWidth = RezX
dmEcran\dmPelsHeight = RezY
dmEcran\dmBitsPerPel = NbCoul
dmEcran\dmDisplayFrequency = Frequence
If Memoriser=1 : Memoriser= #CDS_UPDATEREGISTRY | #CDS_NORESET : Else : Memoriser= #CDS_FULLSCREEN : EndIf
dmx = ChangeDisplaySettings_ (@dmEcran,Memoriser)
ProcedureReturn dmx
Else
ProcedureReturn 1
EndIf
EndProcedure
; EPB
Code : Tout sélectionner
Declare TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Enumeration
#timer_1
#timer_2
#timer_3
EndEnumeration
If OpenWindow(0, 100, 100, 100, 100,"", #PB_Window_SystemMenu|#PB_Window_SizeGadget)
Handle = WindowID(0)
SetTimer_(Handle, #timer_1, 1000, @TimerProc()) ; envoie un evenement toutes les 1000 millisecondes ; en fait on prepare un timer qui enverra cette evenement
SetTimer_(Handle, #timer_2, 100, @TimerProc()) ; envoie un evenement toutes les 200 millisecondes ; en fait on prepare un timer qui enverra cette evenement
SetTimer_(Handle, #timer_3, 3000, @TimerProc()) ; envoie un evenement toutes les 3000 millisecondes ; en fait on prepare un timer qui enverra cette evenement
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
; cette procedure contient les actions a effectuer des 3 timers
Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Select uMsg
Case #WM_TIMER
Select idEvent
Case #timer_1
Debug "le timer---------------1 seconde"
; Ici, le code à executer toutes les secondes
beep_(440,100)
Case #timer_2
Debug "le timer 0.1 secondes"
; Ici, le code à executer toutes les 200 millisecondes
Case #timer_3
Debug "le timer ------------------------------------3 secondes"
beep_(880,100)
; Ici, le code à executer toutes les 3 secondes
EndSelect
EndSelect
EndProcedure
; EPB
Aie, aie aie, directement les APIZorro a écrit : perso, j'aime bien la version API windows
elle est plus clair a lire , je trouve
Code : Tout sélectionner
Procedure SetResolution(RezX, RezY, NbCoul, Frequence, Memoriser)
; si SetResolution=2 la résolution est identique à l'actuelle, si 1 erreur lors de la recherche des infos, sinon regarder #DISP_CHANG_...
dm.DEVMODE
If EnumDisplaySettings_ (0, -1, @dm)
If RezX = dm\dmPelsWidth And RezY = dm\dmPelsHeight And NbCoul = dm\dmBitsPerPel And Frequence=dm\dmDisplayFrequency : ProcedureReturn 2 : EndIf
dmEcran.DEVMODE
dmEcran\dmSize = SizeOf (dmEcran)
dmEcran\dmFields = #DM_PELSWIDTH|#DM_PELSHEIGHT|#DM_BITSPERPEL|#DM_DISPLAYFREQUENCY
dmEcran\dmPelsWidth = RezX
dmEcran\dmPelsHeight = RezY
dmEcran\dmBitsPerPel = NbCoul
dmEcran\dmDisplayFrequency = Frequence
If Memoriser=1 : Memoriser= #CDS_UPDATEREGISTRY | #CDS_NORESET : Else : Memoriser= #CDS_FULLSCREEN : EndIf
dmx = ChangeDisplaySettings_ (@dmEcran,Memoriser)
ProcedureReturn dmx
Else
ProcedureReturn 1
EndIf
EndProcedure
Code : Tout sélectionner
OpenScreen(800, 600, 32, "")
Code : Tout sélectionner
CloseScreen()
Code : Tout sélectionner
Enumeration
#Window
#timer
#ball
EndEnumeration
Structure ball
x.l
y.l
sensy.l
EndStructure
;
;Declare SetResolution(RezX, RezY, NbCoul, Frequence, Memoriser) ; si SetResolution=2 la résolution est identique à l'actuelle, si 1 erreur lors de la recherche des infos, sinon regarder #DISP_CHANG_...
ExamineDesktops()
Global x_ecran1=DesktopWidth(0) ; on note la resolution actuelle
Global y_ecran1=DesktopHeight(0) ; on note la resolution actuelle
;SetResolution(800,600,32,60,1) ; on force la resolution en 800x600
; remplacé par OpenScreen(800, 600, 32, "") après InitSprite
ExamineDesktops()
Global x_ecran=DesktopWidth(0) ; recupe la resolution changé pour le jeux
Global y_ecran=DesktopHeight(0); recupe la resolution changé pour le jeux
Dim ball.ball(1)
ball(1)\x =x_ecran/2
ball(1)\y=y_ecran
ball(1)\sensy.l=-32 ; sens de deplacement de la balle ( monte )
Global gachette.b,compteur_de_tir
InitSprite():InitKeyboard()
; hop
OpenScreen(800, 600, 32, "")
If OpenWindow(#Window, 0, 0, x_ecran, y_ecran,"", #PB_Window_BorderLess )
OpenWindowedScreen(WindowID(#Window),0,0,x_ecran, y_ecran,1,0,0)
StickyWindow(#window,1)
; ********** creation du sprite ********************
CreateSprite(#ball,32,32)
StartDrawing(SpriteOutput(#ball))
Circle(16,16,16,RGB(255,255,0))
StopDrawing()
; **********************************************
AddWindowTimer(#Window, #timer, 1000)
SetFrameRate(60)
; *********** boucle principale ******************************************
Repeat
ExamineKeyboard()
If compteur_de_tir>50
Beep_(440,100)
gachette.b=0 ; on a arreté le tir parceque le compteur est superieur a 10
; mais le timer tourne toujours ..... ;o)
EndIf
If gachette.b=1 ; le timer a declenché la gachette
ball(1)\y=ball(1)\y+ball(1)\sensy.l
If ball(1)\y<0
ball(1)\y=y_ecran
gachette.b=0 ; la balle est arrivé en haut on la remet a sa place, et la gachette reviens a sa place
EndIf
Else
ball(1)\y=y_ecran
gachette.b=0 ; on remet la gachette a zero pour le prochain timer
EndIf
; ******************* les events *****************************************
Select WaitWindowEvent(2) ; le 20 permet de rendre la main au system , sinon il faut creer un evenement pour faire bouger la balle ( en bougeant la souris par ex )
Case #PB_Event_Timer ; un evenement timer a lieu
If EventTimer() = #timer; il s'agit de notre timer (on peut bien sur en avoir plusieurs )
;Debug "--------------------1 seconde"
; Ici, le code à executer toutes les secondes
compteur_de_tir=compteur_de_tir+1 ; on incrmente le nombre de tir , pour pouvoir l'arreter
gachette.b=1
EndIf
EndSelect
; CallDebugger
DisplaySprite(#ball,ball(1)\x,ball(1)\y)
FlipBuffers()
ClearScreen(RGB(0,0,0))
Until KeyboardPushed(#PB_Key_Escape) Or Event=#PB_Event_CloseWindow
; **********************************************************************
EndIf
;
;SetResolution(x_ecran1,y_ecran1,32,60,1) ; on remet la resolution du debut !!
CloseScreen()
[reedit] Text modifié !Marc56 a écrit : Il y a tout ce qu'il faut dans la lib interne Screen pour gérer les modes écran (et surtout c'est valable quelque soit l'OS)
Reste encore Beep_ pour lequel PB n'a toujours pas de fonction interne![]()