Bonjour les gens !!
Bon je sais, ça fait un bail, mais voila, c'est ça aussi la vie d'un blog, y a des hauts et des bas !
Aujourd'hui, j'vais vous parler de deux choses, qui sont liées. Tout d'abord, je lance un nouveau projet de jeu vidéo, un jeu web (ou browser game) pour être précis. Mon annonce sur le Site du Zéro présente bien le projet, je vous invite donc à aller la lire si vous êtes intéressé.
Pour résumer, le jeu sera un jeu de stratégie en tour par tour, faisant s'affronter des unités typées médiéval (infanterie, archerie, chevalerie) sur une carte constituée de cases hexagonales, le tout en vue 2d isométrique. Le but est de faire un jeu simple d'accès, permettant à un joueur de faire une partie rapidement, juste avec son navigateur (sans nécessiter de plugin quelconque), et sans avoir à gérer des tas de trucs avant de se lancer dans la partie.
Voir le Game Concept Document de Fightly
Techniquement, le jeu utilisera HTML, CSS et JavaScript pour la partie client, PHP pour la génération des pages et Python pour le serveur de gestion des parties. L'intérêt est l'utilisation des récentes WebSockets, actuellement implémentées dans Chrome et Chromium uniquement, mais pour lesquelles il existe des fallback. Je vous ferai bien une présentation détaillée de l'utilisation des WebSocket, et pourquoi c'est top moumoute, mais non. J'vais plutôt vous balancer quelques liens intéressants sur le sujet :
- The WebSocket API, W3C
- Les WebSockets sur Wikipedia
- Les WebSockets faciles avec Cramp, par Damien Mathieu
- Why WebSockets are not yet on Firefox
Et on en arrive au deuxième point : dans le cadre de ce projet, j'ai développé un début de serveur permettant de communiquer avec une page web via les WebSockets. Chez le client, on a un code JavaScript assez classique, qui utilise la très simple interface WebSocket. Et du côté du serveur, j'ai donc développé un serveur en Python qui créé les connexions, reçoit les messages des clients, les analyse et les traite comme il faut, puis renvoie aux clients le nouvel état du "monde". C'est assez étonnant de simplicité, d'autant que j'ai commencé à apprendre Python environ 3 jours avant de réussir à faire ce serveur. Bon faut avouer que je ne suis pas parti de rien, j'ai repris le code de Eneko Alonso, donné sur son blog : More WebSockets, now with Python!
Tout ça pour en venir au point intéressant : j'ai décidé de partager avec vous la partie qui gère les WebSockets. Elle est orientée objet, utilise un thread pour chaque client (donc pour chaque connexion), et vous permet assez simplement d'ajouter votre propre comportement lors de réception d'un message.
Voir le projet python-websocket-server sur GitHub
Bon, c'est le premier truc que je fais en Python, donc y a surement des erreurs. Mais j'espère que vous saurez me les faire remarquer ! :) Je sais par exemple que je ne gère par l'arrêt du serveur par interruption, et que c'est un problème car le serveur ne s'arrête pas tant que tous les clients ne sont pas déconnectés (puisqu'il y a encore des thread en cours de fonctionnement). Je sais également que je pourrais faciliter l'utilisation du code en ajoutant un mécanisme de fonction callback, mais je sais pas encore faire ça en Python, donc ça viendra plus tard ! ^^
Actuellement, le code est celui d'un chat très simple. A chaque fois qu'un client envoie un message, le serveur le renvoie à tous les clients. Pour tester, lancer le server.py dans une console, et accédez à la page index.html depuis votre localhost. Ouvrez cette dernière dans plusieurs onglets, et envoyer un message dans l'un d'eux. Vous devriez voir apparaitre le message sur toutes les autres fenêtres quasiment instantanément.
Pour ajouter votre propre comportement, modifiez le code de la fonction onreceive de la classe WebSocketClient (websocketclient.py). Il est aussi possible que vous ayez à changer la configuration du serveur dans le fichier config.py.
J'espère que ce code pourra être utile à certains d'entre vous. Et bien sur, si vous avez des questions, n'hésitez-pas ! Passez à ma grotte ! Laissez-moi un message !
Comments
salut
pourquoi en python et pas en Node.js qui semble être à la mode en ce moment, notamment pour gérer les sockets ?
et qui par nature est évènementiel (c'est du JS) et construit pour tenir un maximum de connection en simultané sur un même thread, ce qui me semble vital pour un jeu ?
bon c'est de la théorie, mais la question m'intéresse car je vais bientôt devoir implémenter quelque chose pouvant tirer parti des WebSockets
@jpvincent : Y a pas vraiment de raison particulière. C'est surtout un ensemble de choses : je voulais apprendre Python, je cherchais des serveurs de WebSocket et j'en ai trouvé plusieurs en Python (y a notamment une implémentation dans Tornado, mais j'ai eu quelques soucis, et surtout Tornado n'était pas utile pour mon projet, j'ai donc préféré un truc plus léger), et surtout j'suis pas vraiment fan du JavaScript. J'en fais obligatoirement côté client, et j'ai pas envie d'en remettre une couche côté serveur... :)
Après c'est sur que mon code est très très très loin d'être optimisé pour quoi que ce soit, mais ça fournit une base opérationnelle sur laquelle se baser.
Ok, ct pour savoir
je pense à un deuxième truc en faveur de Node.js : tu piurras partager du code entre le client et le serveur si tu fais tout en JS, pour faire du rendering de map par exemple
en fait je voudrais bien participer à ce projet mais ça risque d'être en JS seulement et sans consacrer beaucoup de temps au code final, juste les classes de base... Pas sur que tu sois preneur donc :)