JeuWeb - Crée ton jeu par navigateur
action a effectuer - 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 : action a effectuer (/showthread.php?tid=908)

Pages : 1 2


action a effectuer - max - 06-03-2007

bonjours, j'ai un problème qui me bloque vraiment... je ne dois pas avoir assez de conaissances (on a jamais fini d'aprendre hein Wink)
bon alor, j'ai un formulaire d'envoi de flotte (je sais calculer la distance d'une planète a une autre, le temps de parcour en fonction de la vitesse des vaisseaux et tout et tout) tout ca marche! j'ai meme une "reactualisation" javascript de la page quand la flotte arrive ou revien, j'ai le compte a rebour dynamique en javascript! mais (et je m'en doutait) ca ne marche pas quand l'utilisateur est deconecté et donc que le session_start est mort
c'est assez genant parceque lorsqu'on lit "la flotte arrive dans 1/4d'heure", qu'on revien 1/2h après et que la flotte vien juste d'arriver c'est assez frustrant...

en fait tout marche que lorsque le joueur est connecté et sur la page correspondante... je peu un peu regler le pb en mettant le script sur chaque page mais ca ne règle pas le problème du script qui ne fonctionne pas quand le session_start est mort...

voila moi je n'ai plus d'idées

merci


RE: action a effectuer - Sephi-Chan - 06-03-2007

En fait c'est normal que le temps soit erroné si le temps est géré par JS.

