JeuWeb - Crée ton jeu par navigateur
Comment être averti d'une déconnexion? - 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 : Comment être averti d'une déconnexion? (/showthread.php?tid=4249)



Comment être averti d'une déconnexion? - Blarg - 16-08-2009

Bonjour,

d'abord le contexte de mon problème :
mon jeu utilise un plateau où les joueurs peuvent voir leur avatar ainsi que celui des autre joueurs. J'aimerais que, lorsqu'un joueur quitte le jeu, son personnage disparaisse du plateau de jeu.

Si il utilise le menu de déconnexion, tout va bien (la demande est acheminé au script php qui rend l'avatar invisible), mais si il quitte en fermant la fenêtre de jeu ou le navigateur sans utiliser le menu de déconnexion, les problèmes commencent. Mon jeu n'a aucune façon de savoir que le joueur est parti et son avatar reste ainsi sur le plateau en l'encombrant inutilement.

Ma question : est-ce que c'est possible (par les cookies, les sessions, php, javascript, un event flash ou je ne sais quoi) d'envoyer un message au serveur afin d'exécuter mon script pour cacher l'avatar?

En attendant, j'ai pensé à un script un peu lourd qui s'exécuterait après chacunes des requêtes des joueurs. Dans un premier temps, ce script mettrait un timestamp indiquant à quand remonte la dernière action de ce joueur. Deuxièmement, le script vérifierait tous les timestamp des autres joueurs de la zone pour déterminer depuis quand ils n'ont pas agit. Si ça fait plus de 5 minutes par exemple, l'avatar est caché, comme lors d'une déconnexion normale.

Je suis persuadé que je ne suis pas le seul à rencontrer un problème semblable, alors proposer des solutions ici pourrait servir à plusieurs personnes. Soyez généreux Smile


RE: Comment être averti d'une déconnexion? - anthono - 16-08-2009

Bonjour,
Moi je pense que tu devrais faire avec le timestamp par rapport a la derniére action si il est supérieur a 5min sont statut est deconnecte.


RE: Comment être averti d'une déconnexion? - Sephi-Chan - 16-08-2009

Tu peux envoyer une requête Ajax quand l'événement unload est déclenché. Ça te permettra déjà de fermer pas mal de connexion proprement.

En complément, tu peux effectivement stocker dans la base la date de la dernière action puis faire un script qui recherche les joueurs inactifs depuis un certain temps (c'est encore plus simple si tu es dans un environnement dédié, grâce à un petit daemon).


Sephi-Chan


RE: Comment être averti d'une déconnexion? - Sloop - 17-08-2009

Si tu as un dédié (car je crois que cela ne fonctionnera pas sur un mutualisé) tu récupères l'identification de la session lors de la connexion. Comme tu as fixé le temps maximal d'une session à 5 minutes par exemple, tu regardes si le fichier d'identification existe toujours pour Apache. C'est assez lourd, mais cela peut se faire. Cela peut se faire sans PHP mais cela demande donc d'avoir un dédié ;-)

Il existe une série de façon de faire. Il faut juste se casser la tête. C'est ça, la conception


RE: Comment être averti d'une déconnexion? - phenix - 17-08-2009

Si tu n'as pas de serveur dédier, tu peux aussi faire en sorte que ce soit les autres joueurs qui ce rende compte que le joueur est inactif.

Quand un joueur charge une page, il vérifie si tout les autres joueurs de sont plateau sont actif depuis les 5 dernières minutes, au moyen des timestamps comme on te la dit plus haut Smile


RE: Comment être averti d'une déconnexion? - Blarg - 17-08-2009

J'ai effectivement un serveur mutualisé. Je croyais que la solution du timestamp était trop lourde à mettre en place, mais puisque vous semblez la trouvez valide, je vais essayer de l'implanter.


RE: Comment être averti d'une déconnexion? - Anthor - 17-08-2009

Sinon sans allez sur du lourd, en légèreté, tu n'as qu'à créer un fichier nommé avec l'id du joueur et dedans tu y fous ton timestamp.

A moins d'avoir 2000 joueurs, les boucles sur les fichiers sont très rapides ^^


RE: Comment être averti d'une déconnexion? - Zamentur - 18-08-2009

Exact, faut pas oublier de supprimer le fichier une fois qu'on a déterminer que le joueur est déconnecté.

Ça permet d'éviter d'avoir 2000 fichiers justement avec ce système tu en auras pas bien plus que 50 (50 connecté simultanée c'est déjà grand)

Sinon tu peux aussi faire une colonne dédié à çà dans la table joueur ou dans une table memory celle ci étant censé se stocker en mémoire vive si je me souviens bien. (bien sur je viens de supposer qu'on utilise mysql ce qui est le cas de beaucoup de mutualisé)


RE: Comment être averti d'une déconnexion? - nicodd - 21-08-2009

Effectivement, une table ne servant qu'a cela et en moteur de stockage MEMORY devrait être plus performante que des fichiers (pas d'accès au disque dur).


RE: Comment être averti d'une déconnexion? - Thib4s - 28-08-2009

Je peux t'aider en t'orientant.
Personnellement j'avais créé un MMORpg en php similaire au tient, tactique en temps réel sur plateau. Après avoir essayé la solution du timestamp qui une fois les 4000 joueurs arrivés a fait bugger la base de donnée ou provoquer de gros ralentissement en ayant en plus le désavantage du délais de X minutes qui n'est pas rien pour un MMORpg... J'avais trouvé LA solution : Tout d'abbord javascript devais être activé pour pouvoir jouer au jeu(lié aux scripts en temps réel pour gérer les combats), ensuite je déclenchais un <body onbeforeunload="FunctionJS">
FunctionJS affichait une alerte demandant si le joueur était sur de vouloir quitter le jeu. Si il acceptait, le script détruisait sa session et modifiait le champs connected de la BD ( si il est a 0 je n'affiche pas le joueur en ligne, si il est a 1, le joueur est considérer comme en ligne et donc affrontable);

Voila j'espere que sa ta aider