Hello,
J'ai déjà crée des jeux banales avec nodejs/html/javascript histoire de comprendre comment cela fonctionnait.
Maintenant j'aimerai comprendre comment gerer des jeux complets
Par exemple, imaginons que je veuille creer un jeu du style Habbo où je creer une room, je pose des objets etc..
Au debut je pensais avoir dans mon server un tableau avec la liste des room, et a l'interieur la liste des objets.
Mais imaginons que je décide de changer le nom d'un objet, celui-ci ne sera pas automatiquement mis à jour dans mon tableau du server, il-y aura toujours l'ancien nom
Pareil si je veux avoir le nom du proprietaire de la room, je peux l'envoyer en tant qu'attribut de mon objet room mais si le joueur change de pseudo par la suite, la maj va pas se faire toute seule
Pour resoudre mon pb il faudrait que tout soit gérer avec une BDD, mais est ce que ça fait parti des bonnes pratiques?
Si c'est pas ce qu'il faut faire est ce que ça veut dire que quand je met à jour une info je dois aller loop dans tout mon tableau pour changer son contenu, mais dans ce cas là c'est un peu sale non?
Merci par avance, c'est galere de trouver de l'aide sur google ![]()
Toujours travailler avec les ID, pas les noms
La database permet de se souvenir sur le long terme d'une information. Tu peux en effet récupérer/stocker constamment des informations de ta base de données vers ton process NodeJS. Mais cela va rendre ton jeu extrêmement dépendant à ta base de données, ce qui n'est pas forcément une bonne chose si elle à une latence, cela peut bloquer ton gameplay multijoueur, donc c'est globalement une mauvaise idée.
Tu devrais donc récupérer les informations dont tu as besoin lors des temps de chargements. Cela peut être pendant un temps de chargement classique (un fond noir avec un loading) pour charger les informations de ta map pour créer une room. Mais aussi quand tu demande l'ouverture d'une interface (hotel de ventes qui affiche les 50 premiers items). Le plus important, c'est de pouvoir afficher un message d'erreur au cas où les informations ne peuvent pas être récupérés, tout en donnant la possibilité aux joueurs de continuer à accéder au gameplay de base du jeu.
Pour la suite, c'est un problème classique d'architecture entre le back-end et le front-end. Toutes tes interactions "multijoueur" doivent être vérifiés et exécutés depuis ton serveur (back-end). Le côté front-end ne doit servir qu'à gérer la partie affichage côté joueur. Rien d'important ne doit être vérifié du côté du front-end, cela pourrait être la source d'une faille de sécurité pouvant mener à du cheat vu que tu ne peux pas contrôler ce qui s'y passe.
Donc si tu veux changer le nom d'un objet côté client :
Formulaire côté client pour entrer le nom de l'objet. Une vérification peut être faite de ce côté pour afficher si le nom est trop long, ou ne doit pas contenir de caractères spéciaux.
Le client envoie à ton serveur un object au format JSON par le protocole RestAPI. L'objet JSON contient des informations sur l'ID du joueur, l'ID de l'hotel des ventes, l'ID de l'objet, la date de modification, un token d'authentification pour savoir si le joueur à bien les permissions pour faire cette requette.
Le serveur reçoit la demande, il vérifie si le joueur est bien authentifié et s'il à les droits de modifier l'item (depuis son ID), si la date est correcte, si. si. si ect...
Lorsque la demande est correcte est validé, le serveur peut soit mettre à jour les informations qu'il à en mémoire vive (un tableau, une variable), soit mettre à jour directement sa base de données.
Le serveur renvoie une réponse au client, si la demande à été réussite ou refusée.
Le client récupère la réponse du serveur et affiche un message de confirmation ou d'erreur.
C'est un processus long et fastidieux à mettre en place. Si tu veux faire ça bien, regarde les "design pattern" pour voir comment tu peux organiser ton code pour rendre ton développement plus simple et automatisé : https://refactoring.guru/design-patterns
Concernant ta question sur les tableaux, non ce n'est pas sale de faire comme cela. Tu dois obligatoirement rendre ton serveur omniscient de la situation sur t'es rooms et les interactions entre les joueurs pour qu'il puisse vérifier si une demande est illégale (cheat, hack). Il est plus rapide (généralement) de modifier une variable côté mémoire et côté base de données, c'est d'autant plus vrai pour un jeu. Tu peux ensuite, lors de la fermeture d'une room (plus de joueurs depuis X minutes, faible mémoire restante sur ton serveur) de sauvegarder les informations de ta room dans ta base de données histoire de libérer de la mémoire.
Tu devrais te former sur les requêtes asynchrones (surtout les "Promises"), les requêtes RestAPI (ou Graphql), et te documenter un maximum sur les design pattern (voir le lien que j'ai posté plus haut) pour automatiser un maximum t'es vérifications et ton code pour éviter de devoir réécrire tout ton code pour chaque vérifications. Tu devrais aussi voir du côté de Typescript pour rendre ton code plus robuste. Voir écrire des tests unitaires.
Regarde aussi du côté de la documentation de certaines API tierces pour voir comment ils ont organisés leurs requêtes. Comme DiscordJS : https://discord.js.org/#/docs/main/stable/general/welcome
ou l'API stripe : https://stripe.com/docs/api
Chaque "Feature" (disons les "Users" de l'API discordJS) sont en réalité une classe. Chaque classe ont un constructor histoire de créer une nouvelle instance. Chaque instance ont des propriétés (ID de l'utilisateur, nom, photo de profile ect...) et des méthodes (récupérer des informations, rendre l'utilisateur inactif, l'expluser...)
D'autres features (disons les "channels") auront des méthodes qui vont avoir besoin d'une instance "User" pour faire effet.
Tu devrais donc t'inspirer de ces fonctionnements pour ton jeu.
Créer un jeu comme habbo, c'est un taff qui n'est vraiment pas simple. Mais tu va apprendre énormément de chose, bon courage alors ![]()
Merci pour vos reponses
Mais il-y-a une partie qui m'intrigue :
"Lorsque la demande est correcte est validé, le serveur peut soit mettre à jour les informations qu'il a en mémoire vive (un tableau, une variable), soit mettre à jour directement sa base de donnée"
Comment le serveur met à jour les informations, c'était plutot ça le sens de ma question
Imaginons dans un tableau en memoire vive du server j'ai l'objet room comme ça
Room.id
Room.proprietaire
Room.objets = {
Objet.id
Objet.nom
Objet.posx
Objet.posy
}
Imaginons que j'ai 50 rooms avec 40 fois le même objet en tout dans ces rooms
Si je veux changer le nom de l'objet, il faut que je loop dans le tableau en memoire vive du server pour changer partout le nom de l'objet ?
Ou est ce qu'il faut que je recree un modele de donnes comme ce serait le cas dans une BDD et qui me permettrait de modifier le nom de l'objet uniquement a 1 endroit.
Mais si je fais ça, ça equivaut à faire le même traitement qu'avec une BDD et ducoup je devrais aller rechercher le nom de l'objet via son ID dans un tableau nom_objet et ducoup ça serait long non?
Apres comme l'a dit VDD je peux mettre des loading screen mais ça veut dire que les modifs ne seraient pas instantanées
Pas forcément. L'instance de t'es rooms n'ont pas besoin de toutes les informations concernant un objet. Seul la position, et l'ID de l'objet sont nécessaires par exemple.
Lorsque le client rejoins une zone, le serveur lui dit "Tu as un objet avec l'ID 5 en position 150:22". Le client peut ensuite instancier un nouvel objet à l'aide d'une classe qui as l'ID de l'objet et sa position en constructeur. Le constructeur peut ensuite récupérer l'apprence et le nom de l'objet en local par exemple.
Tu peux avoir un tableau JSON avec l'ID d'un objet et toutes les informations visuelles de cet objet que le client télécharge en local à chaque visite, ou lorsque qu'une mise à jour est disponible.
Chercher un ID dans un tableau avec un for ou un foreach c'est rapide. Tu as les Map en javascript aussi qui sont assez pratiques.
Okok bon je vais tenter ça comme ça
Clairement, nodejs n'est pas la bonne plateforme pour faire un jeu...
Autant JAVA oui... Python pourquoi pas... Javascript côté client, tout à fait ( en plus si utilise un framework et <canvas> c'est encore mieux )... Mais nodejs, une plateforme pensée pour du traitement de données côté serveur et n'est pas la bonne piste ( en tout cas au départ )...
Avant de penser à un jeu côté serveur, tu dois déjà le conceptualisé côté client.
Tu peux même faire du javascript embarqué avec Electron
Exemple de framework JS :
http://phaser.io/
https://www.babylonjs.com/
https://threejs.org/
https://www.pixijs.com/
niveau échange de donnée, tu devras utilisé websocket
niveau base de donnée ça sera mieux d'avoir du Mongodb ou du Couchdb & Redis ( pour les données de session et temporaires )
NodeJS est une plateforme programmé en C/C++ qui fait tourner Javascript comme langage de script. Il est tout aussi viable que Python, PHP ou C/C++/C#
L'auteur veut l'utiliser pour faire un serveur. C'est plus logique d'utiliser Nodejs s'il connais déjà Javascript, au lieu d'apprendre un autre langage/architecture. De plus Nodejs est utilisé pour pleins de frameworks. Typescript peut même partager les types côté client et serveur en même temps. Sans oublier les bundlers comme Webpack ou Rollup
Haha ben je me suis déjà lancé dans le truc donc c'est trop tard, on verra bien si c'était la bonne techno ![]()
J'ai terminé le modele de données qui me permet de gérer :
- Les joueurs
- Les appartements
- Les maps liés aux appartements (genre map 1 = appartement faisant 10x10, map 2 = appart 10x20)
- Le contenu des appartements (avec la position de chaque objets)
- L'inventaire des joueurs
- La tenue des joueurs
- Les vêtements faisant partie de la tenue
- Les sous-catégories de vêtements (Cheveux, lunettes, pantalon)
- Les catégories de vêtements (Tête, haut, jambes, pieds)
- Le mobilier disponible dans le jeu
- Des catégories liés aux mobiliers (mobilier d'hiver, d'été)
Je pense qu'avec ça, je pourrais faire ce que je veux, biensur j'ai créé les clés etrangeres nécessaires pour pouvoir requêter.
Tout ce qui est dialogue je vais le mettre dans la mémoire vive du server et peut-être l'écrire dans un fichier de log par la suite
pour pas saturer le server, ou tout simplement les trash.
La j'en suis à la partie authentification que j'ai quasi terminé, maintenant il faut juste que je sécurise les données envoyées au server pour éviter les failles.

Bon la suite, c'est que lorsqu'un client se connecte, il load toutes les images nécessaires à mon canvas, ensuite, je lui envoi un json avec les propriétés des objets qu'il va devoir dessiner, genre tel mobilier correspond a tel image, se trouve a la position 0,0 de l'image, fait x width, x height etc..., et enfait je fais en sorte que la position de l'objet dans le JSON match avec son ID réél.
Genre, Mobi ID 0, sera l'objet 0 de mon JSON.
Ce qui fait qu'ensuite, quand un joueur entre dans un appartement, il récupère la position des objets de l'appart en mémoire vive du server avec leurs ID, et moi j'aurai juste à faire genre DrawObject(ID), qui va aller taper dans le JSON pour récupérer toutes les infos pour dessiner l'objet (image que je dois utiliser etc..), et j'aurai pas à faire de loop pour trouver mon objet, puisque l'ID sera la position de l'objet dans le JSON.
Bref, je suis peut-être le seul à me comprendre, et mon idée est peut-être naze, n'hésitez pas à donner vos avis et me dire si vous voulez des screens de la suite
Le 28 octobre 2020 à 00:26:27 Le_Tryall a écrit :
NodeJS est une plateforme programmé en C/C++ qui fait tourner Javascript comme langage de script. Il est tout aussi viable que Python, PHP ou C/C++/C#L'auteur veut l'utiliser pour faire un serveur. C'est plus logique d'utiliser Nodejs s'il connais déjà Javascript, au lieu d'apprendre un autre langage/architecture. De plus Nodejs est utilisé pour pleins de frameworks. Typescript peut même partager les types côté client et serveur en même temps. Sans oublier les bundlers comme Webpack ou Rollup
J'ai pas dit qu'il ne devait pas utiliser node...
J'ai dit que dans la CONCEPTION DE SON JEU, il ne devait pas commencer par la partie serveur !
Pour ceux que ça intéresse, j'ai avancé sur le projet en créant le moteur qui genere les apparts et les mobis

Jpeux poser les mobis et les superposer si je veux, bon apres j'ai tout pompé de habbo au niveau des assets graphiques puisque j'ai rien sinon ![]()
Bravo pour ton avancement, pour essayer moi même de créer un jeu online t’en a pas fini de modifier ton modèle 🤣
Hello, pour ceux que ça intéresse comme d'hab.
J'ai poursuivi l'avancement du jeu en mettant en place le fait de pouvoir poser des mobis complexes, cest à dire ceux qui prennent + d'1 case.
Et ben c'était pas facile facile ![]()
J'ai aussi mis en place un inventaire.
Donc le truc c'est que quand on clic sur le mobis d'un inventaire, on le voit apres en genre un peu transparent sur la Map pour savoir où est ce qu'il va atterrir.
Apres une fois qu'on le pose, on le voit sans transparence.
J'ai mis en place un systeme qui vérifie qu'on peut bien poser un mobis en regardant si les cases sont déjà prises.
Maintenant la prochaine étape, c'est pouvoir retirer un mobis déjà présent ou le déplacer, pour ça j'ai déjà craft le fait de repérer selon le clic sur le canvas, le mobis correspondant en faisant gaffe aux perspectives, et now je dois afficher l'image du mobis ailleurs sur l'écran avec des boutons supprimer, déplacer
Voici une capture de l'avancement