Il y à (mais je ne l'ai jamais testé) un moyen de redéfinir le délai d'expiration d'une session : session_cache_expire()

Tu peux fouiller un peu sur PHP.net : Sessions (en particulier dans les directives) pour voir un peu ce que tu peux faire (ou pas) avec les sessions.

Peut-être par ici : session_set_cookie_params

Je rappelle que ce que j'écris là ne sont que des pistes que je n'ai jamais expérimentées.


Sephi-Chan


RE: action a effectuer - denisc - 06-03-2007

C'est parce que tu gères tout en temps réel.

Je suppose que si le joueur se trouve sur une autre page de ton site, là où le compte à rebour n'est pas affiché, au moment de l'arrivée, la flotte prends aussi du retard!

Pour gérer ce genre de système, c'est assez complexe en fait... Et c'est très bien fait sur le modèle OGame (Mort aux Officiers Tongue).
Il faut en fait que le système s'autogère au moment où tu faits tes demandes d'information.

Explication simple:
Tu envoies ta flotte à 8:00 elle arrive à 9:00 sur sa cible et revient à 10:00
A 8:10, tu te déconnectes... et tu reviens à 10:13.
Entretemps, à 9:25 tu t'es fait attaqué (pas de bol).

Et bien à 10:13, il faut passer en revue tout ce qui s'est passé avant d'attaquer la partie affichage au joueur :

8:10 ... lastupdate joueur
9:00 ... gestion de l'attaque sur la cible
=> Calculer les ressources de la cible
=> Gérer l'attaque
=> Si attaquant gagne, piquer 50% des ressources ou le volume total transportable par la flotte
=> Actualiser le lastupdate du joueur cible
=> Démarrer le retour de flotte
9:25 ... gestion de l'attaque subie
=> Calculer les ressources du joueur depuis 8:10 (=> augmentée de 1:15 donc)
=> Gérer l'attaque
=> Si attaquant gagne, retirer 50% des ressources ou le volume total transportable par la flotte
=> Actualiser le lastupdate du joueur
10:00 ... retour de flotte
=> Ajouter les ressources piquées aux ressources de la planète
=> Ajouter les vaisseaux de la flotte aux vaisseaux de la planète

Voilà pour tout ce qui est a fait AVANT d'afficher la page du joueur
Maintenant pour afficher la page, il faut...
=> Calculer les gains de ressource depuis le dernier lastupdate => 10:13 - 9:25 = gains pour 48 minutes
=> Fixer le lastupdate à 10:13
=> Afficher la page demandée au joueur.


RE: action a effectuer - max - 06-03-2007

ha oui quand meme ca en fait des choses... mais bon tout les jeux de simulation spatiale sont en temps réel, je ne peu pas y echaper je pense!

donc pour vous deja la solution principale serai de rendre "casiment infini" le temps avant expiration du sessions_start.
Ensuite entre chaque interaction avec un autre joueur il faut refaire une liste de verifications (si on a finit de construire un batiment, si on a transferé des ressources, si on a été attaqué, gain de ressources) puis effectuer l'action prévue. j'ai bien compri?

mais j'ai aussi un autre pb... je vous post une petite partie de mon script facilement compréhensible:

Code PHP :
<?php 
if ( $tps_retour==NULL and $tps_aller!=NULL) // si la flotte est arivée
{?>
<SCRIPT LANGUAGE='JavaScript'>
<!--
function redirect() {
window.location='mouvements.php'
}
setTimeout('redirect()',<?=$aller_rebour*1000;?>);
-->
</SCRIPT>
<?php
if ($aller_rebour <= 0){
$time_retour=mktime()+$durer;
mysql_query("UPDATE mouvements Set tps_aller='' , tps_retour='".$time_retour."' where `pseudo`='".$pseudo_membre."'") or die (mysql_error());
}
}


c'est en fait la condition if ($aller_rebour <= 0) qui me gène car meme si le session start est encore existant, que le joueur est connecté mais qu'il est sur une autre page, les variables ne sont pas réactualisées (pas de reactualisation de page, meme pas celle en JS vu qu'on est sur une autre page) et la condition ne s'effectue que lorqu'on retourne sur la page...

j'arrive dans le php vachement pointu j'ai l'impression non? ^^ (en tout cas c'est peut etre pas pointu pour vous mais pour moi... oui lol)


RE: action a effectuer - denisc - 06-03-2007

Le problème proviens à mon avis plus du JS que du PHP là... C'est le JS Qui fait la mise à jour de l'affichage... Le PHP n'y est pour rien!

et, s'il te plait, met des ; après tes commandes JS... Même si dans ce cas ce n'est pas nécessaire, il est préférable d'en prendre l'habitude Wink

Nous nous trouvons sans doute devant les petits soucis du JS...
Ta fonction setTimeOut ne compte peut-être pas correctement!
Juste pour savoir, tu n'affiche pas un compte à rebours sur la page du client, avec un autre setTimeOut qui réactualise un span ou un div quelque part???
Si c'est le cas, cherche pas plus loin, ton premier setTimeOut est overrided par les autres!
Sâches aussi que, quoi que tu fasses, le temps s'écoulera TOUJOURS moins vite à travers tes fonctions JS que dans la réalité!
exemple qui explique???
Je veux actualiser l'affichage du compte à rebours toutes les secondes
Je met donc un setTimeOut('Refresh()',1000);
Ma fonction Refresh() fait les tâches suivantes:
->récupère le temps restant dans mon div caché (1 à 10ms suivant la vitesse du PC)
->retranche 1 et le remet dans le div caché (1 à 10ms)
->Formatte ce temps en h:mConfused (1 à 5ms)
->Affiche le temps restant dans le div visible (1 à 10 ms)
->Affecte un nouveau setTimeOut('Refresh()',1000); si le temps restant est > à 0 (2 à 50ms)
Soit un total de 1000 + 1|10 + 1|10 + 1|5 + 1|10 + 2|50
donc 1006 à 1085ms
Pour pallier au problème on utilise un setimeOut à 975ms


RE: action a effectuer - max - 06-03-2007

"Juste pour savoir, tu n'affiche pas un compte à rebours sur la page du client, avec un autre setTimeOut qui réactualise un span ou un div quelque part???" BINGO c'est exactement ca!
mais questceque je peu faire pour remplacer un des 2 setTimeOut?et questcequi les fait buguer en fait? j'ai besoin des 2: un pour le compte a rebour dynamique et l'autre pour la reactualisation JS... (sinon pour le pb du decalage de quelque milisecondes c'est pas trop grave je pense...)

"Le problème proviens à mon avis plus du JS que du PHP là... C'est le JS Qui fait la mise à jour de l'affichage... Le PHP n'y est pour rien!" je ne parle pas de ca mais sans reactualisation de la page, quand le temps est écoulé, je regarde dans la bdd et aucune info n'a changé, c'est pas un pb d'affichage là nn?


RE: action a effectuer - denisc - 06-03-2007

OK, pour le JS, pas de solution... Désolé! Tu ne peux avoir qu'un seul setTimeOut Sad

Pour le PHP... pas assez d'infos concernant le fichier php ET la structure de la table dans la base de données.


RE: action a effectuer - Roworll - 07-03-2007

Un seul setTimeout()... par page ?
J'ai déjà utilisé des pages avec plusieurs setTimeout() déclenchant chacun leur propre fonction et tournant en parallèle sans aucun probléme.

Je viens même de retester avec deux setTimeout() et ça marche très bien.
Code PHP :
<?php 
<div id="elemA">setTimeout 1 : </div>
<
div id="elemB">setTimeout 2 : </div>

<
script language="javascript">
function
funcA(){
setTimeout('funcA()',1000);
document.getElementById('elemA').innerHTML+='*'
}

function
funcB(){
setTimeout('funcB()',3000);
document.getElementById('elemB').innerHTML+='*'
}
setTimeout('funcA()',1000);
setTimeout('funcB()',3000);
</
script>

Aucun soucis d'override (excepté ce petit décalage temporel expliqué par Denisc).
Les deux divs se remplissent de petites étoiles, le 1e toutes les secondes et le 2e toutes les 3 secondes.


RE: action a effectuer - denisc - 07-03-2007

Ca doit marcher sur FF et IE7... Mais sur IE6, Safari, Opera... Ca fonctionne pas!


RE: action a effectuer - Roworll - 07-03-2007

Bin testé sur FF 2, IE6, Opera 9 avec juste un copié/collé du code que j'ai mis et aucun soucis.
Tout fonctionne bien, les zones se remplissent à intervalles réguliers.

Safari par contre.. j'en sais rien.