Petit module pour le moteur réseau
Voila un petit bout du moteur réseau que j'ai rapidement griffonné ce soir.
Il s'agit de la partie qui va gérer la fréquence de rafraîchissements des autres joueurs en fonction de la distance qui les sépare du joueur.
Le système est plutôt simple, du moment que l'on a les coordonnées des joueurs. On assimile le terrain à un repère. Et on applique la formule :
AB = V((Xb-Xa)²+(Yb-Ya)²)
V() = racine carré.
X et Y coordonnées.
Ici on a la classe PersoPosition pour le joueur, qui contient les coordonnées x et y sous la forme :
PersoPosition.x
PersoPosition.y
On a aussi la classe Player (qui représente les peers) :
public class SPlayer{
protected static int counterid=0; //Le counter id commun à tous les
player
protected string login=""; //Le nom du peerpublic
public float x = 0;
public float y = 0;
public float z = 0;
Id=counterid++; //Défini son ID unique
public float d = 0;
}
d représente la distance.
Ici on obtient la hauteur (y) par rapport à la heigtmap.
Donc la formule va concerner x et z mais ca ne change rien.
On calcul la distance de notre joueur avec les autres peers par une fonction du type (la syntaxe n'est pas respectée.) :
For 1 to idcount. + calcul et stockageOn stocke le tout dans la classe Splayer de tel ou tel id.
Et en fonction de ça lors de notre fonction qui met à jour les positions, certains peers ne seront mis à jour que 1 fois sur 4 ce qui permet d'économiser, une fois de plus, beaucoup de bande passante dans les grandes zones.
Il est évident que ce genre de technique ne s'applique pas à tout le jeux. Un jeu de sniper ne peut pas se permettre ceci et c'est pour cela, que pour le cas d'avalon, j'inclus une conditions de plus (mais qui n'est aucunement indispensable.).
Certains flous/incohérences persistent car je n'ai pas encore mis en relation le moteur réseau et le jeu. Donc je créé l'exemple en même temps que l'écriture de ce post.
De son côté le jeu n'a pas bougé.
Voila c'est tout pour ce soir.