Architecture
Voici toutes les données sur le fonctionnement du programme.
Le moteur physique
Notre projet doit aussi mettre en place une physique semi-réaliste. C'est-à-dire que les joueurs sont arrêtés par les murs, le terrain... Ils sont aussi soumis à la gravité et ejectés par certains projectiles.
Une grande simplification a été faite mais elle permet de rendre les calculs beaucoup moins sophistiqués : on fonctionne avec des Axis Aligned Bounding Box. Pour les calculs physiques, les personnages et projectiles sont représentés comme des pavés droits alignés sur les axes. Pour savoir s'il y a collision entre un joueurs et un projectile ou un partie de terrain, il suffit alors de calculer quand aura lieu la collision entre eux sur un axe et de vérifier si cela marche sur les autres axes.
Les trajectoires suivies par les entitées peuvent être modélisée par des equations paramétriques. Il y a collision sur un axe quand les résultats données par les équations de 2 objets sont égaux pour le même paramètre.
Un exemple : on a un projectile qui suit une trajectoire linéaire (il avance tout droit), son équation est donc la suivante : x = at + b, y = ct + d, z = et + f. On a aussi un personnage qui tombe : x = a'x + b', y = -g/2 * t * t + c't + d', z = e't + f. On veut savoir quand il y aura collision. On hcerche donc quand leur x seront égaux, quand leurs y seront égaux et quand leur z seront égaux.
x = x <=> t = (b - b') / (a' - a)
y = y <=> g/2 * t * t + (c - c')t + (d - d') = 0 suivi de la résolution du trinome etc...
z = z <=> t = (f - f') / (e' - e)
Lorsque que l'on connait la valeur de t pour laquelle x = x, on sait que les centres des 2 objets sont sur le même plan... Il faut alors vérifier s'ils se croisent ou non. (on connait les dimensiosn des boites, ça aide).
Que faire lorsque les équations sont tordues ? Il faut utiliser une méthode d'approximation de la valeur de t pour laquelle les objets se touchent comme par exemple la dichotomie...
Le protocole
Puisqu'il s'agit d'une application en réseau, il convient de se mettre d'accord sur comment les informations sont envoyées à travers celui-ci.
Un nombre est envoyé en premier pour indiquer de quelle requête il s'agit puis des infos supplémentaires sont envoyées selon le type de requête.
Il faut préciser que c'est le serveur qui fait tous les calculs de gamelogic : une seule machine effectue les calculs sensibles pour éviter les problèmes de résultats différents. Lorsqu'un joueur veut avancer, il indique au serveur qu'il a appuyé sur la flèche du haut puis le serveur lui dit que son perso avance etc...
Les codes supérieurs ou égaux à 100 correspondent à requêtes client->serveur alors que les autres correspondent à des paquets serveur->client
Connection des joueurs, choix du perso, avant la partie...
Code 1 : Envoie de la liste des joueurs déjà connectés (Tableaux d'objets Info)
Code 2 : Un perso change de type de perso (int idDuJoueur, int typePerso)
Code 3 : Un joueur a quitté : ce joueur est supprimé du tableau et ceux qui le suivent prennent sa place => leur id change (int idDuJoueur)
Code 4 : Quelqu'un se connecte : il est ajouté à la fin du tableau des joueurs (Objets Info)
Code 5 : Un joueur a validé (int idDuJoueur)
Code 6 : La partie commence & il faut enregistrer le temps correspondant à ce début.
Code 100 : J'envoie mes 1ères infos, le serveur les reçois et notifie qu'un nouveau joueur s'est connecté (Objet info)
Code 101 : Je veux changer de type (int typePerso), le perso se charge de savoir de quel client il s'agit
Code 102 : Je valide
Pendant la partie
Code 6 : La partie commence & il faut enregistrer le temps correspondant à ce début.
Code 8 : Entité apparue (int typEntitee, vecteur position, vecteur orientation)
Code 9 : Entité déplacée (int idEntitee, vecteur position, orientation)
Code 10 : Entité disparue (int idEntitee)
Code 11 : L'entité joue une animation (int idEntitee, int animation, int tempsDepuis)
Code 103 : Je fais une action : avancer, reculer etc (int typeAction)