FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Je teste PANORAMIC V 1 beta 1
multiple timers sans plantage : ruse de sioux!!! Emptypar papydall Aujourd'hui à 2:48

» bouton dans autre form que 0
multiple timers sans plantage : ruse de sioux!!! Emptypar leclode Hier à 13:59

» KGF_dll - nouvelles versions
multiple timers sans plantage : ruse de sioux!!! Emptypar Klaus Hier à 11:41

» Gestion d'un système client-serveur.
multiple timers sans plantage : ruse de sioux!!! Emptypar Klaus Hier à 10:23

» PANORAMIC V 1
multiple timers sans plantage : ruse de sioux!!! Emptypar papydall Sam 4 Mai 2024 - 3:43

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
multiple timers sans plantage : ruse de sioux!!! Emptypar Froggy One Jeu 2 Mai 2024 - 11:16

» @Jack
multiple timers sans plantage : ruse de sioux!!! Emptypar Jack Mar 30 Avr 2024 - 20:40

» trop de fichiers en cours
multiple timers sans plantage : ruse de sioux!!! Emptypar papydall Lun 29 Avr 2024 - 23:39

» Une calculatrice en une ligne de programme
multiple timers sans plantage : ruse de sioux!!! Emptypar jean_debord Dim 28 Avr 2024 - 8:47

» Form(résolu)
multiple timers sans plantage : ruse de sioux!!! Emptypar leclode Sam 27 Avr 2024 - 17:59

» Bataille navale SM
multiple timers sans plantage : ruse de sioux!!! Emptypar jjn4 Ven 26 Avr 2024 - 17:39

» Les maths du crocodile
multiple timers sans plantage : ruse de sioux!!! Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

» Naissance de Crocodile Basic
multiple timers sans plantage : ruse de sioux!!! Emptypar jean_debord Jeu 25 Avr 2024 - 8:45

» Dessine-moi une galaxie
multiple timers sans plantage : ruse de sioux!!! Emptypar jjn4 Lun 22 Avr 2024 - 13:47

» Erreur END_SUB
multiple timers sans plantage : ruse de sioux!!! Emptypar jjn4 Lun 22 Avr 2024 - 13:43

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
Le deal à ne pas rater :
Funko POP! Jumbo One Piece Kaido Dragon Form : où l’acheter ?
Voir le deal

 

 multiple timers sans plantage : ruse de sioux!!!

Aller en bas 
2 participants
AuteurMessage
silverman

silverman


Nombre de messages : 968
Age : 51
Localisation : Picardie
Date d'inscription : 18/03/2015

multiple timers sans plantage : ruse de sioux!!! Empty
MessageSujet: multiple timers sans plantage : ruse de sioux!!!   multiple timers sans plantage : ruse de sioux!!! EmptyLun 22 Fév 2016 - 0:11

EDIT du 15/03/16 : v1.4, modifié et renommé la sub ON_TICKER(N%,objet%) en PERFORM_TICKER_EVENT(N%). L'objet associé à un ticker est créé automatiquement, il possède le même numéro que le ticker(qu'il faut maintenant considérer comme un objet à part entière!). Programmation encore plus simple!


EDIT du 06/03/16 : v1.3, remplacé le couple 'alpha/trigger_click' qui aléatoirement ne détecte pas toujours les évements, par le couple 'edit/on_change', plus fiable


EDIT du 26/02/16 : v1.2, support du 'mouvement basé sur le temps', ajout d'une info dans les messages d'erreur, programmation 'événement' ou 'séquentielle'


EDIT du 24/02/16 : v1.1, corrigé une erreur dans le code et ajout d'un message d'erreur si utilisation d'un TICKER non créé


Bonjour à tous

