-
Jeu tour par tour
Bonjour à tous,
Je tiens à vous faire part d'un problème que je me pose depuis 2 jours. Je suis actuellement en train d'imaginer sur papier un projet, et qui me pousserait à utiliser des technos que je ne connais pas très bien.
Il s'agit d'un jeu tour par tour, (genre bataille navale ou pictionary), que j'aimerais faire en HTML5/JS (pour l'instant je penche pour Node.js).
Le problème c'est que je suis à l'origine plutôt orienté Java, et j'ai l'habitude de travailler avec des threads, ce qui me permet d'imaginer mes applications plutôt simplement, mais là avec Node.js et le javascript en général je bloque.
J'ai déjà utilisé Node.js pour faire un système de chat multi-salles. Et cela fonctionnait très bien. Sauf que là, le projet s'avère légèrement plus compliqué.
Alors voilà, j'aimerais faire en sorte qu'il y est à l'image de plusieurs salles pour un chat, plusieurs parties en cours.
Par exemple, le joueur N°1 se connecte au site, et décide de créer une partie. La partie s'ajoute dans une liste, et le joueur N°2 se connecte et décide de joindre cette partie.
Pendant ce temps, le joueur N°3 a quant à lui lancé une autre partie, et le joueur n°4 l'a rejoint.
Ce que j'ai du mal à me représenter, est que sachant que à la connexion du joueur n°2 par exemple, la partie se lance, et donc le joueurs N°1 a 5 minutes pour jouer puis c'est au joueur N°2.
Je pense que je devrais pouvoir lancer une sorte de timer sur le client joueur n°1, qui une fois terminé, recontacta le serveur qui lancera un timer sur le client du joueur n°2 (ça sera à lui de jouer).
Sauf que si je fais cela, comment faire si j'ai besoin que le JS réagisse directement lors des évènements de la souris par exemple ? Cela fonctionnerait ?
De plus il me semble que setTimeout() ne fonctionne pas toujours (pour le timer côté client), est-ce le cas avec Node.js ?
Comment auriez-vous procédé ?
Pensez-vous que les outils sont les bons pour ce projet ?
Merci
-
Je pense que tu devrais plutôt gérer les timers coté serveur. Lors du début d'un tour, tu enregistres le timestamp de fin d'action et toutes les X secondes, une tâche Cron regarde les timestamp dépassés et effectue une action le cas échéant (bloquer les futures actions du joueur 1, autoriser le joueur 2 etc.).
Pendant ce temps, le client Javascript fait des appels Ajax sur le serveur pour savoir si c'est à lui de jouer. Si c'est à lui, le serveur lui renvoi un certaine réponse et la vue change pour qu'il puisse faire des trucs.
Rien ne t'empêche au début du tour de lancer un timer en Jabascript qui informe le(s) joueur(s) du temps restant.
-
d'accord avec bewidia, toute la logique du code doit etre cote serveur, car tout ce qui s'execute chez le client est bidouillable. donc juste de l'informatif cote client. et les variables de session (cookie) pour identifier les clients.
C'est evidemment plus facile a penser avec des threads. Mais dis toi que c'est pareil. Si c'est plus facile tu peux te recreer un environnement similaire:
en creant une structure de donnnes par client (que tu stockes sur le serveur et pas dans les cookies hein), t'auras le meme environnememnt que les threads. (je ne sais pas si j'ai ete tres compréhensible).
Et dernier point: concernant la communication client-serveur.
ce que tu cherches, ce dont tu reves ^^ ce sont les WebSockets a travers le module socket io. et surtout pas AJAX.
en gros le fonctionnement d'Ajax:
le joueur 2 afin de savoir si le joueur 1 vient de jouer, doit demander au serveur (envoyer des requetes) toutes les demi secondes (car le serveur ne peut pas de sa propre initiative envoyer des messsages au client, AJAX est unidirectionnel, Donc usage exagerer de bande passante.
Fonctionnement des WebSockets;
Le joueur 2 afin de savoir si le joueur 1 vient de jouer, va tranquilement attendre que le serveur lui envoie un message sans envoyer de requetes, donc economie de bande passante. et ca c'est possible car les WebSockets sont bidirectionnelles. et avec Socket.io c'est un jeu d'enfants.
En bref html5 + Node.JS = Socket.IO
desole pour les accents, je suis sur un clavier qwerty.