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 » Le mutiJoueur sur Casio...c'est possible ?
Yatis Hors ligne Membre Points: 580 Défis: 0 Message

Le mutiJoueur sur Casio...c'est possible ?

Posté le 28/05/2018 13:15

Bonjours / bonsoirs, comme le titre l’indique je vais tenter de vous donner les clefs pour pouvoir programmer des add-in (langage C / ASM) tournée multijoueur (avec le câble 3-pin donc ).

Quelques petits points :
1.je ne prêtant pas à être le meilleur programmeur du monde ni même un bon programmeur.
2.Je ne détiens pas la science infuse il est donc possible que je dise des bêtises.
3.Ne voyer pas ce tuto comme LE cour pour apprendre tous les protocoles du monde.
4.Je ne vais pas vous apprendre à coder, plutôt comment penser à une structure pas trop mal foutue pour du multi.
5.Il est fort possible qu’ils y aient des fautes d’orthographe car je suis dyslècon...dys...dysle...xique.:D



Les débuts : les syscalls.
Si vous programmez en C sur Casio, vous utilisez sûrement MonochromeLib.h ou Usefull.h et, si vous êtes comme moi, vous avez déjà essayé de comprendre comment là/les librairies fonctionnent.
Vous auriez donc déjà remarqué que les deux librairies cité plus haut utilisent des trucs du style :


J’ai mis pas mal de temps avant de comprendre ce que c’était que ces chiffres poser au piff dans une liste. Bah c’est un syscall.
Pour faire un (gros) résumer (de ce topic) un syscall est un code en assembleur permettant d’effectuer une action précise comme par exemple connaître l’adresse de la VRAM (ce qui est super pratique pour les jeux et ce qui évite au développeur de réécrire le code pour tous les OS).

Celui-ci, cité plus haut, est le syscall (0x0135) qui permet de trouver la VRAM.
je ne vais pas m’étendre sur le sujet vu qu’il y a un topic qui en parle déjà.
Après des recherches sur ces fameux syscalls j’ai trouvé la documentation qu'Andreas Bertheussen et Simon Lothar on fait (merci encore à eux) ainsi que le syscall.src qu’il ont mis a disposition...et en lisant le syscall.h je suis tombé sur ça :


Avec un max de fonction derrière, j’ai donc viré tout ce qui ne m’intéressait pas pour garder seulement les fonctions sur le port série .
Puis j’ai lu la documentation pour lire:



J’ai donc créé un tableau test[]={0, 9, 0, 0, 0};
Puis un Serial_Open(test) ;
(En gros j’ai demander d’avoir d’avoir un BaudRate le plus rapide possible, pas de parité, 8bit, 1bit de stop).