Comme beaucoup d'entre vous, je rechigne à utiliser plus d'un timer dans mon projet, ce n'est pas simple à gérer et en plus ça provoque des plantages.
Mais plus maintenant! Je suis tombé sur un code de pseudo timer (nommé ticker) que j'ai développé il y a quelques années en DarkBasic, et ça marche du tonnerre!!!
C'est particulièrement bien adapté à panoramic. Le principe est de n'utiliser qu'un seul timer qui sera un 'timer maitre', et qui va gérer tous les tickers. Chaque ticker est associé à un objet invisible (un edit), et déclenchera donc un événement qui lui est propre(via la commande 'text N,P'). Ce système ne peut pas interrompre un événement en cours, ni même une boucle, d'où sa stabilité.
J'ai concocté une démo avec 3 tickers, aucun problème! Les tickers ne sont gérés que par 6 subs, et s'utilises à peu près de la même façon que les timers:
V1.4:
' TICKER(N%)
' crée un pseudo objet ticker N% associé à un OBJET(un 'edit') invisible.(L'edit a le même numéro que le ticker)
'
' TICKER_INTERVAL(N%,delai%)
' défini l'interval de temps 'delai%' en milliseconde, du ticker N%. Par défaut, delai%=1000 ms
'
' PERFORM_TICKER_EVENT(N%)   <--- Cette commande doit être géré par le timer maitre !!!
' déclenche l'évènement si le delai% de 'TICKER_INTERVAL' est dépassé.
' 'objet%'=0 ne retourne pas d'erreur(pratique en programmation séquentielle)
'
' TICKER_ON(N%)
' met en pause le ticker N%
'
' TICKER_OFF(N%)
' redémarre le ticker N%
'
' ON_CHANGE N%,label
' exécute le programme à partir du label 'label' quand l'objet système N% a "changé"
'
' en plus, on peut connaitre l'état d'un ticker:
' TICKER_STATE(N%,0) :  0=false  /  1=true (true=event en cours d'exécution)
' TICKER_STATE(N%,1) :  0=start  /  1=pause
' TICKER_STATE(N%,2) :  nb d'image/sec affiché entre 2 appels(si >1 alors on a perdu des images)
' TICKER_STATE(N%,3) :  ticker_exist
'
' TICKER_TIME_SCALE(scale) : permet de créer un effet d'accélération/ralenti pour les graphismes.
'
' Il n'y a pas besoin de déclarer quoi que ce soit, juste copier les subs dans
' votre source. C'est tout!!!


V1.2 et +: on peut maintenant utiliser les tickers des 2 manières que permet panoramic: en évènement ou en programmation séquentielle. De plus, le support du 'mouvement basé sur le temps' pour les animations a été ajouté.
Le 'mouvement basé sur le temps' est systématiquement utilisé dans les jeux, car les jeux indépendants de la cadence d'image sont des jeux qui s'exécutent à la même vitesse d'un ordinateur à l'autre, quel que soit la puissance de l'ordinateur utilisé (les objets bougent à la même vitesse).


Les subs V1.4:
Code:

' ##############################################################################
' #                                                                            #
' #                                Les SUBs  V1.4                              #
' #                                                                            #
' ##############################################################################

' ##############################################################################
'
sub TICKER(N%)
 if variable("memorise_tickers")=0
  dim memorise_tickers
  ' un tableau pour gérer le tickers
  dim TICKER_STATE(9999,5)
  TICKER_STATE(0,2)=1
 end_if
' erreur 1
   edit N% : hide N%
   if TICKER_STATE(0,0)=0
      TICKER_STATE(0,0)=NUMBER_TICKS
   end_if
   TICKER_STATE(N%,5)=1000
   TICKER_STATE(N%,1)=0
   TICKER_STATE(N%,4)=TICKER_STATE(0,0)+TICKER_STATE(N%,5)
   TICKER_STATE(N%,3)=1
   TICKER_STATE(N%,2)=1
end_sub


'
sub TICKER_INTERVAL(N%,delai%)
' erreur 2
   if TICKER_STATE(N%,3)=0 then message "(2)Le TICKER n°"+str$(N%)+" n'existe pas" : terminate
   if delai%<1 then message "(2)TICKER n°"+str$(N%)+": Délai nul ou négatif" : terminate
   TICKER_STATE(N%,4)=TICKER_STATE(N%,4)-TICKER_STATE(N%,5)+delai%
   TICKER_STATE(N%,5)=delai%
end_sub


'
sub PERFORM_TICKER_EVENT(N%)
' erreur 3
   if TICKER_STATE(N%,3)=0 then message "(3)Le TICKER n°"+str$(N%)+" n'existe pas" : terminate
   if TICKER_STATE(0,1)=0
      TICKER_STATE(0,0)=NUMBER_TICKS
      TICKER_STATE(0,1)=N%
   else
      if TICKER_STATE(0,1)=N% then TICKER_STATE(0,0)=NUMBER_TICKS
   end_if
   TICKER_STATE(N%,0)=0
   if TICKER_STATE(0,0)>=TICKER_STATE(N%,4)
      TICKER_STATE(N%,0)=1
      TICKER_STATE(N%,2)=TICKER_STATE(0,2)*int((TICKER_STATE(0,0)-TICKER_STATE(N%,4))/TICKER_STATE(N%,5))+1
      TICKER_STATE(N%,4)=TICKER_STATE(0,0)-mod(TICKER_STATE(0,0)-TICKER_STATE(N%,4),TICKER_STATE(N%,5))+TICKER_STATE(N%,5)
      if TICKER_STATE(N%,1)=0
         text N%,str$(NUMBER_TICKS)
      end_if
   end_if
