JeuWeb - Crée ton jeu par navigateur
[Résolu] Ajax limité ou bug ? - 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 : [Résolu] Ajax limité ou bug ? (/showthread.php?tid=4294)

Pages : 1 2 3 4


[Résolu] Ajax limité ou bug ? - Argorate - 21-08-2009

Ami du soir, bonsoir,

J'ai un petit souci: je suis en train de passer en Ajax sur mon jeu, notamment pour les déplacements sur la map.

Cela semble bien marcher mais je me suis rendu compte quand cliquant rapidement -pas comme un bourrin quand même-
1 fois sur 5 il ne me rafraichi pas la map.
Si je me redéplace alors il y a un bond de deux cases (la case dû au déplacement actuel + celui qui n'a pas était rafraichit).

Je me demande donc si ça vient du fait que trop de requête en peu de temps le perturbe ou s’il y a un problème dans le code?

Mon lien pour se déplacer comporte un onclick="test($i)"

Code :
function test(i)
{
    ajax(‘mouv.php?d=' + i , 'message_erreur'); message(); ajax('map.php, 'data');
}

Code :
//on rend le div de mssage d'erreur visible le cas échéant.
function message()
{
    if(document.getElementById('message_erreur').innerHTML != '') document.getElementById('message_erreur').style.display = 'block';
}

Code :
//********************************* AJAX *********************************
function ajax(nom_page, bloc)
{
    var xhr_object = false;
    var time = new Date();
    var test = nom_page.indexOf("?", 0);

    if(test>0) test = '&t='+time.getTime();
    else test = '?t='+time.getTime();
    
    if(window.XMLHttpRequest) xhr_object = new XMLHttpRequest(); // FIREFOX
    else if(window.ActiveXObject) xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); // IE
        
    xhr_object.open('GET', nom_page + test, true);
    xhr_object.send(null);    
    
    xhr_object.onreadystatechange = function()
    {
        if (xhr_object.readyState == 4) document.getElementById(bloc).innerHTML = xhr_object.responseText;
    };
}

Quelqu'un a une idée brillante?^^


RE: Ajax: limité ou bug? - phenix - 21-08-2009

Il y a soit un "bug" dans le navigateur (je dirais une limitation plutôt) soit un bug dans ton script.

Pour faire une comparaison, je testerais avec une lib javascript (jQuery ou autre) pour voir si le bug persiste Smile


RE: Ajax: limité ou bug? - Ekilio - 21-08-2009

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.


RE: Ajax: limité ou bug? - Ter Rowan - 21-08-2009

ajax est asynchrone or ce que tu décris est justement une désynchronisation, je partage l'avis d'Ekilio sur les explications de ce qui se passe

j'estime donc que c'est un "bug" de ta programmation au sens ou c'est à toi de gérer cette "asynchronisation"


le mieux serait de stocker un état pour ce type de demande ('mouvement carte'), ou une file d'attente.

tant que le déplacement n'a pas eu lieu, tu ne demandes pas le suivant


l'autre possibilité étant de revenir en synchrone mais dans ce cas tu perds la fonctionnalité "tant que la carte n'est pas revenu, alors je peux cliquer sur autre chose" alors que avec mon système tu pourrais


RE: Ajax: limité ou bug? - NicoMSEvent - 21-08-2009

Excellente analyse, Ekilio Wink
J'ai eu ce problème... comment j'ai fait pour le contourner? Un déplacement sur ma carte prend 2 secondes (effet visuel de glissement, etc). Pendant ce temps, j'ai utilisé un "flag" (variable globale mise a "vrai", qui interdit un nouveau déplacement). Lorsque le déplacement est fini, ce "flag" est remis a "faux". Donc, je n'ai plus ce problème de double déplacement. L'appel ajax prends maximum 0.3 sec, donc, je suis couvert pendant 6x le temps d'une exécution normale ^^


RE: Ajax: limité ou bug? - guile - 21-08-2009

Vous avez déjà utilisé un outil qui vous paralyse à chaque chargement?

Le jeu Continent utilise une technique "similaire" à Ajax (le grand Zumba, via Cobaye m'avait dit que ce n'était pas vraiment de l'Ajax, je le crois moi) et pour sa map, quand on va vite pour se déplacer, ça se déplace vite.

Oui, bloquer les contrôles de l'utilisateur est une solution facile, mais pourquoi ne pas prendre en compte cette "rapidité" de manière plus ergonomique?
Par exemple, en proposant réellement un double glissement.

Quand on commence à taper dans l'asynchrone, il faut assurer à fond. La solution parait complexe, mais elle sera séduisante à celui qui la réalisera.


RE: Ajax: limité ou bug? - Argorate - 21-08-2009

C'est bien ce que je pensais, Ajax a un peu du mal a suivre Smile

Je vais voir de mettre en place le système de "flag" pour enrayer le problème, thx.

EDIT: le truc c'est que j'ai retesté: j'ai remaqué que des fois je clique: aucun rafrech, j'attend un peu, rien. Et si je reclick il me refait un bon de 2 cases. pourtant là il n'y a pas eu "deux clicks à traiter en meme temps" si je peux dire, je ne comprend pas pouruqoi il ne n'a pas charger la map au bout du compte?...


RE: Ajax: limité ou bug? - Ekilio - 21-08-2009

Est-ce que tu as firebug ? Si oui, que dis l'onglet console ? Qu'est-ce qui a été envoyé ? La dernière version te permet également de débugguer ton script en mettant un point d'arrêt sur une expression, est que tout s'execute ? Si non, regarde où s'arrête l'execution : tu as une erreur javascript là.


RE: Ajax: limité ou bug? - Argorate - 21-08-2009

J'ai pas firefox 3. donc je ne peux pas avoir la derniere version de firebug.

J'ai lancer, et il me fait bien les deux fonction ajax. le truc c'est que quand ça bug, l'execution du deplacement et plus longue que quand ça bug pas. Donc je pense qu'en fait le rafech de la map se fait alors que le mouvement n'a pas était finit. Sad


RE: Ajax: limité ou bug? - naholyr - 21-08-2009

En même temps, si tu passais la destination en paramètre, et pas une direction, le double clic n'aurait aucun impact...