Et j’ai commencé à bidouiller des programmes.
Mon premier fut un programme qui envoie les touches pressées a une autre calto puis après j’ai commencé à faire des jeux (comme un début de Street Fighter multijoueur et bien d'autres jeux qui ne verront jamais le jour).
PS : N’oublier pas le Serial_Close(0); a la fin de votre programme sinon vous risquez d’avoir des ennuies .



La structure :
Après plusieurs tests j’en suis arrivé à faire fonctionner des programmes pas trop foireux (qui ne plante pas tous les 2 secondes).
Il nous faut une calto qui fasse office de SERVEUR et une autre qui fasse office de CLIENT.

Le SERVEUR va se charger de tout calculer (déplacement, collision, etc…) puis d’envoyer les résultats au CLIENT.
Le CLIENT va juste envoyer les touches pressées par le joueur et recevoir les nouvelles valeurs du jeu (calculer par le SERVEUR).
Donc en gros :


Le truc super-important ici c’est les fonctions de [synchronisation].
Pour synchroniser les caltos ont leur demande d’attendre l’autre, par exemple le CLIENT attend que le SERVEUR lui envoie une valeur précise.
Car 95% du temps c’est ce qui fait cracher l’add-in, le CLIENT (qui n’a pas grand-chose a calculer) vas « plus vite » que le SERVEUR et au bout d’un moment chaque calto vas attendre une info ce qui vas bloquer le jeux.
Bon, voila a quoi ça ressemble en code:(ce sont une partie du code de Dungeons)






Les fonction utiles
Comme je l’ai dit plus haut la synchronisation est super-importante.
J’ai mis longtemps avant de trouver des fonctions fiables à long terme.
C’est pourquoi je vous les donne, mais je vous conseille de les comprendre et de réécrire à votre façon.
Avant ça je vais vous dire toutes les fonctions que j’utilise et qui font appel à des syscalls :


J’ai réécrit toutes les autres fonctions (ou simplement pas utiliser pour éviter d’être dépendant des syscalls).

Fonctions réécrites :

Cette fonction permet d’attendre un certain nombre d’informations (préciser via sizeWait).
Pendant qu’on attend on envoie à l’autre calto un code pour lui indiquer qu’on attend bien des infos.



Cette fonction attend le code envoyer par wait_data_event().
C’est une fonction qui permet de glander de manière précise .

Souvent j’écris trois autres fonctions :
send_DataPack(), set_DataPack() & receive_dataPack() ;
Je reviendrai sur ce qu’est un DataPack après.
Pourquoi je vais pas donner les codes de ces fonctions ?
Car elles ne fonctionneront probablement pas avec votre programme.
Je vais juste dire que :
send_DataPack() : permet d’envoyer le DataPack à l’autre calto.
set_DataPack() : permet de créer le DataPack.
receive_dataPack() : permet de recevoir le DataPack.



Les DataPacks
J’en ai parlé très rapidement pus haut.
Un DataPack représente une grande liste où l’on va mettre des valeurs importantes de manière logique.
Par exemple si j’ai un personnage qui bouge le DataPack sera :
(On peux dire que le bout de code est une partie de la fonction set_DataPack()).


C’est pourquoi plus haut j’ai dit « elle ne fonctionneront probablement pas avec votre programme » car le DataPack change en fonction des besoins et du programme.

Je n’ai personnellement pas réussi a faire fonctionner Serial_WriteBytes() qui permet d’envoyer une liste.
Je l’ai donc réécrite :

Cette fonction envoie le DataPack, et pour la réceptionner il suffi de changer Serial_WriteByte() par Serial_ReadByte() puis de bourrer comme un gros sagouin les valeur reçus dans une liste.


Mon avis sur la programmation de jeux Multijoueur
Je pense que si vous avez envie de programmer un jeu en Multijoueur, LISEZ DES SOURCES comme (Dungeons ou Mupong ).
Les jeux multijoueur sont encore trop rares et pourtant pas si compliquer à mettre en œuvre.

Les difficultés que j’ai rencontrées sont nombreuse : déjà il n’y avait que Mupong comme source et je ne programme absolument pas comme Theernest570 j’ai donc eu des problèmes pour commencer.
De plus ai pas réussi à faire fonctionner certaines fonctions comme Serial_ReadBytes(), Serial_WriteBytes(), j’ai donc piffé pendant longtemps.

J’ai mis pas mal de temps à piger comment synchroniser les caltos.
Et surtout le DEBUG est juste horrible : Il faut compiler, connecter les deux caltos à l’ordi, transférer le programme sur les 2 caltos...pour enfin voir que l’octet modifié ne fonctionne pas :D.
je ne vais pas vous mentir, quand le programme fonctionne...c’est génial !

Donc faites des jeux en multijoueur ! Ils sont encore trop rares !


FICHIER JOINS
Je vous donnes les liens directement:
L'ad-in de test + sources + librairie: https://www.planet-casio.com/Fr/programmes/voir_un_programme_casio.php?showid=3572
La doc de Andreas Bertheussen et Simon Lothar: http://downloads.sourceforge.net/fxsdk/fxreverse-docs-1.pdf
La doc de Lephenixnoir: https://www.planet-casio.com/files/forums/tuto-syscalls-14544.pdf

Dans le fichier joins vous trouverez Le plus important a lire: La librairie serial.h original, la documentation faites par Andreas Bertheussen et Simon Lothar + la doc de Lephenixnoir sur le désassemblage de syscalls.
Ainsi qu’une librairie écrite par moi-même qui s’appelle ‘mySerial.h’ ou dedans vous trouverez :


Pour résumer j’ai réécrit les fonction de serial.h (que j’utilisais) en C.
J’y ai ajouter une fonction synchroTest(), est permet de synchroniser deux caltos ensemble il faut juste lui indiquer si la calto est le serveur (‘who’!=0) ou le client (who==0)

Je fourni la lib avec un add-in de test bien sur



Yatis Hors ligne Membre Points: 580 Défis: 0 Message

Citer : Posté le 28/05/2018 13:17 | #


Heuuuu...Je n'ai pas réussi à mettre le fichier joint...
Il me disait que le formulaire n’était pas bon... :/
Les images sont peut-être trop petite aussi...
Dark storm Hors ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 28/05/2018 19:38 | #


C'est excellent ça !

T'as dit avoir eu pas mal de problèmes au niveau de la synchronisation, est-ce que tu peux donner une approximation du taux d'échec en fonction de la durée de la partie ou d'autres paramètres ?

De même, est-ce vraiment nécessaire de faire faire tous les calculs par l'hôte ? On peut pas faire moitié/moitié ? Par exemple, le joueur [C]lient appuie sur →, la calto C fait bouger le perso, calcule les collisions, et envoie à [H]ost les coordonnées mises à jour. Pendant ce temps, H fait pareil. Une fois que c'est fait, H calcule les éléments qui nécessitent les positions des deux joueurs et renvoie les données à C. Ce système permettrait d'alléger la charge de calcul de H.

Un beau projet en tout cas, si tu as le temps, je te conseille de poster les sources sur le Gitlab. Comme ça tout le monde a accès au code source, tu le maintiens à jour facilement, si quelqu'un veut améliorer ton code il fork puis fait une pull request. Idem pour un addin de démo de la bibliothèque.

NB : au passage, préfère les balises [code] aux captures d'écran. Y'a peut-être pas la coloration syntaxique, mais honnêtement osef si le code est sur le gitlab, mais au moins si les images disparaissent, on garde une trace du contenu.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Yatis Hors ligne Membre Points: 580 Défis: 0 Message

Citer : Posté le 28/05/2018 20:42 | #


Dark storm a écrit :
T'as dit avoir eu pas mal de problèmes au niveau de la synchronisation, est-ce que tu peux donner une approximation du taux d'échec en fonction de la durée de la partie ou d'autres paramètres ?

Mmmmm...la durer n'influence pas beaucoup sur la synchronisation, le gros défaut de Dungeon c'est qu'entre chaque manche il y a une animation...et n'a aucun moment je fais un point de synchro résultat ya 50% de chance de ne plus être synchronisé :/
Donc plus il y a des points de synchro (le CLIENT attend le SERVEUR) plus le jeux est fiable .

Dark storm a écrit :
De même, est-ce vraiment nécessaire de faire faire tous les calculs par l'hôte ?

En sois non, si je procède comme ça c'est pour éviter de faire communiquer les calots entre eux, je préfère envoyer des gros datapack de 270o plutôt que plein de valeur à droite, à gauche.

Dark storm a écrit :
au passage, préfère les balises code aux captures d'écran

C'est noté
Drak Hors ligne Rédacteur Points: 1925 Défis: 40 Message

Citer : Posté le 29/05/2018 18:42 | #


J'ai lu et (à peu près) compris ce que tu as exposé dans ce topic. Je souhaitais juste réagir par rapport à ça :
Yatis a écrit :
Donc faites des jeux en multijoueur ! Ils sont encore trop rares !


Oui, c'est vrai, ces jeux sont assez rares. Seulement, il y a un inconvénient majeur : il faut un certain nombre de conditions pour exploiter un jeu en multijoueur : il faut deux calculatrices, un câble, et en plus avoir le logiciel installé sur les deux. Comme tu le montre, ce sont également certaines difficultés au niveau du code qui, je pense, refroidissent les programmeurs.

Maintenant, ma question est la suivante : Est-ce que, à l'instar de certains jeux Nintendo (3)DS – entre autres –, il est possible de procéder à un "téléchargement", c'est-à-dire à un jeu multijoueur avec le programme installé sur une calculatrice (SERVEUR) et de transférer du contenu sur l'autre calculatrice (CLIENT) pour jouer à deux ? Autrement dit, est-il possible de n'avoir le jeu/programme installé uniquement sur la calculatrice SERVEUR et de pouvoir jouer à deux avec une autre calculatrice qui ne possède pas le jeu en question ? Si c'est possible, alors je pense que les jeux multijoueurs peuvent présenter un bel intérêt. Sinon, c'est dommage.
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 !
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 29/05/2018 18:51 | #


Drak a écrit :
Maintenant, ma question est la suivante : Est-ce que, à l'instar de certains jeux Nintendo (3)DS – entre autres –, il est possible de procéder à un "téléchargement", c'est-à-dire à un jeu multijoueur avec le programme installé sur une calculatrice (SERVEUR) et de transférer du contenu sur l'autre calculatrice (CLIENT) pour jouer à deux ?

Seulement si la calculatrice qui reçoit possède un add-in spécial (qui servirait à tous les jeux "téléchargement" en même temps). L'autre condition, c'est que la personne qui l'implémente soit très forte et très acrobatique ; je considère charger et lancer un add-in depuis un add-in comme de la haute voltige.

Edit : Sinon tu sais qu'une fois que les calculatrices sont connectées, tu peux transférer le jeu complet, ce qui va aussi vite.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Drak Hors ligne Rédacteur Points: 1925 Défis: 40 Message

Citer : Posté le 29/05/2018 18:55 | #


Hmm, donc j'imagine que c'est quelque chose de fin et complexe à réaliser... Ce que je me dis, c'est que c'est toujours frustrant de voir des jeux multijoueurs mais d'être incapable d'en profiter parce qu'on a personne dans son entourage qui possède ce jeu-là également ou qui s'y intéresse ou qui réunit ces conditions...
Je pense que, potentiellement, un jeu qui propose un mode de jeu un joueur et un autre mode de jeu multijoueur peut être chouette. Après, je ne développe pas de jeu en C, je suis trop fragile avec le C pour faire quelque chose dont je sois fier.
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 !
Lephenixnoir Hors ligne Administrateur Points: 24228 Défis: 170 Message

Citer : Posté le 29/05/2018 18:56 | #


Je l'ai remarqué ensuite (et édité mon message) : dans tous les cas la calculatrice réceptrice doit supporter les add-ins. Donc autant profiter de la connexion pour lui envoyer le jeu complet, ce qui anéantit le besoin du mode téléchargement...
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 29/05/2018 18:56 | #


Autrement dit, est-il possible de n'avoir le jeu/programme installé uniquement sur la calculatrice SERVEUR et de pouvoir jouer à deux avec une autre calculatrice qui ne possède pas le jeu en question ?


Binwi, tu prends le câble 3-pin, tu vas dans l'application LINK et tu transfères le g1a
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Yatis Hors ligne Membre Points: 580 Défis: 0 Message

Citer : Posté le 29/05/2018 19:22 | #


Zezombye a écrit :
Binwi, tu prends le câble 3-pin, tu vas dans l'application LINK et tu transfères le g1a

xD "binwi" !

Drak a écrit :
il faut un certain nombre de conditions pour exploiter un jeu en multijoueur : il faut deux calculatrices, un câble, et en plus avoir le logiciel installé sur les deux.

C'est vrai que ce n'est pas pratique pour le matos, mais demander à quelqu'un "prête-moi ta calculatrice je te la rends demain" ce n'est pas super compliquer même si tu n'es pas sociable (comme moi)

Drak a écrit :
Comme tu le montre, ce sont également certaines difficultés au niveau du code qui, je pense, refroidissent les programmeurs.

J'avoue que le fait de développer à l'aveugle (sans émulateur) c'est compliquer, de plus, transférer le programme toutes les 2 secondes s'est lassant à la longue. (c'est pourquoi j'ai eu une idée )
Shadow15510 Hors ligne Administrateur Points: 5500 Défis: 18 Message

Citer : Posté le 29/05/2018 19:24 | #


Yatis a écrit :
mais demander à quelqu'un "prête-moi ta calculatrice je te la rends demain" ce n'est pas super compliquer même si tu n'es pas sociable (comme moi)

C'est ce que je fais : on est 35 dans ma classe j'ai debridée 6 caltos
Pour la sociabilité on est tous plus ou moins comme ça
"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

Drak Hors ligne Rédacteur Points: 1925 Défis: 40 Message

Citer : Posté le 29/05/2018 19:33 | #


Lephenixnoir a écrit :
Edit : Sinon tu sais qu'une fois que les calculatrices sont connectées, tu peux transférer le jeu complet, ce qui va aussi vite.


Aaahh, je vois ! Ça répond à ma question : merci !
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 !
Dark storm Hors ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 29/05/2018 20:16 | #


Sinon y'a toujours le coup de ce que j'avais fait avec Serial DL Files pour Arduino, mais à ce moment autant utiliser le menu Link, en effet


Finir est souvent bien plus difficile que commencer. — Jack Beauregard

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