end_sub


'
sub TICKER_ON(N%)
' erreur 4
   if TICKER_STATE(N%,3)=0 then message "(4)Le TICKER n°"+str$(N%)+" n'existe pas" : terminate
   TICKER_STATE(N%,1)=0
end_sub


'
sub TICKER_OFF(N%)
' erreur 5
   if TICKER_STATE(N%,3)=0 then message "(5)Le TICKER n°"+str$(N%)+" n'existe pas" : terminate
   TICKER_STATE(N%,1)=1
end_sub


'
sub TICKER_TIME_SCALE(scale)
' erreur 6
   if TICKER_STATE(N%,3)=0 then message "(6)Le TICKER n°"+str$(N%)+" n'existe pas" : terminate
   TICKER_STATE(0,2)=scale
end_sub

démo:


Dernière édition par silverman le Sam 19 Nov 2016 - 13:59, édité 27 fois
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

multiple timers sans plantage : ruse de sioux!!! Empty
MessageSujet: Re: multiple timers sans plantage : ruse de sioux!!!   multiple timers sans plantage : ruse de sioux!!! EmptyLun 22 Fév 2016 - 0:26

Il faut vraiment que tu fasses des articles avec toutes ces astuces (un articles par astuce avec un bon code de démo, de toute façon tu les fais déjà les programmes de démo). Tu as beaucoup trop d'astuces super pratiques qui risqueraient d'être ratées par les gens qui passeront dans quelques mois.

En tout cas merci pour cette astuce.

C'est un peu le principe que j'utilisais dans mes jeux : j'utilisais un seul timer et j'implémentais un système de compteur de boucles qui appelaient une procédure quand leur valeur limite était dépassée.
Revenir en haut Aller en bas
silverman

silverman


Nombre de messages : 968
Age : 51
Localisation : Picardie
Date d'inscription : 18/03/2015

multiple timers sans plantage : ruse de sioux!!! Empty
MessageSujet: Re: multiple timers sans plantage : ruse de sioux!!!   multiple timers sans plantage : ruse de sioux!!! EmptyLun 22 Fév 2016 - 11:55

Oulà! la 'littérature et moi... Neutral
Je poste tout ça pour laisser une trace dans le forum; j'utilise très souvent l'outil de recherche pour trouver une solution à mes problèmes, ou m'en inspirer une dans le cas échéant. Ma devise est que si ce que je trouve m'aide, alors ce que je laisse doit aider!

J'en ai pas fini avec ce système de ticker, bien que particulièrement efficace, je compte l'améliorer encore un poil, j'ai l'idée mais je dois tester. Plus le temp maintenant, il faut que j'aille bosser
Revenir en haut Aller en bas
silverman

silverman


Nombre de messages : 968
Age : 51
Localisation : Picardie
Date d'inscription : 18/03/2015

multiple timers sans plantage : ruse de sioux!!! Empty
MessageSujet: Re: multiple timers sans plantage : ruse de sioux!!!   multiple timers sans plantage : ruse de sioux!!! EmptyMer 24 Fév 2016 - 19:14

V1.1: corrigé une erreur dans le code et ajout d'un message d'erreur si utilisation d'un TICKER non créé

MAJ premier post
Revenir en haut Aller en bas
silverman

silverman


Nombre de messages : 968
Age : 51
Localisation : Picardie
Date d'inscription : 18/03/2015

multiple timers sans plantage : ruse de sioux!!! Empty
MessageSujet: Re: multiple timers sans plantage : ruse de sioux!!!   multiple timers sans plantage : ruse de sioux!!! EmptyVen 26 Fév 2016 - 19:24

V1.2 et +: support du 'mouvement basé sur le temps', ajout d'une info dans les messages d'erreur, programmation 'événement' ou 'séquentielle'

MAJ premier post

Exemple de 'mouvement basé sur le temps':
Code:


