CR2: Architecture générale - BAKFR/rts-side-project GitHub Wiki
Samedi 12 Mars - Réunion architecture
Architecture générale
Les parties se joueront en multijoueur. On a donc deux parties distinctes: client et serveur. Toutes les actions réalisées coté client doivent être communiquées au serveur. Celui-ci doit les vérifier, et maintenir tout les joueurs à jour en envoyant des messages à tous.
Architecture client
On part sur une solution à base de pattern Entity Component System (abréggé ECS). Comme on est pas sûr de la pertinence du choix de la lib graphique, cet aspect doit être particulièrement découplé du reste.
Tout les éléments présent sur la map sont des entités. Au début du jeu, le serveur va générer quelques unités pour chaque joueur, un QG par joueur, et plusieurs mines neutres.
Technologies
- socket.io pour la communication client-serveur
- Tree.js pour l'aspect graphique
Les Components
- Owner: l'entité est associé à un joueur précis.
- player: ID
- Graphic: entité affichable à l'écran
- 3d_model
- material (texture)
- Location: position dans l'espace
- position: Point[x;y]
- orientation: number (angle)
- Movable: l'entité peut se déplacer d'elle-même
- max_speed
- acceleration
- speed (actuelle)
- Body: la forme de l'objet
- shape: "cube" (enum)
- size
- Focusable: l'entité peut être sélectionnée par un joueur.
- owner_only: boolean (Si
true, seul son propriétaire peut sélectionner l'entité)
- owner_only: boolean (Si
- HasFocus: propriété dynamique, attribué quand une entité acquiert le focus (par le joueur local, bien sûr)
- Weapon: l'entité peut attaquer
- dammage
- cooldown: Temps de rechargement entre deux attaques.
- type: ['aérien', 'anti-aerien', 'terrestre']
- Targetable: l'entité peut être ciblée par une attaque.
- Life: attributs de l'entité TODO: devrait être renommé
- pv
- type: ['aérien', 'anti-aerien', 'terrestre']
- Présentation: données affichable dans l'HUD
- name
- description
- image
- Actionable:
- action: [] liste d'action éxécutable par cette entité (ex: attaquer, contruire un batiment, ...)
- name
- cost
- locked
- action: [] liste d'action éxécutable par cette entité (ex: attaquer, contruire un batiment, ...)
- Order: Un ordre associé à une unité (ex: se déplacer, attaquer).
- action
- target
les Systems
- détection des événements
- détecter click / mouvement
- lecture des événements du réseau.
- déplacer la caméra en fonction des mouvements de souris
- changement de focus des entités en cas de click surla map
- création d'action en cas de click sur les bouttons action de l'HUD (ou en cas de click sur la map pour déplacer des unités)
- Envoi sur les réseau des actions créées.
- Exécution des actions On transforme les orders en action concrète, puis on exécute la première étape. TODO: partie à détailler
- Affichage HUD
- Affichage de la map (background)
- affichage des unités
Partie serveur
On va utiliser NodeJs.
Le serveur "génère" la map (c-à-d les entités présente dès le début du jeu).
Trames réseaux
- Start game (serveur seulement)
- End game (serveur seulement)
- position de l'entité
- Création d'Order
- Création d'entité
- Destruction d'entité