21-08-2009, 09:20 AM
J'aurais plus tendance à penser à une succession avec une requête plus rapide qu'une autre... En fait, pour comprendre le concept, il faut voir comment fonctionne ajax et pour ça, je trouve que firebug (en mode console actif) est un outil merveilleux. Je schématise pour te montrer ce que je veux dire et ce que je soupçonne (Firebug te permettrais de le tester) :
En théorie, avec ton code, tu devrais avoir :
1/ Clic du joueur
2/ Execution de la requête de déplacement
3/ Execution de la requête de rafraichissement de la carte
4/ Retour de la requête de rafraichissement de la map
1'/ Clic du joueur
2'/ Execution de la requête de déplacement
3'/ Execution de la requête de rafraichissement de la carte
4'/ Retour de la requête de rafraichissement de la map
Sauf que parfois (toujours même), il faut un certain temps pour que l'étape 4 se produise : le temps que ton serveur génère la carte, que le navigateur se connecte, qu'il la renvoi, etc... ce temps est très variable et ce, pour des raisons totalement diverses (un pic de p2p à un moment et pas à un autre, un mail qui passe sur ton serveur et le ralenti un peu d'un coup, n'importe quoi !). Et alors, tu peux te retrouver dans cette situation là :
1/ Clic du joueur
2/ Execution de la requête de déplacement
3/ Execution de la requête de rafraichissement de la carte
1'/ Clic du joueur
2'/ Execution de la requête de déplacement
3'/ Execution de la requête de rafraichissement de la carte
4'/ Retour de la requête de rafraichissement de la map
4/ Retour de la requête de rafraichissement de la map
Et dans ce cas, tu ne verras pas le point 4' tout simplement parce que même si il aura effectivement été executé, quelques milliseconde plus tard tu auras le 4 qui s'executera et ta carte (à jour) sera effacée par la version précédente. Mais le déplacement du joueur aura été enregistré ; et du coup, au déplacement suivant, il se déplacera en fonction de l'endroit où il se trouve actuellement, c'est à dire à une case de décalage de l'endroit où tu le vois avec ta carte pas à jour.
C'est à ça que je pense directement lorsque je vous un problème comme ça ; pour tester comme je t'ai dit, le mieux est de prendre firebug, de l'ouvrir en mode console, de reproduire le bug et ensuite de regarder les temps d'execution de tes requêtes Ajax, et d'additionner.
En théorie, avec ton code, tu devrais avoir :
1/ Clic du joueur
2/ Execution de la requête de déplacement
3/ Execution de la requête de rafraichissement de la carte
4/ Retour de la requête de rafraichissement de la map
1'/ Clic du joueur
2'/ Execution de la requête de déplacement
3'/ Execution de la requête de rafraichissement de la carte
4'/ Retour de la requête de rafraichissement de la map
Sauf que parfois (toujours même), il faut un certain temps pour que l'étape 4 se produise : le temps que ton serveur génère la carte, que le navigateur se connecte, qu'il la renvoi, etc... ce temps est très variable et ce, pour des raisons totalement diverses (un pic de p2p à un moment et pas à un autre, un mail qui passe sur ton serveur et le ralenti un peu d'un coup, n'importe quoi !). Et alors, tu peux te retrouver dans cette situation là :
1/ Clic du joueur
2/ Execution de la requête de déplacement
3/ Execution de la requête de rafraichissement de la carte
1'/ Clic du joueur
2'/ Execution de la requête de déplacement
3'/ Execution de la requête de rafraichissement de la carte
4'/ Retour de la requête de rafraichissement de la map
4/ Retour de la requête de rafraichissement de la map
Et dans ce cas, tu ne verras pas le point 4' tout simplement parce que même si il aura effectivement été executé, quelques milliseconde plus tard tu auras le 4 qui s'executera et ta carte (à jour) sera effacée par la version précédente. Mais le déplacement du joueur aura été enregistré ; et du coup, au déplacement suivant, il se déplacera en fonction de l'endroit où il se trouve actuellement, c'est à dire à une case de décalage de l'endroit où tu le vois avec ta carte pas à jour.
C'est à ça que je pense directement lorsque je vous un problème comme ça ; pour tester comme je t'ai dit, le mieux est de prendre firebug, de l'ouvrir en mode console, de reproduire le bug et ensuite de regarder les temps d'execution de tes requêtes Ajax, et d'additionner.