Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » [Tutoriel] Maitrisez le temps en C/C++ !
Dark storm Hors ligne Labélisateur Points: 11641 Défis: 176 Message

[Tutoriel] Maitrisez le temps en C/C++ !

Posté le 27/02/2014 21:59

Un des meilleurs atouts que possède la programmation d'addins en C/C++, c'est de bénéficier du système Real Time Clock (RTC), et surtout du syscall RTC_getTicks(). Dans ce tutoriel, nous verrons en détail les différentes façon d'utiliser RTC_getTicks(), comme régulateur de FPS, compte à rebours, etc.

Sommaire
1. Rappels sur les sycalls
2. Appeler RTC_getTicks()
3. Réguler ses FPS
4. Afficher les FPS
5. Chronométrer du temps
6. Régulariser des opérations avec les timers (n'utilise pas RTC_getTicks)
7. Générer des nombres aléatoires
Conclusion


1. Rappels sur les syscalls

RTC_getTicks() est un syscall ("System Call" ou "Appel système"), c'est à dire une fonction déjà présente dans l'OS de la calculatrice. Il suffit donc de sauter à l'endroit où elle est stockée pour l'exécuter.

Pour cela, la meilleure méthode est de créer un fichier contenant les instructions en assembleur (ASM), puis de compiler le tout. Toutefois, cette méthode est lourde, et pas forcément très compréhensible par un programmeur lambda, d'autant plus que l'assembleur est un langage de bas niveau, c'est à dire très abstrait. Nous utiliserons donc une astuce plus ou moins correcte et valide, mais qui reste intégralement fonctionnelle.

Voici le code commenté pour appeler un syscall (ici RTC_getTicks()) :

// Code d'une fonction *globale* pour appeler un syscall
static int SysCallCode[] = { 0xD201422B, 0x60F20000, 0x80010070 };
// Nom et paramètres de la fonction
static int (*SysCall)(int R4, int R5, int R6, int R7, int FNo ) = (void *)&SysCallCode;
// (Ces deux lignes ne sont à placer dans votre code qu'une seule fois)

int RTC_getTicks(void)
{
    // On donne le numéro du syscall (0x3b) et on transmet les arguments
    // (ici il n'y en a pas donc on met des 0, ça n'a aucune importance)
    return (*SysCall)(0, 0, 0, 0, 0x3b);
}

// On peut répéter l'opération avec d'autres syscalls
// (ceci est un exemple sûrement non fonctionnel) :
int SYS_call(int x, int y)
{
    return (*SysCall)(x, y, 0, 0, 0x42);
}

Vous pouvez placer ces fonctions n'importe où tant que vous avez mis un prototype avant le main().


2. Appeler RTC_getTicks()

Maintenant que nous avons défini RTC_getTicks(), nous allons l'utiliser. La fonction retourne le nombre de "ticks", des périodes durant 1/128ème de seconde, mesurées par l'horloge interne de la calculatrice depuis sa mise en service (ou une autre date, Casio n'ayant jamais fourni de renseignements sur ce point).

Pour cela, prévoyez un int pour récupérer la valeur :

int ticks = 0;
ticks = RTC_getTicks();



3. Réguler ses FPS

Les Frames Per Second (FPS), en français "images par seconde", sont un élément important d'un jeu. En effet, si ceux-ci ne sont pas régulés, il peut et y aura des différences d'exécution entre différents modèles, particulièrement entre les SH3 et les SH4. De plus, certaines fonctions comme IsKeyDown() provoquent des ralentissements lorsque des touches sont enfoncées, et peuvent fortement modifier la vitesse d'exécution du jeu, le rendant moins agréable à utiliser.

Heureusement, nous avons à notre disposition en C/C++ la fonction RTC_getTicks(). Grace à celle-ci, nous allons réguler de manière dynamique le nombre de FPS de notre jeu.

Nous allons donc créer une fonction qui retiendra le nombre de ticks écoulés depuis le dernier appel de la fonction. Du coup, si le programme est en avance, nous le mettons en pause jusqu'à ce qu'il soit à l'heure. Nous définissons donc un nombre précis de ticks qu'il faudra laisser écouler par frame.

Sachant que 1 tick = 1/128 seconde, nous pouvons en déduire que laisser 1 tick s'écouler équivaut à 128 / 1 = 128 FPS, 2 ticks = 128 / 2 = 64 FPS, 3 ticks = 128 / 3 = 42 FPS, etc. Nous donnerons donc en argument à la fonction le nombre de ticks à laisser tourner. Voici un récapitulatif des valeurs les plus utilisées :

Cliquez pour découvrir
Cliquez pour recouvrir
1 = 128 FPS
2 = 64 FPS
3 = 42 FPS
4 = 32 FPS
5 = 25 FPS
6 = 21 FPS
7 = 18 FPS
...
128 / x = y FPS


Voici la fonction complète :

void setFps(int fpsWish)
{
    // "static" permet de garder les valeurs en mémoire entre les différents appels
    static unsigned int fps = 0, fps_count = 0;

    do
    {
        fps = RTC_getTicks(); // on enregistre les "ticks"
        Sleep(1); // permet d'économiser de la batterie
    }
    while(fps < fps_count+fpsWish); // tant que ceux-ci ne se sont pas suffisamment écoulés

    fps_count = RTC_getTicks(); // on met à jour les dernières valeurs
}

Pour l'utiliser, rien de plus simple :

while(1) // boucle principale
{
    ... // instructions
    
    setFps(5); // pour réguler à 25 FPS
}



4. Afficher les FPS

Réguler les FPS, c'est cool, mais dans le cas d'un jeu qui demande beaucoup de ressources, il est intéressant de connaitre le nombre maximal de FPS que l'on peut avoir. Pour cela, nous allons une fois de plus utiliser RTC_getTicks(). La fonction que nous allons créer retournera un int, le nombre de FPS de la dernière seconde écoulée.

int getFps()
{
    // variables utilisées (en static, pour pouvoir garder en mémoire les valeurs)
    static int disp_fps=0, fps=1, time=0;

    if(RTC_getTicks() - time > 128) // si il s'est écoulé une seconde complète
    {
        disp_fps = fps; // alors on récupère le nombre de FPS
        fps = 0; // on remet à 0 le compteur
        time = RTC_getTicks(); // et on se rappelle du nombre de ticks de la dernière seconde écoulée
    }

    fps++; // on monte la valeur des FPS

    return disp_fps;
}

Vous n'avez plus qu'à appeler la fonction dans votre boucle principale pour récupérer le nombre de FPS :

int fps = 0;

while(1)// boucle principale
{
    ... // instructions

    fps = getFps();
    PrintVariable(fps);
}


NB 1 : La fonction PrintVariable(int variable) est supposée afficher une variable à l'écran. Vous devez adapter en fonction de vos besoins.
NB 2 : Vous trouverez dans les commentaires de ce tutoriel une autre méthode, tout aussi valable. A vous de choisir


5. Chronométrer du temps

Dans le cas d'un jeu qui a besoin de savoir combien de temps s'est écoulé depuis une action, vous pouvez enregistrer un temps de référence, puis calculer le temps écoulé en ticks en faisant une simple soustraction, puis convertir le résultat en secondes, minutes et autres unités de temps.

Par exemple, pour indiquer le temps écoulé depuis le lancement de la boucle :

... // instructions

temps_reference = RTC_getTicks(); // on enregistre le temps de référence

while(1)
{
    ... // instructions
    
    temps_actuel = RTC_getTicks(); // on récupère le temps actuel
    temps_ecoule = (int)((temps_actuel - temps_reference) / 128); // le cast (int) permet d'avoir un code plus propre et d'éviter des (W) lors de la compilation
    
    PrintVariable(temps_ecoule); // on affiche le temps en secondes

    ... // instructions
}



6. Régulariser des opérations avec les timers (sans RTC_getTicks())

En construction...
Vous pouvez déjà aller voir la documentation française de fxlib.
Je pense créer un tutoriel entier sur les timers, puisque nombreuses sont les astuces et utilisations que l'on peut en faire.



7. Générer des nombres aléatoires

Un tutoriel à déjà été écrit sur ce sujet, vous trouverez ici des explicitons sur l'utilisation de RTC_getTicks() dans la création de nombres aléatoires.


Conclusion

Avec ces quelques explications, vous devriez pouvoir maîtriser le temps sur votre calculatrice, même si, bien entendu, ces quelques exemples ne sont pas représentatifs de toutes les possibilités offertes par le système RTC. Vous pouvez par exemple créer un jeu qui lance des quêtes qu'à des horaires réguliers, des succès à débloquer si on a joué plus de 1 heure, etc.

Si toutefois vous avez encore des questions, n'hésitez pas à les poser-ci dessous, dans ce topic dédié.


A bientôt sur Planète Casio !


Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 13/10/2014 06:42 | #


Ok, de toute façon c'est réglé
Kirafi Hors ligne Membre Points: 2180 Défis: 10 Message

Citer : Posté le 17/02/2016 13:38 | #


Bon c'est bien beau tout ça , mais maintenant faut balancer le tuto sur le Combo Getkey/Timer pour que Phénix arrête de vomir à chaque fois que quelqu'un sort un Add-In ...
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Lephenixnoir Hors ligne Administrateur Points: 24581 Défis: 170 Message

Citer : Posté le 17/02/2016 13:43 | #


Je suis en train de le rédiger ! Ça arrive
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

Citer : Posté le 17/08/2018 11:45 | #


J'aurais besoin d'une petite précision : RTC_getTicks() ne nécessite aucun #include au début du code ?
En gros je peux décider d'utiliser cette fonction sans manipulation préalable au niveau du code ?
Je ne suis pas sûr d'être très clair dans ma question...
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Dark storm Hors ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 17/08/2018 11:49 | #


C'est un syscall, donc il faut l'appeler comme tel. Cf la partie 1
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

Citer : Posté le 17/08/2018 11:51 | #


ok merci
... Etant débutant les syscall est encore un truc que je ne connais pas du tout
Il faut juste copier-coller le code de la partie 1 dans mon *.c mais où ?
au début plutôt vers la fin ?
Je suis un peu complètement paumé...
Copier-coller c'est bof... j'aimerais bien comprendre à quoi corresponde tout les "nombres" en hexa dans les tableaux...
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

Citer : Posté le 17/08/2018 15:52 | #


Tous les nombres ne sont pas à comprendre en soit. Ce sont les adresses où lire les données dans la mémoire. C'est comme ça et il n'y pas grand chose à comprendre là dedans

D'ailleurs, quelqu'un pourrait retirer les balises bbcode de couleur dans les codes ?
Lephenixnoir Hors ligne Administrateur Points: 24581 Défis: 170 Message

Citer : Posté le 17/08/2018 16:30 | #


C'est fait, Ninestars.

J'en ai profité pour relire le tuto. Sans offense à Dark Storm (qui n'a pas inventé la méthode) ni aux efforts qu'il a fait pour le rédiger, tout est juste... irrattrapable.

La plupart de ce code est moche, le reste est imprécis et j'ai lu des trucs faux dans les explications. x)

Utiliser l'horloge interne pour mesurer des périodes courtes comme le temps entre deux frames est toujours une mauvaise idée. Sur un jeu qui a juste un peu plus de FPS que ce qui est souhaité, setFPS() va dégrader sérieusement les performances...

Les timers sont plus appropriés pour tout ce qui est mentionné ici. Malheureusement ceux de SetTimer() ont une résolution de 40 Hz, ce qui est souvent insuffisant. Ça ne change pas que le principe général de RTC_getTicks() est... irrattrapable.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

Citer : Posté le 17/08/2018 18:30 | #


Ah... j'aurais juste besoin de mesurer du temps entre la "naissance" de mon animal virtuel et sa "mort" c'est pas possible ?
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

Citer : Posté le 17/08/2018 18:36 | #


Si c'est très simple même :
quand il nait tu stockes la valeur de la RTC : int naissance = RTC_getTicks();
et pour connaitre son age tu fais la différence entre la RTC actuelle et la RTC à la naissance int age = RTC_getTicks() - naissance;
Ce qu'il faut stocker dans un fichier externe c'est "naissance", car quand tu vas quitter l'add in et le réouvrir, la variable "naissance" sera recréée et tu auras perdue sa valeur.
Dark storm Hors ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 17/08/2018 18:38 | #


Si c'est pour ça, faudrait mieux utiliser la RTC plustôt que les ticks
Je m'explique une fois chez moi
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

Citer : Posté le 17/08/2018 18:40 | #


ok... je ne sais pas stocker dans un fichier externe...
sinon j'ai le topic dédié de mon "jeu" pour expliquer tous cela
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Lephenixnoir Hors ligne Administrateur Points: 24581 Défis: 170 Message

Citer : Posté le 17/08/2018 22:14 | #


Ninestars a écrit :
Si c'est très simple même :
quand il nait tu stockes la valeur de la RTC : int naissance = RTC_getTicks();
et pour connaitre son age tu fais la différence entre la RTC actuelle et la RTC à la naissance int age = RTC_getTicks() - naissance;

Eh bien non, ça ne marchera pas !

Simon Lothar a écrit :
Returns 1/128 second ticks. The count restarts at zero after midnight.

Tous les jours à minuit, le compteur revient à zéro. Eh oui... c'est pas fait pour.

Dark storm a écrit :
Si c'est pour ça, faudrait mieux utiliser la RTC plustôt que les ticks

Je dirai même :

Si c'est pour ça, faudrait mieux utilisez la RTC plutôt que les ticks !
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

Citer : Posté le 18/08/2018 13:30 | #


Comment faut-il faire pour demander la date et l'heure à la calculatrice via le RTC ?
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Alexot Hors ligne Membre Points: 539 Défis: 18 Message

Citer : Posté le 28/08/2018 17:28 | #


Quand j'utilise le code proposé ici pour réguler les fps, le SDK compile mon programme, qui s'exécute normalement dans l'émulateur. Mais quand je l'exécute sur ma calculatrice(graph 35+E avec un OS de 75+E), elle m'affiche :
system ERROR
REBOOT : [EXIT]
INITIALIZE:[EXE]
ADDRESS(R)
TARGET=E6FF2136
PC = 08100270
Quelqu'un sait-il ce que signifie cette erreur et comment remédier à ce problème?
Cliquez pour découvrir
Cliquez pour recouvrir
2b 5b 2d 2d 2d 2d 2d 3e 2b 2b 2b 3c 5d 3e 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 2e 2d 2d 2d 2d 2e 2b 2b 2b 2e 2b 5b 2d 2d 3e 2b 3c 5d 3e 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2e 2b 5b 2d 2d 3e 2b 2b 2b 2b 2b 3c 5d 3e 2b 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2b 2b 2b 2b 2b 2b 2e 2d 2e 2b 2e 2d 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 3c 5d 3e 2e 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 3c 5d 3e 2d 2e 2d 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2d 2e 2b 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 3c 5d 3e 2d 2d 2e 2b 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 2b 2b 3c 5d 3e 2d 2e 3e 2b 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2b 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

Citer : Posté le 28/08/2018 17:43 | # | Fichier joint


J'ai eu exactement la même erreur, la seule solution que j'ai trouvé est d'appeler le syscall par un fichier sources en assembleur
Je te met le fichier .src et le header en PJ

"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Alexot Hors ligne Membre Points: 539 Défis: 18 Message

Citer : Posté le 28/08/2018 19:33 | #


Merci beaucoup! Ça marche !
... ou pas?
Comme tu m'as donné RTC_GetTime et non RTC_GetTicks, j'ai adapté la fonction setfps en rajoutant une fonction getms que voici :
unsigned int getms(){
    unsigned int h;
    unsigned int m;
    unsigned int s;
    unsigned int ms;
    RTC_GetTime(&h,&m,&s,&ms);
    return ms+1000*s+1000*60*m+1000*60*60*h;
}

et en remplaçant les RTC_GetTick() par des getms() dans la fonction setfps. A première vue, ça a l'air de marcher parfaitement, sauf que de temps en temps, le jeu bloque sur une frame, et repart 20 secondes plus tard. En regardant de plus près, j'ai constaté qu'au moment où le jeu bloquait, la valeur de la variable fps (de la fonction setfps) revenait d'un coup en arrière tandis que celle de fps_count restait la même. il faut donc attendre que fps rattrape fps_count, ce qui prend toujours environ 20 secondes.
Tu sais ce qui peut causer ça?
Cliquez pour découvrir
Cliquez pour recouvrir
2b 5b 2d 2d 2d 2d 2d 3e 2b 2b 2b 3c 5d 3e 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 2e 2d 2d 2d 2d 2e 2b 2b 2b 2e 2b 5b 2d 2d 3e 2b 3c 5d 3e 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2e 2b 5b 2d 2d 3e 2b 2b 2b 2b 2b 3c 5d 3e 2b 2e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2e 2b 2b 2b 2b 2b 2b 2e 2d 2e 2b 2e 2d 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 3c 5d 3e 2e 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 3c 5d 3e 2d 2e 2d 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2d 2e 2b 5b 2b 2b 3e 2d 2d 2d 3c 5d 3e 2e 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2d 2e 2d 5b 2d 2d 3e 2b 3c 5d 3e 2d 2d 2e 2b 5b 2d 2d 3e 2b 2b 2b 3c 5d 3e 2e 2b 2b 2b 5b 2d 3e 2b 2b 2b 2b 3c 5d 3e 2d 2e 3e 2b 5b 2d 2d 2d 3e 2b 2b 3c 5d 3e 2b 2b 2e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 5b 2d 3e 2b 2b 2b 2b 2b 2b 3c 5d 3e 2d 2e
Dark storm Hors ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 28/08/2018 19:51 | #


Faut vraiment que je mette à jour ce tuto… .__.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

Citer : Posté le 28/08/2018 19:55 | #


Mes connaissance en C sont plutôt limitées... Essaye de voir si le code hexadécimal est le bon ou si le .h est bien fait...
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Redcmd Hors ligne Membre Points: 380 Défis: 7 Message

Citer : Posté le 28/06/2019 01:44 | #


Anyway to relulate the fps above 128fps?
Because in my snake game, the fps increases everytime the snake eats the dot, but after 128fps it goes straight to 1600fps
Lephenixnoir Hors ligne Administrateur Points: 24581 Défis: 170 Message

Citer : Posté le 28/06/2019 01:52 | #


Unfortunately this function fundamentally can't do this because the RTC counter it uses is limited to 128 Hz. You can use a hardware timer with disabled interrupts I guess, but there's going to be active waiting. (You can't use interrupts because the OS will receive them and won't understand.)

Or, you can fall back to a smaller frequency and run multiple frames at once, for instance running 3 frames every 64 Hz, you know, just like you'd approximate a line on a grid of pixels. I don't know if this will be noticeable for the user, might be worth a try?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 66 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd