JeuWeb - Crée ton jeu par navigateur
Jeu/Navigateur - Questions techniques - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Jeu/Navigateur - Questions techniques (/showthread.php?tid=8105)



Jeu/Navigateur - Questions techniques - Havelable - 30-06-2020

Bonjour à tous,

Je suis étudiant en informatique, je débute un Master en IA l'année prochaine. Mon parcours m'a permis d'avoir des connaissances dans tous les domaines de la programmation (notamment en web) mais je me heurte aujourd'hui à certaines problématiques pour lesquelles je ne trouve pas de documentation.

Je vais tenter de rester bref, les mécaniques de jeu particulières à mon projet ne devraient pas être importantes pour la suite de mes question donc je ne vais pas m'attarder dessus; si j'ai tort, n'hésitez pas à les solliciter.


Présentation du projet

Mon projet est un jeu multijoueur de stratégie par navigateur (même style que Travian, Guerre Tribale...). Le joueur gère son/ses village(s), ses ressources, son armée, noue des alliances et fait la guerre avec les autres joueurs. Le but étant de d'être le joueur le plus puissant du monde/serveur ou de faire partie de l'alliance dominante (par le contrôle de la majorité des villages).
Bien que j'ai pour but de mener ce projet à bout (au moins de le rendre jouable et disponible en ligne), il a aussi et surtout un but pédagogique pour moi : d'approfondir ma maîtrise de différents langages et la gestion d'un projet en full-stack.


Stack (Front-end / Back-end)

Mon premier questionnement est par rapport aux technologies à employer. N'ayant qu'une très maigre expérience avec les Framework orientés web (je ne connais que Vue.js et ai une petite expérience avec Node.js) je ne connais pas bien les avantages et les inconvénients de chaque Framework du moment. De plus, de par mon manque d'expérience, j'ai du mal à m'informer de manière pertinente sur chaque technologie, savoir quoi choisir pour quelle raison. J'ai bien conscience qu'il y a autant d'avis qu'il n'y a de développeurs mais en me tournant vers vous j'espère aussi connaître les tendances actuelles dans les milieux professionnels.

Les technologies qui m'intéressent :
- Vue.js       || Front-end
- Angular     || Front-end
- [/url]Node.js     || Back-end
- ASP.NET     || Back-end

Comme vous pouvez le remarquer je suis déjà très orienté sur du Javascript ou du C# (des langages que je veux approfondir) mais je suis très indécis sur quels choix faire, quel raisonnement avoir pour le choix de la technologie. Pour être complètement honnête je ne suis pas sûr de voir de grosse différence au niveau fonctionnel pour chacune des solutions listées au dessus, ou même des différentes solutions que j'ai pu voir lors de mes recherches.

La base de donnée sera en SQL, il n'y a pas de raison logique à ce niveau là, c'est simplement ce avec quoi j'ai travaillé pendant mes études. Je ne suis pas fermé aux différentes idées, je ne connais absolument pas le NoSQL et ne vois donc peut-être pas l'avantage que cela pourrait m'amener.

Tant que je suis sur la question du front-end / back-end, j'aimerai en profiter pour demander quelles sont les pratiques courantes pour la communication entre les deux?

Les seuls projets que j'ai pu réaliser étaient des API mais je ne suis pas sûr que cette méthode se prête à un jeu, avec les mises à jour qui doivent se réaliser en temps réels etc. J'ai beaucoup vu les WebSockets durant mes recherches mais n'ai aucune expérience avec. Est-ce une sorte de complément à une API? Faut-il faire toute la communication avec des websockets? Existe-t-il d'autres méthodes de communication?


Carte du monde

Le problème principal auquel je me confronte aujourd'hui est la conception de la carte. Effectivement, l'aspect principal de mon jeu se situerai sur la carte du monde (la gestion des ressources, l'attaque d'autres villages etc...), il me faut donc une carte interactive à la manière de Travian ou Guerre Tribale. Ma carte serait constituée de tuiles en forme d’hexagones, chaque tuile serait cliquable, on explorerait la carte en traînant la souris (drag) et on pourrait zoomer et dézoomer à l'aide de la molette. Un peu comme sur Google Maps au final.



.png   example_map_travian.png (Taille : 366,37 Ko / Téléchargements : 9)
Exemple de carte (Travian) - récupérée sur le wiki du jeu Travian Kingdoms

[url=http://wiki.kingdoms.com/tiki-index.php?page=C%C3%B4t%C3%A9+gauche+de+l%27interface]
Pour faire simple, je n'ai absolument aucune idée de comment m'attaquer à une telle tâche. Je n'ai jamais eu à réaliser un tel outil et je ne trouve aucune documentation en ce qui concerne la conception de cartes pour un jeu par navigateur. Je suis en recherche de toute piste, idée ou solution.


Architecture de la base de données

Je ne suis malheureusement pas en position de vous donner le schéma UML de ma bdd car c'est un brouillon sans queue ni tête mais son gros problème c'est l'isolation des mondes.
Aujourd'hui tout se place dans une base de données, tous les joueurs, toutes les cartes, tous les mondes/serveurs.

Le hic c'est qu'en lisant le mot "serveur" je me suis rendu compte que si jamais, pour une raison ou une autre, le serveur de la bdd cessait de fonctionner, tous les mondes deviendraient inaccessibles. Je me demande donc comment s'organisent les grands du jeux-vidéo pour avoir des serveurs pour chaque monde? Ma reflexion m'a menée à avoir une base de données par monde mais est-ce une pratique courante? N'est-ce pas à éviter? Si j'opte pour ce choix, comment lié les données d'un compte (sur une bdd) aux différents mondes (sur différentes bdd)?



Voilà aujourd'hui les problématiques que je rencontre sur mon jeu...

Merci d'avoir pris le temps de lire et éventuellement de répondre,

Bonne journée !

- Havelable

ps: Si le sujet ne se trouve pas dans la bonne catégorie ou qu'il y a d'autres catégories / sites / forums pertinents pour mon sujet, merci de m'en informer !


RE: Jeu/Navigateur - Questions techniques - Xenos - 30-06-2020

Salut,

ca fait un sacré paquet de questions d'un coup, mais ok ^^
D'abord, niveau stack, je ne donnerai pas de comparatif avec ce qu'on a au boulot: le contexte n'est pas du tout le même, et la réponse serait donc hors sujet.

Ensuite, au vu du projet, je pense que tu ne pourras pas mener ça à bien. Il ne faut pas oublier que derrière les jeux cités, il y a des équipes entières, à plein temps, avec souvent de l'expérience et des moyens. Avec aucun de ces critères, se lancer dans un tel jeu, c'est une mauvaise idée je dirai. C'est comme si tu étais passionné de mécanique automobile, et que tu voulais fabriquer ta propre voiture, avec tes propres outils et tes propres méthodes. Un projet pareil, je commencerai par en délimiter complètement le contenu, le chiffrer en temps et en connaissances, et je m'orienterai vers les SDK qui permettront de faciliter au maximum le travail (exemple type en tête: Unity; niveau tutoriel "faites votre propre RTS avec Unity", ca doit se trouver)
Ca résoudra les problématiques du genre "où trouver des assets graphiques & sonores", "comment démarrer? vous avez un tuto?" ou encore "comment faire la navigation dans ma carte". Ce sont des thèmes déjà traités par ces SDK car très courants, pour lesquels les années d'expérience de ces outils ont couvert à peu près tous les cas possibles.

Là où sortir des FW/SDK/sentiers battus peut être utile, c'est si:
- tu as un concept/approche de gameplay innovant, qui ne rentre pas dans les cases déjà existantes (imaginons, tu souhaiterais faire une méthode de navigation ou de représentation de la carte totalement originale, plus ou moins inédite, pour expérimenter)
- tu as un projet de jeu bien assez simple pour ne pas requérir l'entièreté de la connaissance du FW/SDK (par exemple, pour un mini-jeu comme les miens, je n'avais aucun intérêt à passer 6 mois à apprendre l'utilisation de Unity: autant piocher dans mes connaissances existantes, qui a recoder pendant 2-3h certains éléments qui se seraient déjà trouvés dans un FW). cela peut aussi inclure le "Runtime" (un FW complet pour un mini jeu, c'est souvent un temps de chargement, parfois de 3s ou parfois de 30s, alors que le jeu derrière est simplissime)


Pour répondre à l'aspect DB, les sites un peu costaud (et les hébergements mutualisés) se servent des clusters des SGBD pour assurer la redondance et la continuité du service (et pour le serveur web applicatif, ce sont des load balancers et de la réplication aussi). En gros, tu as un serveur (parfois même plusieurs si t'as un sacré site) qui reçois les requêtes entrantes, qui les dispatche ensuite sur l'un des 3 ou 4 serveurs Apache web du site, pour répartir la charge (et pour, en cas de panne d'un serveur, pouvoir envoyer les requêtes vers un autre toujours debout). Idem pour la DB (avec, en plus, d'autres serveurs dits "slave" qui sont chargés de recopier en temps réel ce qui se trouve dans la DB, dite master, de sorte que si les serveurs de DB "master" meurent, une copie [backup] existe).
Mais sur un jeu web amateur, pas besoin de te prendre autant la tête Wink


RE: Jeu/Navigateur - Questions techniques - Havelable - 30-06-2020

Bonjour Xenos,
Tout d’abord, merci d’avoir pris le temps de me répondre.

Je me rend bien compte de l’ampleur d’un jeu comme Travian et n’ai (malheureusement ?) pas la naïveté de penser pouvoir sortir un jeu aussi travaillé et poli. Mon but est simplement de sortir une version très simplifiée. Je me suis peut-être emporté en comparant mon idée à ces grands noms mais je compte bien reprendre certaines idées, comme la carte du monde.

Tu marques un point avec les SDK / GDK tels que Unity. L’idée m’avait traversée l’esprit, la simplicité qu’offre ces logiciels ne peut pas être ignorée. Cependant je vais rester sur mes positions pour le moment et je ne pense pas m’orienter vers cette solution pour le moment.

Ce que je n’ai pas spécifié dans mon gros pavé de texte c’est que j’ai passé un peu plus de 4 mois à planifier ce projet. Le contenu, les mécaniques, les interactions etc ont été pensées le plus possible. Je n’ai pas l’expérience requise pour estimer correctement un coût en temps pour chacune des tâches à effectuer mais non seulement j’ai une bonne idée de ce que je dois réaliser pour avoir une version minimale jouable de mon jeu (sans la carte malheureusement) mais j’estime aussi avoir la capacité de pouvoir réaliser la version minimale sans avoir recours aux SDK / GDK. La carte est vraiment l’élément perturbateur de mon projet : c’est le seul point qui me pose vraiment problème et le seul pour lequel je ne trouve pas de solution. Je peut faire un projet jouable sans et dans un premier temps c’est ce que je vais sans doute faire, mais l’essence de mon jeu, son originalité et son attrait était vraiment les interactions sur la carte.
Niveau graphisme et sons je pensais commencer sans… un carré avec un triangle au-dessus me fera une très belle maison (tels sont mes talents haha) pour une première version. J’avais pour idée de chercher un artiste/graphiste une fois que mon jeu approchait d’une mise en ligne, je ne voudrais pas demander à quelqu’un d’investir des heures dans un projet qui pourrait ne rien donner.

Pour mes questions je ne m’attend pas à recevoir des tutoriels me guidant entièrement à travers les étapes, simplement les grandes lignes et les grandes idées.
Pour l’exemple de la carte je me demandais simplement ce qui se faisait dans le milieu. Le serveur renvoie-t-il tous les villages dans un cadre défini ? Renvoie-t-il une image qu’il à généré en fonction des villages présents à cet endroit ?
J’ai examiné la carte de Travian pour tenter d’en comprendre le fonctionnement mais tout ce que je vois c’est que le site affiche des images contenant les villages… J’imagine donc que le serveur génère une image lorsque le client demande certaines coordonnées mais je ne suis pas sûr…

Pour la partie BDD je pense ne jamais avoir besoin même d’une grosse base de données ou de plusieurs mondes mais j’aime bien penser et construire mon projet comme si je devais penser à gérer une quantité astronomique d’utilisateurs, mettre en place les bonnes pratiques et les bonnes habitudes. Ça me coûte beaucoup de temps mais je trouve ça très formateur.
J’avais brièvement entendu parlé des clusters mais sans vraiment m’y intéresser, je vais aller voir de quoi il s’agit plus précisément, merci pour l’info.

Je te remercie une fois de plus pour ta réponse,
J’ai vraiment du mal à rester concis… Voici un nouveau pavé…
Bonne journée / soirée !


RE: Jeu/Navigateur - Questions techniques - Xenos - 30-06-2020

A mon avis, si tu ne t'orientes pas vers ce genre de solution-là, tu ne "finiras" pas ton projet (au sens d'avoir un jeu jouable & joué). Après, si le but est d'expérimenter, cette non-finition n'est pas un problème Wink

Je ne sais pas quel est le fonctionne des autres jeux. Pour https://eclerd.com & https://varii.space, la carte est une arborescence donc, j'envoie simplement la position dans l'arbre où le joueur se trouve Smile

Les deux techniques que tu décris existent: le serveur, usuellement, renvoie les données du jeu se trouvant "dans la zone visible et un peu plus", pour qu'en cas de déplacement dans la carte, celle-ci ne "fige" pas trop. Quand il y a besoin d'une notion de zoom important (façon mappy), alors la carte est découpée en "niveaux de zoom" et en "clusters". La vue se trouve à un niveau de zoom donné, et comme précédemment décrit, le serveur renvoie les informations touchant la zone visible-et-un-peu-plus au client (ces informations peuvent être des données formattées type JSON + des URLs vers les images de fond à utiliser + des données binaires encodées d'images générées, etc).
L'autre méthode, consistant à générer le rendu sur le serveur puis à délivrer le résultat au client, existe aussi mais est beaucoup plus rare. Elle est plutôt utilisée, à ma connaissance, par les services de jeux AAA. Il y a des services qui, en gros, ont des ordis de boeufs qui lancent le jeu AAA, et ils te "streament" le contenu de l'écran. Bon, ca ne résoud pas la problématique d'affichage de la carte, ça la déporte, mais ca existe Wink

Non, je ne pense pas que le site "génère" une image comme tu l'entends. Je pense plutôt que, d'une part, oui on peut construire dynamiquement une image pour un batiment ou autre assimilé puis la stocker sur le serveur, et ensuite, pour l'affichage de la carte, on envoie la coordonnée où se trouve le batiment & l'url à utiliser. Le client place alors cette image sur la carte, en utilisant ses algos de projection si besoin.

Pour les clusters de DB/serveurs web, pour moi, c'est à bien décoreller de ton jeu: ce sont des tâches d'administration système, qu'on peut zieuter pour la curiosité mais qui doivent être entièrement dévolues à ton hébergeur web. Sinon, tu ne t'en sortiras pas x)


RE: Jeu/Navigateur - Questions techniques - Havelable - 30-06-2020

Merci pour cette réponse ça m’éclaire beaucoup !

Effectivement, en observant comment fonctionne Google Maps j'ai cru comprendre que le serveur renvoyait des images selon la zone visible et le zoom. Je vais explorer cette solution plus en détail je pense.

Bien que je ne sois pas en mesure de le faire, je trouve ça très intéressant cette idée de stream le contenu au client, évitant la charge de calcul du coté client...

Bien sûr haha, c'est juste par curiosité et pour voir si je dois adapter l'architecture de ma bdd en conséquent ou si l'architecture n'influence pas cette méthode.

Merci pour tes réponses, je pense que je vais attaquer la réalisation de mon projet sans la carte dans un premier temps, puis l'implémenter par la suite après avoir trouvé une solution qui me convienne. Smile