Hmm pour le code fonctionnel je n'ai rien a présenter actuellement, je passe tout mon temps alloué à ce projet à la réflexion et à la prise de notes depuis presque un an.. ça commence à être problématique, mais je n'ai pas le temps de me lancer car j'ai pas mal de taf annexe en plus de mon job de dev php.
Dans mon jeu, l'entité que contrôle le joueur (à savoir un genre de village – mais ça peut être n'importe quoi d'autre) est géré par un serveur.
Tu peux considérer ça comme plein d'instances de la même classe, mais des objets qui vivraient chacun leur vie parallèlement et qui s'endorment et se réveillent au gré des messages qu'ils reçoivent.
Ces messages, ce sont eux-mêmes qui les envoient à leurs copains du style
— hé, pan, je t'envoie une attaque de 400 dégâts, tu résistes ?
— et oui, j'ai mon super boubou je ne manges que 25 dégâts électroniques ! :p
du genre (ça pique les yeux, je sais)
Les identifiants de ces serveurs (qui sont en fait des processus) seront stockés dans une table, que la fonction nomdemonjeu:playerid2pid(Id) va parcourir pour retrouver l'identifiant du processus associé au joueur. (la table est en mémoire, pas en dur).
Éventuellement, il y a un timeout sur les processus afin qu'un processus qui dort depuis une heure se termine. la fonction nomdemonjeu:playerid2pid(Id) pourra en créer un nouveau si on a besoin d'interagir avec le joueur. Je ne sais pas encore si je vais faire comme ça mais ça sera approchant.
Pas de node JS non, je pensais utiliser un framework erlang pour le push. Voilà si tu as des questions n'hésite pas, j'ai du mettre une bonne heure à écrire ce post (surtout pour inventer le code qui s'y trouve) ça me permet de mettre en place un peu tout ce qui se mélange dans ma tête depuis trop longtemps
edit: bien sur tout ça c'est le serveur de jeu, ensuite il y a l'interface web qui reçoit l'ordre d'attaquer et qui va en informer le code précédent. Mais le truc intéressant c'est que chaque joueur va piloter son serveur
Dans mon jeu, l'entité que contrôle le joueur (à savoir un genre de village – mais ça peut être n'importe quoi d'autre) est géré par un serveur.
Tu peux considérer ça comme plein d'instances de la même classe, mais des objets qui vivraient chacun leur vie parallèlement et qui s'endorment et se réveillent au gré des messages qu'ils reçoivent.
Ces messages, ce sont eux-mêmes qui les envoient à leurs copains du style
— hé, pan, je t'envoie une attaque de 400 dégâts, tu résistes ?
— et oui, j'ai mon super boubou je ne manges que 25 dégâts électroniques ! :p
du genre (ça pique les yeux, je sais)
%% J'envoie une attaque au joueur 34
attack(nomdemonjeu:playerid2pid(34), #attack{spell=#spell{id=MySpell,type=electro, ...},
damage=damages(MySpell, Player)
}).
%% Et dans la fonction qui reçoit les messages
%% ici c'est un cast (asynchrone) et non un call car le joueur qui attaque n'attends pas de réponse
%% particulière, il a juste balancé un missile ou je ne sais quoi et ce qui arrive ensuite ne dépends pas de lui.
%% mais on lui envoie quand même en retour les informations
handle_cast({attack, Attack#attack{spell=Spell,damage=Damage}}, FromPlayer, Player) ->
DamageDone = resists_passthru(Attack, Player),
PlayerUpdated = perdre_de_la_vie(DamageDone, Player),
nomdemonjeu:notify(FromPlayer, {attackresult, Spell, Damage}),
{noreply, PlayerUpdated};
Les identifiants de ces serveurs (qui sont en fait des processus) seront stockés dans une table, que la fonction nomdemonjeu:playerid2pid(Id) va parcourir pour retrouver l'identifiant du processus associé au joueur. (la table est en mémoire, pas en dur).
Éventuellement, il y a un timeout sur les processus afin qu'un processus qui dort depuis une heure se termine. la fonction nomdemonjeu:playerid2pid(Id) pourra en créer un nouveau si on a besoin d'interagir avec le joueur. Je ne sais pas encore si je vais faire comme ça mais ça sera approchant.
Pas de node JS non, je pensais utiliser un framework erlang pour le push. Voilà si tu as des questions n'hésite pas, j'ai du mettre une bonne heure à écrire ce post (surtout pour inventer le code qui s'y trouve) ça me permet de mettre en place un peu tout ce qui se mélange dans ma tête depuis trop longtemps
edit: bien sur tout ça c'est le serveur de jeu, ensuite il y a l'interface web qui reçoit l'ordre d'attaquer et qui va en informer le code précédent. Mais le truc intéressant c'est que chaque joueur va piloter son serveur