' variable d'état:
' TICKER_STATE(N%,0) :  0=false  /  1=true (true=event en cours d'exécution)
' TICKER_STATE(N%,1) :  0=start  /  1=pause
' TICKER_STATE(N%,2) :  nb d'image/sec affiché entre 2 appels(si >1 alors on a perdu des images)
' TICKER_STATE(N%,3) :  ticker_exist
'


dim N%,delai%,vitesse_ang,angle,oldangle,elapsed_frame,tours,lasttime$

label fini

scene3d 1
width 1,300:height 1,300 : left 1,200

cam_position 0,0,5
3d_cube 1,2

caption 0,"barre d'espace pour terminer"
alpha 2             :' pour afficher le nb de tours
alpha 3 : top 3,20  :' pour afficher l'heure avant un tour
alpha 4 : top 4,40  :' pour afficher l'heure apres un tour
alpha 5 : top 5,60  :' pour afficher le nb d'images/sec perdues entre 2 appels

N%=10 : delai%=50                         :' changer le délai ne change pas la vitesse de l'objet, mais la 'fluidité' de l'affichage
TICKER(N%) : TICKER_INTERVAL(N%,delai%)  :'

' pour la démo : un cube qui tourne à 6 tours par minute
' 6 tours par minute = (6 * 360 degrés / 60 secondes) = degrés par seconde   et   (1000 millisecondes / delai%) = nb d'images par seconde
' (degrés par seconde / images par seconde) = degrés par image
vitesse_ang=(6*360/60)/(1000/delai%)
'
' affichage de statistique
lasttime$=time$
caption 2,"nb de tours = 0"
caption 3,lasttime$
caption 4,"00:00:00"
'
repeat
   PERFORM_TICKER_EVENT(N%)                                :' surveille le temps
   if TICKER_STATE(N%,0)=1                                 :' dès que le délai du ticker est atteind
      elapsed_frame=TICKER_STATE(N%,2)                     :' nb d'image depuis le dernier appel(si elapsed_frame>1 alors on a perdu des images)
      angle=wrap_value(angle+(vitesse_ang*elapsed_frame))  :' angle = (angle pour 1 image) multiplié par (le nb d'image écoulé/perdu depuis le dernier appel)
      3d_y_rotate 1,angle                                  :' tourne l'objet
   end_if
   '
   if oldangle>angle                                       :' affiche des statistiques
      tours=tours+1
      caption 2,"nb de tours = "+str$(tours)
      caption 3,lasttime$
      caption 4,time$
      lasttime$=time$
   end_if
   '
   oldangle=angle
  
   caption 5,"nb d'images/sec perdues="+str$(TICKER_STATE(N%,2) -1 ) :' nb d'images/sec perdues
  
   ' enlever le REM pour voir un nb d'images/sec perdues s'afficher
'   wait 100
until scancode=32
goto fini                                                  :' quitte sans bruit

END
' ##############################################################################
' #                                                                            #
' #                                Les SUBs  V1.4                              #
' #                                                                            #
' ##############################################################################

' ##############################################################################
'
sub TICKER(N%)
 if variable("memorise_tickers")=0
  dim memorise_tickers
  ' un tableau pour gérer le tickers
  dim TICKER_STATE(9999,5)
  TICKER_STATE(0,2)=1
 end_if
' erreur 1
   edit N% : hide N%
   if TICKER_STATE(0,0)=0
      TICKER_STATE(0,0)=NUMBER_TICKS
   end_if
   TICKER_STATE(N%,5)=1000
   TICKER_STATE(N%,1)=0
   TICKER_STATE(N%,4)=TICKER_STATE(0,0)+TICKER_STATE(N%,5)
   TICKER_STATE(N%,3)=1
   TICKER_STATE(N%,2)=1
end_sub


'
sub TICKER_INTERVAL(N%,delai%)
' erreur 2
   if TICKER_STATE(N%,3)=0 then message "(2)Le TICKER n°"+str$(N%)+" n'existe pas" : terminate
   if delai%<1 then message "(2)TICKER n°"+str$(N%)+": Délai nul ou négatif" : terminate
   TICKER_STATE(N%,4)=TICKER_STATE(N%,4)-TICKER_STATE(N%,5)+delai%
   TICKER_STATE(N%,5)=delai%
end_sub


