JeuWeb - Crée ton jeu par navigateur

Version complète : [Alerte Ajax]
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Bonjour,

Le truc est tout con, mais je galère (étonnant).

/me place le décor.

Un module de combat, tout bête.

Mettons que le joueur 1 décide d'attaquer le joueur 2. Il passe par un formulaire, qui l'envoi sur une page d'attente de 15 secondes, puis ça démarre le combat.

Du coté du joueur 2, une alerte/un bouton clignotant/message défilant s'affiche sur sa page en cours, l'avertissant que Joueur1 veut lui latter la tête. Il clic sur un lien et se retrouve de son propre coté, dans un formulaire démarrant le combat.

Niveau formulaire/requetes/bdd, tout est ok. Idem pour le timer. Mais je galère à faire la fonctionnalité du "Clic Joueur 1" = "Alerte sur page Joueur 2".

En théorie (et si je ne me trompe pas), Ajax est à même de faire ça.

Oui, mais comment ?

Des idées ?
faut que le navigateur du joueur 2 demande à intervalle régulier si un autre joueur (le 1 ici) souhaite un combat
Ajax: toute demande d'information doit venir du client... le serveur ne peut rien envoyer de sa propre volonté.

Donc, perso:
joueur 1 : signale sa demande, qui est stockée dans une table de la BDD (au hasard)
joueur 2: son navigateur vérifie régulièrement si une demande le concernant existe ou non. Si oui => refresh, et en avant...
C'est aussi ce qu'on vient de me proposer comme solution. Je vais donc voir comment faire tout cela, Ajax n'étant pas mon fort.

Je pense revenir sous peu vous embetter ^^ Merci en tout cas pour la piste.
(30-03-2009, 02:59 PM)Ruz a écrit : [ -> ]Donc, perso:
joueur 2: son navigateur vérifie régulièrement si une demande le concernant existe ou non. Si oui => refresh, et en avant...

Pour vérifier régulièrement, comment procéder en fait ?

Actuellement, je suis partis sur ça :
- Une div présente sur toutes les pages du site
- Le contenu de la div est généré par XMLHttpRequest qui y insère une page Php, de laquelle est effectuée une recherche dans la bdd de nouveaux évènements
- Le contenu de la div est actualisé à intervalle régulier par un setTimeout

- Si réponse à la requete sql ==> on affiche un nouveau contenu dans la div avec un lien menant vers le combat
- Si réponse négative ==> aucun changement, la div n'affiche aucun contenu

En fait, j'ai de sérieux doutes quand à ma façon de procéder.
Erase > ce que tu écris me semble correcte.

Cependant, 15 secondes me semble bien cours. j'imagine que ça sera paramétrable et que la valeur "15" était un exemple ^^

kéké qui n'est pas tellement plus fort en AJAX ^^
Je pense avoir résolu mon petit soucis. A titre informatif, voici comment j'y suis parvenu :

Chaque demande de combat d'un joueur s'insère dans ma bdd.
Une page extérieur (ici, evenement_combat.php) qui check la table à la recherche de nouveaux évènements concernant un personnage donné.
Une page d'affichage (à terme toutes les pages du sites, dans l'exemple, ma page index.php) avec la div ayant un refresh toutes les secondes, appelant ma page evenement_combat.php


Page index.php
(contenu à élargir à chacune des pages, où s'affiche l'alerte d'attaque)

Code :
<script type="text/javascript">
function Ajax(){
var xmlHttp;
    try{    
        xmlHttp=new XMLHttpRequest();// Firefox, Opera 8.0+, Safari
    }
    catch (e){
        try{
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer
        }
        catch (e){
            try{
                xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e){
                return false;
            }
        }
    }

xmlHttp.onreadystatechange=function(){
    if(xmlHttp.readyState==4){
        document.getElementById('page').innerHTML=xmlHttp.responseText;
        setTimeout('Ajax()',5000);
    }
}
xmlHttp.open("GET","../evenement_combat.php",true);[i]//* Appel de la page qui figurera dans la div "page" *//[/i]
xmlHttp.send(null);
}

window.onload=function(){
    setTimeout('Ajax()',1000);
}
</script>


<div id="page" ></div>
euh.. refresh TOUTES LES SECONDES????
T'as pas peur... t'as un bon serveur derrière???

100 joueurs (chiffre faible, je connais pas le site, ni son but, ni son objectif membres), toutes les secondes qui demandent une connection à la BDD + select + fermeture connection et transfert HTML du résultat, en permanence

Achète déjà les rames au serveur, va lui en falloir...
Non, augmente la durée entre deux refresh, sinon, je crains quand meme qu'il ai quelques difficultés.

Pour la méthode, ca me semble réalisable et correct... reste à voir l"implémentation, et les améliorations possibles (système de cache? idée rapide: ID unique pour chaque demande, qui s'incrémente et stocké dans un fichier à chaque mise à jour. Ta page va pas voir dans la BDD de base (sauf premier passage) => tu gardes l'ID le plus élevé à la dernière demande en mémoire (JS)... Chaque demande, tu lis le fichier, si ID identique => fin. Si changement => tu vas lire la table) Ca devrait déjà t'économiser pas mal de connections inutiles ^^)
PS: j'ai pas regardé ton code, trop fatigué... (mais ca marche si j'ai suivi ^^)
Je confirme, j'ai le serveur qui suit derrière. (et le code confirmera que j'ai misé plutot sur 5 secondes au lieu d'une seconde ^^)

Smile


Et niveau bdd en fait, les requêtes sont minimisées. Je ne sais pas si certains connaissent (et j'avoue que l'alcool m'empêche de rentrer dans des détails approfondis), mais ma bdd va etre super allégée, vu que nous fonctionnons avec une association bdd/xml. En gros (et pour faire très simple), nous avons deux bdd. Une qui se contente de contenir des chemin vers des fichiers xml, et une autre générée dynamiquement.

En gros, chaque requete donne, par exemple pour une instance de combat :

Début combat ==> requête vers bdd pour checker un chemin vers fichier XML ==> traitement sur le fichier xml de la requete et retour des éléments appelés sur la bdd dynamique ==> arrivée et traitement bdd dynamique

Une fois l'utilisation/modifications faites, on fait le même 'chemin' mais en sens inverse.

Et pour ceux qui se posent des questions niveau rapidité/sécurité, jettez un ptit coup d'oeil dans quelques sources : les résultats sont assez impressionnants

Smile

A titre informatif, l'alpha test avec une centaine de joueur n'a posée aucun problème avec ce systeme.

*retourne picoler*
arf, oki ^^
Si t'as des infos complémentaires sur ce genre de système, ca m'intéresse (chercherai des infos quand je trouverai du temps ce soir ^^)