Chronométrer vos jeux

Creations

chris-scientist

5 years ago

Voici une application que vous pouvez réutiliser dans vos jeux !

Elle permet de mesurer le temps, oui c'est un chronomètre.

Attention cependant se n'est pas aussi fiable qu'un vrai chronomètre : ne mesurez donc pas un marathon ou une course quelconque !

Voici deux visuels possibles :

  • Mode "CHRONO" en cours (visuel par défaut) :
  
  • Mode "BASIQUE" en pause (plus utile pour débugguer) :
  

Commandes

Bouton A

  • Pour démarrer le chronomètre.
  • Quand le chronomètre est lancé : mettre en pause / reprendre

Bouton B

  • Quand le chronomètre est en cours ou en pause : réinitialiser le chronomètre (demande confirmation)

Limite

Comme dit dans le code : l'application a une limite, qui est je pense acceptable.

En effet, on peut mesurer "seulement" une durée de : 49710 jours, 6 heures, 28 minutes et 15 secondes, ou approximativement 136 années *, 70 jours, 6 heures, 28 minutes et 15 secondes.

* Pour cette approximation on considère qu'une année est égale 365 jours.

Historique des mises à jour

Plus d'info sur mon GitHub.

v3.0.0

Le chronomètre utilise désormais le système RTC.

Merci à deeph, Aurélien Rodot et jicehel : pour avoir soumis l'idée du RTC et proposer un exemple d'application.

Bugs connus de la version :

  • Le chronomètre se remet à zéro dès lors que la limite est atteinte.

v2.0.0

Le chronomètre est désormais plus fiable. Et l'interface est traduite en anglais.

Bugs connus de la version :

  • Le chronomètre se remet à zéro dès lors que la limite est atteinte.

v1.0.0

Le chronomètre est peu fiable.


PS : pour mon prochain jeu, les tours de Hanoï, qui est terminé, j'ai envie de mesurer le temps des parties pour faire un tableau des meilleurs scores, ce qui explique la création de cette application.

View full creation

deeph

NEW 5 years ago

Cool mais tu devrais carrément utiliser le RTC (HTR en Français) puisque c'est exactement fait pour ça (en plus d'être bien plus précis) : https://www.arduino.cc/en/Reference/RTC

chris-scientist

5 years ago

Merci pour l'info.

J'ai fait une v2 qui améliore la précision, j'utilise désormais millis() pour faire mes calculs.

chris-scientist

NEW 5 years ago

deeph deeph

Merci pour l'info.

J'ai fait une v2 qui améliore la précision, j'utilise désormais millis() pour faire mes calculs.

Aurélien Rodot

5 years ago

Attention millis() est basé sur des interruptions, donc il peut y avoir un glissement dans le temps car les interruptions sont parfois désactivées lors d'opérations mémoire critiques (DMA...). En effet le RTC n'aurait pas ce problème, et il y a même une library toute faite comme le montre deeph :)

Aurélien Rodot

NEW 5 years ago

chris-scientist chris-scientist

Attention millis() est basé sur des interruptions, donc il peut y avoir un glissement dans le temps car les interruptions sont parfois désactivées lors d'opérations mémoire critiques (DMA...). En effet le RTC n'aurait pas ce problème, et il y a même une library toute faite comme le montre deeph :)

chris-scientist

5 years ago

Merci pour ces informations, j'ignorai le fonctionnement de millis. Je ferais une v3 dès que possible.

chris-scientist

NEW 5 years ago

Aurélien Rodot Aurélien Rodot

Merci pour ces informations, j'ignorai le fonctionnement de millis. Je ferais une v3 dès que possible.

Aurélien Rodot

5 years ago

Après ça reste quand même précis et c'est super simple à utiliser, les deux sont valables :)

Aurélien Rodot

NEW 5 years ago

chris-scientist chris-scientist

Après ça reste quand même précis et c'est super simple à utiliser, les deux sont valables :)

jicehel

NEW 5 years ago

J'ai essayé comme ça:

/*   Demonstrates the use of the RTC library */

#include <RTCZero.h>
#include <Gamebuino-Meta.h>

/* Create an rtc object */
RTCZero rtc;

/* Change these values to set the current initial time */
const byte seconds = 00;
const byte minutes = 15;
const byte hours = 23;

/* Change these values to set the current initial date */
const byte day = 9;
const byte month = 10;
const byte year = 18;