'
sub PERFORM_TICKER_EVENT(N%)
' erreur 3
   if TICKER_STATE(N%,3)=0 then message "(3)Le TICKER n°"+str$(N%)+" n'existe pas" : terminate
   if TICKER_STATE(0,1)=0
      TICKER_STATE(0,0)=NUMBER_TICKS
      TICKER_STATE(0,1)=N%
   else
      if TICKER_STATE(0,1)=N% then TICKER_STATE(0,0)=NUMBER_TICKS
   end_if
   TICKER_STATE(N%,0)=0
   if TICKER_STATE(0,0)>=TICKER_STATE(N%,4)
      TICKER_STATE(N%,0)=1
      TICKER_STATE(N%,2)=TICKER_STATE(0,2)*int((TICKER_STATE(0,0)-TICKER_STATE(N%,4))/TICKER_STATE(N%,5))+1
      TICKER_STATE(N%,4)=TICKER_STATE(0,0)-mod(TICKER_STATE(0,0)-TICKER_STATE(N%,4),TICKER_STATE(N%,5))+TICKER_STATE(N%,5)
      if TICKER_STATE(N%,1)=0
         text N%,str$(NUMBER_TICKS)
      end_if
   end_if
end_sub


'
sub TICKER_ON(N%)
' erreur 4
   if TICKER_STATE(N%,3)=0 then message "(4)Le TICKER n°"+str$(N%)+" n'existe pas" : terminate
   TICKER_STATE(N%,1)=0
end_sub


'
sub TICKER_OFF(N%)
' erreur 5
   if TICKER_STATE(N%,3)=0 then message "(5)Le TICKER n°"+str$(N%)+" n'existe pas" : terminate
   TICKER_STATE(N%,1)=1
end_sub


'
sub TICKER_TIME_SCALE(scale)
' erreur 5
   if TICKER_STATE(N%,3)=0 then message "(5)Le TICKER n°"+str$(N%)+" n'existe pas" : terminate
   TICKER_STATE(0,2)=scale
end_sub


' ##############################################################################
'
fini:
   terminate

Même lorsque le cube se fige quand on déplace la fenêtre, il prend la position qu'il aurait dû avoir si rien n'avait interrompu son mouvement


Dernière édition par silverman le Mar 15 Mar 2016 - 18:34, édité 4 fois
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

multiple timers sans plantage : ruse de sioux!!! Empty
MessageSujet: Re: multiple timers sans plantage : ruse de sioux!!!   multiple timers sans plantage : ruse de sioux!!! EmptyVen 26 Fév 2016 - 21:06

oui je pense que c'est le genre de principe utilisé dans les jeux multijoueur en 3D pour pallier les "lags" que peut avoir ponctuellement un joueur
Revenir en haut Aller en bas
silverman

silverman


Nombre de messages : 968
Age : 51
Localisation : Picardie
Date d'inscription : 18/03/2015

multiple timers sans plantage : ruse de sioux!!! Empty
MessageSujet: Re: multiple timers sans plantage : ruse de sioux!!!   multiple timers sans plantage : ruse de sioux!!! EmptyDim 6 Mar 2016 - 19:51

v1.3, remplacé le couple 'alpha/trigger_click' qui aléatoirement ne détecte pas toujours les évements, par le couple 'edit/on_change', plus fiable

MAJ premier post
Revenir en haut Aller en bas
silverman

silverman


Nombre de messages : 968
Age : 51
Localisation : Picardie
Date d'inscription : 18/03/2015

multiple timers sans plantage : ruse de sioux!!! Empty
MessageSujet: Re: multiple timers sans plantage : ruse de sioux!!!   multiple timers sans plantage : ruse de sioux!!! EmptyMar 15 Mar 2016 - 19:09

EDIT du 15/03/16 : v1.4, modifié et renommé la sub ON_TICKER(N%,objet%) en PERFORM_TICKER_EVENT(N%). L'objet associé à un ticker est créé automatiquement, il possède le même numéro que le ticker(qu'il faut maintenant considérer comme un objet à part entière!). Programmation encore plus simple!

MAJ premier post
Revenir en haut Aller en bas
Contenu sponsorisé





multiple timers sans plantage : ruse de sioux!!! Empty
MessageSujet: Re: multiple timers sans plantage : ruse de sioux!!!   multiple timers sans plantage : ruse de sioux!!! Empty

Revenir en haut Aller en bas
 
multiple timers sans plantage : ruse de sioux!!!
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Stopper les timers en cas de défaut
» Débogueur reporté sur une autre fenêtre.
» copie multiple clip_board
» MULTICOPIES - un presse papier multiple
» Lanceur multiple pour un programme découpé.

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: