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 - Actualités


Index du Forum » Actualités » TDM n°9 – Gérer les collisions !
Drak Hors ligne Rédacteur Points: 1925 Défis: 40 Message

TDM n°9 – Gérer les collisions !

Posté le 21/11/2018 18:00

Le Tuto Du Mercredi [TDM] est une idée qui fut proposée par Ne0tux. Un mercredi sur deux, nous postons un tutoriel sur l'Utilisation de la calculatrice, le Transfert, les Graphismes, la Programmation, ou encore la Conception de jeu. Ce TDM-ci en explique un point important et des fois compliqué ! Mention spéciale à Ninestars qui a rédigé le contenu de cette édition.

TDM n°9 – Comment gérer les collisions d'un personnage ?

Niveau : ★ ★ ★ ★ ☆

Tags : Basic Casio, Jeux, Collision, Personnage

Comment faire un système qui permet de gérer les collisions d'un personnage avec le décor, ou avec tout autre chose ? Nous allons détailler plusieurs méthodes possibles dans ce TDM.

Hypothèses : Nous nous plaçons dans le cas d'un jeu vu de haut, avec un personnage qui peut se déplacer selon deux axes. On suppose également que la carte dans laquelle se déplace le joueur est composée de tiles – tuiles en français. On parle souvent de Zelda-like.

Le personnage que déplace le joueur est positionné grâce à deux variables : U et V, respectivement l'abscisse et l'ordonnée. On suppose que le coin inférieur bas est l'origine du repère, c'est-à-dire que U et V valent 0 à cet endroit.

Plan d'action :

Dans la boucle principale du jeu, il faut réaliser ces actions dans un ordre précis :
1) L'action du joueur sur son clavier va modifier la valeur de ces variables
2) On vérifie si le joueur sort de la carte
3) On vérifie si la position souhaitée est bloquée
4) On vérifie si la position souhaitée déclenche une action
5) Si oui, déplacer le joueur ou déclencher l'action


Partie I – Que veut faire le joueur ?

La meilleure méthode pour gérer l'action du joueur est d'utiliser des variables intermédiaires enregistrant la position souhaitée ; nous utiliserons donc I et J. Ensuite il y aura un tas de conditions à remplir, et si tout va bien, la position souhaitée deviendra la position du joueur.

Début de l'exemple :

5->U
3->V
...
Do // début de boucle
U->I
V->J //On initialise I et J
While 1 // Sous-boucle, qui nous sert de raccourci avec la commande Break
Do
GetKey->G
LpWhile Not G //la boucle tourne tant que le joueur n'actionne pas de commande
G=37⇒Dsz J //↓
G=38⇒Dsz I //←
G=27⇒Isz I //→
G=28⇒Isz J //↑
If I≠U Or J≠V //Si le joueur a appuyé sur une touche directionnelle
Then
// la suite en partie II
IfEnd
I->U
J->V
WhileEnd
LpWhile 1 // fin de boucle

I et J donnent la position désirée par le joueur. En plus on peut savoir si le joueur a souhaité se déplacer en vérifiant que I≠U ou J≠V. Il est plutôt important d'utiliser cette condition pour éviter de vérifier les collisions, donc avoir un jeu plus fluide, et éviter le clignotement de l'écran. En effet pas besoin de redessiner l'écran si rien ne change !


Partie II – Le joueur sort-il de la carte ?

Pour cela, il suffit de vérifier si la position souhaitée est en dehors de la carte. Soit une carte de dimensions W (width ; la largeur) et H (height ; la hauteur) :
If I<0 Or I>W Or J<0 Or J>H // Si le personnage sort de la carte
Then
// Alors on apporte les modifications nécessaires...
Break //On sort de la sous-boucle
Else
// Sinon, le personnage reste dans la carte
// la suite en partie III
IfEnd

En fonction du jeu, soit on bloque le joueur, soit on change la carte.
Pour bloquer le joueur, il suffit de sauter avec un Break qui nous amène à la fin du code (juste après le WhileEnd) : le changement des coordonnées du personnage est donc sauté. Il reste alors à sa place.


Partie III – La position souhaitée est-elle atteignable ?

À partir de maintenant, tout va dépendre de la façon dont l'information de la carte est enregistrée.
Il existe plusieurs méthodes, certaines très efficaces, d'autre moins.

Première méthode : La matrice
C'est la méthode triviale ; il suffit d'enregistrer de façon naturelle la position des objets sur la carte, dans une matrice de la taille de la carte. Dans cet exemple, la matrice Mat A fait 16×8 cases et par défaut est remplie de 0.


Les autres nombres correspondent à des objets sur la carte : ce peut être un personnage, une rivière, un arbre, un mur, une maison, un coffre... La valeur indique la nature de l'objet.

Ici il suffit de vérifier que la valeur est 0 :
If Mat A[I,J]=0 //s'écrit aussi If Not Mat A[I,J
Then
// dans ce cas rien ne bloque le joueur
// la suite partie V
IfEnd



Partie IV – Déclencher une action ?

Juste à la suite, on peut ajouter des conditions sur la nature de l'objet, et exécuter du code à ce moment là.
If Mat A[I,J]=3
Then // action
IfEnd

Il peut y avoir des subtilités, par exemple si un objet est présent (donc la case de la matrice est différente de 0) mais que le joueur peut passer au travers. Dans ce cas, il suffit de gérer l'exception :
If Mat A[I,J]=7
Then
// le joueur peut passer au travers
// la suite partie V
// action
IfEnd

Une méthode autre serait d'identifier les éléments que le joueur peut traverser (herbes, escaliers, etc.) par une valeur négative et ceux qu'il ne peut pas traverser (murs, arbres, rivières, etc.) par une valeur positive, plutôt que de gérer plein d'exceptions :
If 0<Mat[I,J //Si la valeur est strictement positive
Then Break //Le joueur est bloqué, on sort de la sous-boucle
Else //Sinon, c'est que la valeur est nulle ou négative : on peut passer !
//On gère ici les exceptions, les éventuelles actions en fonction de l'objet traversé
IfEnd



Partie V – Déplacer le joueur :

Dans tous les cas, si le joueur peut aller où c'est possible, il suffit de faire I->U:J->V pour que la position souhaitée du joueur deviennent la position réelle.
I->U
J->V


Code final avec indentation :
5->U //début de programme
3->V
...
Do // Boucle principale
    U->I
    V->J
    While 1 // Sous-boucle, qui nous sert de raccourci
        Do
            GetKey->G
        LpWhile Not G
        G=37⇒Dsz J //↓
        G=38⇒Dsz I //←
        G=27⇒Isz I //→
        G=28⇒Isz J //↑

        If I≠U Or J≠V //Si le joueur a appuyé sur une touche directionnelle
        Then
            If I<0 Or I>W Or J<0 Or J>H // Si le personnage sort de la carte
            Then
                // Alors on apporte les modifications nécessaires...
                // Par exemple, on change I et J et on entre dans un sous-programme pour gérer cela.
                Break //On sort de la boucle
            Else
                // Sinon, le personnage reste dans la carte
                If 0<Mat[I,J] //Si on ne peut pas passer
                Then
                    Break //On sort de la sous-boucle ; U et V ne sont pas modifiées
                Else
                    If Mat[I,J]<0 //Si la valeur est négative
                    Then //On gère les éventuelles exceptions
                    IfEnd
                IfEnd
            IfEnd
        IfEnd //La fin de nos quatre If
        I->U
        J->V
    WhileEnd
LpWhile 1


Code final sans commentaire :

5->U
3->V
...
Do
U->I
V->J
While 1
Do
GetKey->G
LpWhile Not G
G=37⇒Dsz J
G=38⇒Dsz I
G=27⇒Isz I
G=28⇒Isz J
If I≠U Or J≠V
Then
If I<0 Or I>W Or J<0 Or J>H
Then ...
Break
Else
If 0<Mat[I,J
Then Break
Else If 0>Mat[I,J
Then ...
IfEnd:IfEnd:IfEnd:IfEnd
I->U
J->V
WhileEnd
LpWhile 1


Méthodes alternatives

Ces méthodes ne sont pas forcement plus rapides, ou plus simples. D'ailleurs certaines ne sont pas adaptées au Basic.

Méthode par recherche :

La méthode des matrices est simple, rapide, mais la carte est très granuleuse et sa taille est vite limitée par une consommation de mémoire excessive. En effet, une grande carte sera en majorité remplie de 0, c'est du gâchis.
La méthode par recherche consiste à enregistrer dans une Matrice Mat en Basic, ou un tableau de structures en C, l'ensemble des objets présents sur la carte, ainsi que leurs coordonnées. Puis quand le joueur souhaite se déplacer, rechercher dans l'ensemble de ce tableau si un objet à les mêmes coordonnées que la position souhaitée.


0->F
For 0->K To Nombre d'objets
If I=Mat A[K,1] And J=Mat A[K,2]
Then
// collision avec l'objet ID Mat A[K,3]
1->F
// passer à la partie IV
IfEnd
Next
If F=0
Then I->U:J->V
IfEnd

F est un flag servant à savoir s'il y a eu une collision avec au moins un objet. Si F=0 alors il n'y a pas eu de collision et on déplace le joueur.

De cette manière, il est même possible de définir la largeur et la hauteur des objets, il suffit de modifier la condition pour que I et J ne soit plus strictement égaux, mais compris dans les intervalles.

Cette méthode est assez peu adaptée au Basic vu quelle nécessite plus calcul. Néanmoins le calcul listique peut accélérer la recherche. En C, cette méthode est très efficace, et les performances de la calculatrice sont (vraiment) largement suffisantes, même pour 300 objets.

Méthode par équation :

Cette méthode est plutôt utilisée pour des collisions d'objets avec des formes complexes, et pas forcement alignées sur le repère.
Supposons qu'un mur soit défini par deux points A et B. Des calculs permettent de savoir si le personnage de coordonnées (U;V) est à gauche ou à droite de la droite. Si il passe de gauche à droite, ou de droite à gauche, c'est que le joueur croise le mur, donc il y a collision.

Ce test peut être réalisé avec l'équation paramétrique de la droite, ou avec le signe du produit scalaire. Ces segments peuvent être mis bout-à-bout pour former une forme complexe, ouverte comme fermée. Plus d'informations sur les technique de calcul de collision en fin de page parmi les liens utiles.


C'est ainsi que se finit le neuvième TDM, dense et assez spécial puisque Ninestars en a rédigé le contenu ! Je tenais à m'excuser auprès de lui pour les quelques légères modifications que j'ai apporté à son code : je préfère ne pas avoir de Lbl !

Liens utiles :

En apprendre davantage sur les différentes méthodes de collisions sur le Site du Zéro ! (edit: lien mort)
Consulter l'ensemble des TDM disponibles.
Soumettre des suggestions de TDM sur cette page !


1, 2 Suivante
Vanonym Hors ligne Membre Points: 98 Défis: 0 Message

Citer : Posté le 21/11/2018 18:10 | #


Je lis ça, merci
Peace and redstone. (Zéphirr)
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

Citer : Posté le 21/11/2018 18:40 | #


Whah super TDM cette semaine ! très bien écrit, très bien construit, très ... haha
Merci de m'avoir laissé le rédiger, ça fait plaisir de pouvoir aider et soulager un peu les rédacteurs

Merci pour les petites adaptations Drak
J'ai trouvé une petite erreur de ma part ici, j'ai oublié un Next
0->F
For 0->K To Nombre d'objets
If I=Mat A[K,1] And J=Mat A[K,2]
Then
// collision avec l'objet ID Mat A[K,3]
1->F
// passer à la partie IV
IfEnd
Next
If F=0
Then I->U:J->V
IfEnd
Hackcell En ligne Maître du Puzzle Points: 1531 Défis: 11 Message

Citer : Posté le 21/11/2018 18:43 | #


Drak a écrit :
C'est ainsi que se finit le neuvième TDM, dense et assez spécial puisque Ninestars en a rédigé le contenu ! Je tenais à m'excuser auprès de lui pour les quelques légères modifications que j'ai apporté à son code : je ne veux pas de Lbl !

Ton code contient un break, tu peux pas dire ça
-florian66- Hors ligne Ancien rédacteur Points: 2384 Défis: 20 Message

Citer : Posté le 21/11/2018 19:19 | #


Bravo, j'ai appris des choses, c'est le but principal de ces TDM
In Arch, I trust ! And you ?
Drak Hors ligne Rédacteur Points: 1925 Défis: 40 Message

Citer : Posté le 21/11/2018 20:23 | #


@Ninestars : Laisse-moi te remercier ! Tout le contenu était écrit, je n'avais plus qu'à passer un peu de temps pour le mettre en page, corriger quelques fautes, etc. Par ailleurs, je pense qu'on peut ouvrir la proposition ; si certains membres s'estiment en mesure d'écrire un TDM, no problem!

Hackcell a écrit :
Ton code contient un break, tu peux pas dire ça

Et alors ? En fait, la raison pour laquelle je veux éviter le Lbl, c'est que ça peut très vite paraître comme une solution de facilité pour un programmeur qui débute, et que ça n'aide pas à construire le code, au contraire. Pour toi, la présence du Break serait exactement la même chose qu'un Lbl Goto ?
Eon the Dragon : version 1.2
Let's have a look!
Marre de ces RPGs qui t'imposent des classes, des compétences et des sorts ? Crée tes propres capacités sur Eon the Dragon ! Des monstres, des dragons et des combats aussi épiques que difficiles t'attendent !
Un RPG unique et immense t'attend ! Joue dès maintenant à Aventura, le Royaume Poudingue !
Vous aussi, soyez swag et rejoignez Planète Casio !
Kikoodx En ligne Ancien labélisateur Points: 3039 Défis: 11 Message

Citer : Posté le 21/11/2018 20:43 | #


G=27⇒I+1->I //→
G=28⇒J+1->J //↑
G=37⇒J-1->J //↓
G=38⇒I-1->I //←
If I≠U Or J≠V

Je suis peut être dans le faux (je ne peux pas tester) mais ce code fonctionnerait aussi non ?
0 // Par la puissance de Ans !
G=27⇒I+1->I //→
G=28⇒J+1->J //↑
G=37⇒J-1->J //↓
G=38⇒I-1->I //←
If Ans // Oui, si une variable ci-dessus a été modifiée, alors Ans est vrai.

Et aussi, plus osé mais bon...
G=27⇒Isz I //→
G=28⇒Isz J //↑
G=37⇒Dsz J //↓
G=38⇒Dsz I //Truc
0⇒0 // Je pense que l'on peut retirer le 0, mais à vérifier
If I≠U Or J≠V

Pour le dernier, c'est simple, Isz et Dsz sont utilisables (ça ne change rien d'ailleurs étant donné que l'opérateur ⇒ est utilisé) et si on passe une valeur à 0, ça skip la prochaine ligne, mais pas grave, on ne peut pas presser deux directions à la fois et si cela intervient sur la dernière il y a la condition toujours fausse pour sauver.

Désolé si je suis brouillon
ouais ouais
Lephenixnoir En ligne Administrateur Points: 24572 Défis: 170 Message

Citer : Posté le 21/11/2018 21:46 | #


Eh bien, c'est pas mal ! Je trouve que les illustrations ajoutent beaucoup au texte.

Puisque c'est Ninestars qui l'a écrit, faut-il changer l'auteur du topic ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

Citer : Posté le 21/11/2018 23:03 | #


@Kikoudx : ta deuxième solution ne marche pas, la variable Ans est modifiée quand un calcul n'est pas attribué à une variable.
Pour ta dernière proposition c'est du bricolage qui n'apporte pas grand chose. D'ailleurs le meilleur moyen de gérer les exceptions du Isz et Dsz c'est de mettre un : juste après (ou sauter une ligne)

Merci Lephé
Shadow15510 Hors ligne Administrateur Points: 5503 Défis: 18 Message

Citer : Posté le 22/11/2018 06:51 | #


Il faut mettre Ninestars rédacteur !! C’est un article de rédacteur éprouvé
J’ai beaucoup aimé ce TDM d’autant Plus qu’il va nous aider pour le projet Odyssée
"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

Hackcell En ligne Maître du Puzzle Points: 1531 Défis: 11 Message

Citer : Posté le 22/11/2018 10:06 | #


@Drak, le break est également une solution de facilité qui peut nuire à la compréhension du code si dans une boucle qui contient beaucoup d'instruction (surtout en Basic où il est compliqué de les repérer )
Drak Hors ligne Rédacteur Points: 1925 Défis: 40 Message

Citer : Posté le 22/11/2018 10:12 | #


@Hackcell : Comment procéderais-tu ?

@KikooDX :
plutôt comme ça :
G=27⇒Isz I
G=28⇒Isz J
G=37⇒Dsz J
'a
G=38⇒Dsz I
'a //Le commentaire inutile sert à éviter le saut de boucle du Dsz.
If I≠U Or J≠V

Eon the Dragon : version 1.2
Let's have a look!
Marre de ces RPGs qui t'imposent des classes, des compétences et des sorts ? Crée tes propres capacités sur Eon the Dragon ! Des monstres, des dragons et des combats aussi épiques que difficiles t'attendent !
Un RPG unique et immense t'attend ! Joue dès maintenant à Aventura, le Royaume Poudingue !
Vous aussi, soyez swag et rejoignez Planète Casio !
Kirafi Hors ligne Membre Points: 2180 Défis: 10 Message

Citer : Posté le 22/11/2018 10:16 | #


Bouh !
Une idée comme ça : mettre un exemple de code indenté dans un spoiler pour mieux comprendre la structure dans le code complet ?
Cadeau
5->U //début de programme
3->V
...
Do // Boucle principale
    While 1 // Sous-boucle, qui nous sert de raccourci
        Do
            GetKey->G
        LpWhile Not G
        G=27⇒I+1->I //→
        G=28⇒J+1->J //↑
        G=37⇒J-1->J //↓
        G=38⇒I-1->I //←

        If I≠U Or J≠V //Si le joueur a appuyé sur une touche directionnelle
        Then
            If I<0 Or I>W Or J<0 Or J>H // Si le personnage sort de la carte
            Then
                // Alors on apporte les modifications nécessaires...
                // Par exemple, on change I et J et on entre dans un sous-programme pour gérer cela.
                Break //On sort de la boucle
            Else
                // Sinon, le personnage reste dans la carte
                If 0<Mat[I,J] //Si on ne peut pas passer
                Then
                    Break //On sort de la sous-boucle ; U et V ne sont pas modifiées
                Else
                    If Mat[I,J]<0 //Si la valeur est négative
                    Then //On gère les éventuelles exceptions
                    IfEnd
                IfEnd
            IfEnd
        IfEnd //La fin de nos quatre If
        U->I
        V->J
    WhileEnd
LpWhile 1

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)
Kikoodx En ligne Ancien labélisateur Points: 3039 Défis: 11 Message

Citer : Posté le 22/11/2018 11:40 | #


Drak a écrit :
@KikooDX :
plutôt comme ça :
G=27⇒Isz I
G=28⇒Isz J
G=37⇒Dsz J
'a
G=38⇒Dsz I
'a //Le commentaire inutile sert à éviter le saut de boucle du Dsz.
If I≠U Or J≠V

Ah merci !
Je pensais qu'il y avait une règle bizarre avec la double flèche (une fonction cachée je crois) qui était censée skip la fonction suivante si 0 est assigné à une variable après la condition, mais je suis probablement dans le faux...
Merci Ninestars aussi, je bidouille beaucoup désolé. La prochaine fois je testerais avant d'écrire
ouais ouais
Totoyo Hors ligne Membre d'honneur Points: 16102 Défis: 102 Message

Citer : Posté le 22/11/2018 11:53 | #


Il y a mieux : déplacez les Dsz avant les Isz. Plus besoin de faux commentaires !
G=37⇒Dsz J
G=38⇒Dsz I
G=27⇒Isz I
G=28⇒Isz J
If I≠U Or J≠V

Ne0tux Hors ligne Membre d'honneur Points: 3525 Défis: 265 Message

Citer : Posté le 22/11/2018 12:06 | #


Totoyo a écrit :
Il y a mieux : déplacez les Dsz avant les Isz. Plus besoin de faux commentaires !
G=37⇒Dsz J
G=38⇒Dsz I
G=27⇒Isz I
G=28⇒Isz J
If I≠U Or J≠V


Merci, j'allais le suggérer.
Mes principaux jeux : Ice Slider - CloneLab - Arkenstone

La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

Citer : Posté le 22/11/2018 14:59 | #


Pas bête ! J'aime bien ce genre de raisonnement pour résoudre un problème
Kirafi Hors ligne Membre Points: 2180 Défis: 10 Message

Citer : Posté le 22/11/2018 16:16 | #


Après si on chipote il y a d'autre coquilles :
Par exemple, aucune initialisation de I et J, du coup on peut avoir un comportement inattendu au premier GetKey.
Ensuite sûrement une autre erreur, les affectations semblent inversées à la fin du code (dans le code final) :
U->I
V->J

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)
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

Citer : Posté le 22/11/2018 16:43 | #


Merci pour tes remarques Kirafi, ce n'est pas chipoter d'ailleurs, c'est juste dire ce qui ne va pas
En effet tu as raison sur les deux points
(Drak tu as effacé l'affectation de I et J )
Drak Hors ligne Rédacteur Points: 1925 Défis: 40 Message

Citer : Posté le 22/11/2018 22:11 | #


Mince ! Merci pour les retours, je vais modifier le topic de ce pas.

Edit : ça devrait être bon, maintenant.

Eon the Dragon : version 1.2
Let's have a look!
Marre de ces RPGs qui t'imposent des classes, des compétences et des sorts ? Crée tes propres capacités sur Eon the Dragon ! Des monstres, des dragons et des combats aussi épiques que difficiles t'attendent !
Un RPG unique et immense t'attend ! Joue dès maintenant à Aventura, le Royaume Poudingue !
Vous aussi, soyez swag et rejoignez Planète Casio !
Kikoodx En ligne Ancien labélisateur Points: 3039 Défis: 11 Message

Citer : Posté le 23/11/2018 21:26 | #


Je viens de voir, difficulté 4/5 c'est pas un peu trop ?
ouais ouais
1, 2 Suivante

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 233 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