// Procédure de setup où pour le moment, on initialise juste la META
void setup() {
  gb.begin();
  Serial.begin(9600);

  rtc.begin(); // initialize RTC

  // Set the time
  rtc.setHours(hours);
  rtc.setMinutes(minutes);
  rtc.setSeconds(seconds);

  // Set the date
  rtc.setDay(day);
  rtc.setMonth(month);
  rtc.setYear(year);

  // you can use also
  //rtc.setTime(hours, minutes, seconds);
  //rtc.setDate(day, month, year);
}


void Serialprint2digits(int number) {
  if (number < 10) {
    Serial.print("0"); // print a 0 before if the number is < than 10
  }
  Serial.print(number);
}

void Print2digits(int number) {
  if (number < 10) {
    gb.display.print("0"); // print a 0 before if the number is < than 10
  }
  gb.display.print(number);
}

// Boucle principale, dans laquelle on va déplacer rect1 avec les touches et vérifier s'il rentre en collision avec rect
void loop() {
  while (!gb.update());
  gb.display.clear(); 
  // Print date...
  gb.display.cursorX = 15;
  gb.display.cursorY = 5;
  Serialprint2digits(rtc.getDay());
  Print2digits(rtc.getDay());
  Serial.print("/");
  gb.display.print("/");
  Serialprint2digits(rtc.getMonth());
  Print2digits(rtc.getMonth());
  Serial.print("/");
  gb.display.print("/");
  Serialprint2digits(rtc.getYear());
  Print2digits(rtc.getYear());
  Serial.print(" ");
  gb.display.print(" ");

  // ...and time
  Serialprint2digits(rtc.getHours());
  Print2digits(rtc.getHours());
  Serial.print(":");
  gb.display.print(":");
  Serialprint2digits(rtc.getMinutes());
  Print2digits(rtc.getMinutes());
  Serial.print(":");
  gb.display.print(":");
  Serialprint2digits(rtc.getSeconds());
  Print2digits(rtc.getSeconds());
  Serial.println();
  gb.display.println();
  delay(1000);
}


Mais j'obtient un écran blanc su la META, j'ai merdé quelque part mais pas assez callé pour voir où...


jicehel

NEW 5 years ago

Je me suis encore fait avoir par le Serial au lieu de mettre le SerialUSB ...

Ce programme fonctionne:

/*   Demonstrates the use of the RTC library */

#include <Gamebuino-Meta.h>
#include <RTCZero.h>

/* Create an rtc object */
RTCZero rtc;

/* Change these values to set the current initial time */
const byte seconds = 00;
const byte minutes = 11;
const byte hours = 22;

/* Change these values to set the current initial date */
const byte day = 11;
const byte month = 10;
const byte year = 18;


// Procédure de setup où pour le moment, on initialise juste la META
void setup() {
  gb.begin();
  SerialUSB.begin(9600);
  rtc.begin(); // initialize RTC

  // Set the time
  rtc.setHours(hours);
  rtc.setMinutes(minutes);
  rtc.setSeconds(seconds);

  // Set the date
  rtc.setDay(day);
  rtc.setMonth(month);
  rtc.setYear(year);

  // you can use also
  //rtc.setTime(hours, minutes, seconds);
  //rtc.setDate(day, month, year);
}


void SerialUSBprint2digits(int number) {
  if (number < 10) {
    SerialUSB.print("0"); // print a 0 before if the number is < than 10
  }
  SerialUSB.print(number);
}

void Print2digits(int number) {
  if (number < 10) {
    gb.display.print("0"); // print a 0 before if the number is < than 10
  }
  gb.display.print(number);
}

// Boucle principale, dans laquelle on affiche l'heure toutes les secondes
void loop() {
  while (!gb.update());
  gb.display.clear(); 
  // Print date...
  gb.display.cursorX = 5;
  gb.display.cursorY = 5;
  SerialUSBprint2digits(rtc.getDay());
  Print2digits(rtc.getDay());
  SerialUSB.print("/");
  gb.display.print("/");
  SerialUSBprint2digits(rtc.getMonth());
  Print2digits(rtc.getMonth());
  SerialUSB.print("/");
  gb.display.print("/");
  SerialUSBprint2digits(rtc.getYear());
  Print2digits(rtc.getYear());
  SerialUSB.print(" ");
  gb.display.print(" ");

  // ...and time
  SerialUSBprint2digits(rtc.getHours());
  Print2digits(rtc.getHours());
  SerialUSB.print(":");
  gb.display.print(":");
  SerialUSBprint2digits(rtc.getMinutes());
  Print2digits(rtc.getMinutes());
  SerialUSB.print(":");
  gb.display.print(":");
  SerialUSBprint2digits(rtc.getSeconds());
  Print2digits(rtc.getSeconds());
  SerialUSB.println();
  gb.display.println();
  delay(1000);
}