JeuWeb - Crée ton jeu par navigateur
[Résolu] Temps réel d'une action sur un jeu navigateur - 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] Temps réel d'une action sur un jeu navigateur (/showthread.php?tid=7526)

Pages : 1 2


RE: Temps réel d'une action sur un jeu navigateur - Xenos - 15-12-2015

Par exemple:


<form action="sorts/jeter" method="POST" class="jeter-sort">
<input type="hidden" name="token" value="..."/> <!-- CSRF mais à voir après -->
<select name="sort" required="required" class="choix-sort">
<option value="geler">Geler</option>
<option value="noyer">Noyer</option>
</select>
<input type="submit" value="Jeter le sort!" class="envoyer-sort"/>
</form>

Coté serveur

<?
// Check CSRF
// Check si le joueur peut lancer le sort
// Lancer le sort
// Renvoyer le résultat
?>
<html>
...
</html>

Et on surcouchise:

<?
// Check CSRF
// Check si le joueur peut lancer le sort
// Lancer le sort
// Renvoyer le résultat

if (responseJson) { // On me demande une réponse JSON
header('application/javascript'); // Pas sûr de celui-là
echo "{ success: true, duration: 100 };";
// Ou false, suivant si le sort a été lancé, et d'autres data si besoin
// Duration = temps d'attente avant le prochain sort
return;
}

if (responseHtml) { // Réponse HTML directe
echo "<html>...</html>";
}

if (postRedirectGet) { // Post Redirect Get
header('Localtion: ...');
}
?>

En pratique, je ferai 1 classe par contenu "if", implémentant toute la même interface (IOutputable par exemple) et j'instancierai la bonne classe en fonction des paramètres de la requête (surement dans une factory), pour utiliser l'instance à la fin du code PHP.

Et coté client, du JS qui masque le bouton (dans un .js séparé):

document.querySelector('.jeter-sort').addEventListener('submit', function () {
var callback = function (data) {
document.querySelector('.envoyer-sort').setAttribute('disabled', 'disabled'); // Grisé, on peut aussi le faire sur le select suivant ce qu'on veut
setTimeout(data.duration, function () {
document.querySelector('.envoyer-sort').removeAttribute('disabled'); // dégrisé
}); // Je ne suis jamais sûr de l'ordre des paramètres
};
// Gérer soi-même l'envoie et la réception du formulaire via XHttpRequest natif
// sinon y'a du jQuery qui le fait (j'aime mieux le natif, ça évite les codes "rétro" qui trainent)
});

Si un block de code est "trop complexe à gérer", tu peux alors utiliser des libs qui le facilite (typiquement jQuery, mais faut en avoir besoin, faut pas se ruer dessus juste parce que le nom commence par jMachin).

L'avantage est d'avoir alors un site plus sécurisé (puisque t'as codé les checks PHP ou autre langage d'abord, et mis la couche client JS après; même si ce n'est pas forcément suffisant), modulaire (si chaque "couche" a été codée sans exploser les précédentes) donc interchangeable et évolutif (si une couche est rendue obsolète par une nouvelle norme, genre CSS3 qui a rendu pas mal de JS de présentation inutile, il suffira de supprimer cette couche, sans se traîner de bouts de code mort).


RE: Temps réel d'une action sur un jeu navigateur - Sôbi - 15-12-2015

Hum hum ...
J'ai oublié de préciser certaines choses je pense ah ah x')

Tout d'abord, merci pour cet exemple Big Grin

Il faut savoir que je suis dans un ancien format de PHP, c'est à dire qu'il n'y a pas de notion d'objet/classe/etc... ^^"
Pourquoi ?! car j'ai du mal à associé le php à l'objet. Le java, je veux bien le concevoir mais j'ai toujours eu du mal avec PHP... Ah ah x')

Je ne comprend pas certaines choses ... 
1. La surcouche arrive à quel moment ? 

2. Je comprend pour la "Duration". Mais faut bien la stocker quelque part non ?


RE: Temps réel d'une action sur un jeu navigateur - Xenos - 15-12-2015

L'implé PHP peut être objet ou non, là, j'ai justement donné un vrac qui ressemble plus à du procédural qu'à de l'objet (d'où mon rajout, derrière, disant "en pratique je ferai ça en objet").

La surcouche arrive une fois que la demande se fait sentir: à l'usage, tu verras peut-être que valider le formulaire, attendre que le serveur t'envoie chier et recommencer n'est pas ergonomique (si cela se trouve, personne ne te remonteras ce problème, auquel cas tu t'épargnes le code de surcouche). Là, tu mettras une solution en place (pas forcément celle proposée d'ailleurs).

Pour moi, le stockage se ferait en BDD, avec une indication de temps (la date à partir de laquelle le sort peut de nouveau être lancé), soit associée au joueur (si le joueur ne peut pas lancer 2 sorts en même temps, l'indication est donc la date de lancement du prochain sort) soit associée au joueur+sort (si le joueur peut lancer des sorts en chaîne, mais ne peut pas lancer le même plusieurs fois de suite).

D'autres gameplays peuvent aussi faire intervenir des "points de magie": le joueur en gagne X par seconde, la BDD indique combien il en a à une date T (X(T)), et le serveur fait le calcul pour savoir combien le joueur en a à tout instant (donc, à la date t, le joueur a x(t) = X(T) + (t-T)*X). En ce cas, c'est une formule, souvent PHP mais perso je la collerai surement dans une procédure MySQL, qui permet de savoir quand le sort truc sera lançable.


RE: Temps réel d'une action sur un jeu navigateur - Sôbi - 15-12-2015

Je te remercie énormément pour ton aide, ainsi que l'avis de Ter Rowan ! Smile


Une petite question me taraude à présent. Tu as parlé de procédure MySQL ... 
Je présume que ce n'est pas un "select * etc..."

Si en effet c'est pas le cas, alors qu'est-ce q'une procédure MySQL ? Comment en programmer une ?
( Si tu préfères mettre un lien vers des tutos, je comprendrais Wink


RE: Temps réel d'une action sur un jeu navigateur - Xenos - 15-12-2015

Tu trouveras les tutos tous seul comme un grand sur google https://duckduckgo.com/ Smile

Dans l'idée, c'est une fonction stockée qui permet de se servir du SGBD comme d'une API, en remplaçant des requêtes SQL SELECT ... FROM ... LEFT JOIN ... (perdues dans des chaines String PHP) par des appels type CALL getMapCaseFromXyCoordinates(?, ?) que je trouve d'une part plus explicite, et d'autre part plus abstrait (au sens où cela découple le PHP du serveur SQL et du langage SQL en général).

PS: et cela évite les horreurs type "SELECT * FROM ... WHERE ... IN (" . str_repeat("?", count($myIds)) . ")" qu'on croise régulièrement ici au boulot et qui dégomment les performances.


RE: Temps réel d'une action sur un jeu navigateur - Sôbi - 15-12-2015

Ok, je te remercie Smile

Je vais voir cela. J'me disais si tu avais déjà des liens prédéfinis autre qu'un moteur de recherche :p
Mais je vais chercher comme un grand, comme tu dis.
Je reviendrais au pire des cas (a) ah ah !

Encore merci pour l'explication rapide et pour ton aide Smile