JeuWeb - Crée ton jeu par navigateur
[Résolu][Javascript] Fonction sleep ? - 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][Javascript] Fonction sleep ? (/showthread.php?tid=3719)

Pages : 1 2


[Résolu][Javascript] Fonction sleep ? - Argorate - 23-02-2009

Bonjour,

Je recherche un moyen de contraindre l'ordi a faire des pause en JavaScript.
Je voudrais savoir si vous avez mieux a proposer que certains scripts que j'ai trouvé, du style boucle infini durant le temps choisit:

Code :
function pause(millisecondi)
{
    var now = new Date();
    var exitTime = now.getTime() + millisecondi;

    while(true)
    {
        now = new Date();
        if(now.getTime() > exitTime) return;
    }
}

N'y aurait-il pas une vrai fonction sleep()? un moyen "officiel" de dire au PC arrête d'exécuter des choses pendant X temps, ou n'exécute la prochaine instruction qu'au bout de X temps?

Inutile de me parler de setTimeout() ou autre, il ne s'agit pas ici d'appeler une fonction...

vilou, merci.


RE: Fonction sleep en JS? - Allwise - 23-02-2009

Si tu as déjà cherché, tu as dû te rendre compte qu'il n'y avait pas de fonction équivalent à sleep en javascript.
Pourquoi ne pas utiliser setTimeOut ? Qu'est-ce qui t'empêche de placer ton code dans une fonction ? Cette fonction est prévue pour ça. Contrairement à un langage strictement procédural, t'as des événements en javascript, des objets, des callback... Tout ça se prête plutôt bien à l'utilisation de cette fonction.

J'ai jamais testé cette méthode que tu proposes en javascript mais ça risque d'être lourd pour le navigateur non ?


RE: Fonction sleep en JS? - Argorate - 23-02-2009

je ne peux pas utilisé setTimeout Wink

si j'ai une 20ene d'instructions différentes et que je veux des sleep() entre chaque, je ne vais pas m'amuser a faire 1 instruction <=> 1 fonction sinon on ne s'en sort plus...


RE: Fonction sleep en JS? - Allwise - 23-02-2009

Bien entendu. Après tout, un setTimeout et un sleep ne font pas la même chose. setTimeout lance une (série d')instruction à un instant T. Un sleep bloque l'exécution du script pendant toute la temporisation. Le gars ne peut plus rien faire sur sa page, il doit juste attendre. J'espère que les temps d'attentes que tu envisages dépassent pas la seconde, ça pourrait vite devenir déroutant sinon... Avoir une page freezée, cliquer partout et n'avoir aucun résultat ^^

En théorie, si tu as bien pensé tes développements, tu temporises des actions, ou même plusieurs actions, mais qui peuvent être factorisées dans une fonction / méthode d'un objet.
Même si tu as 20 instructions à temporiser, ça peut pas se résumer à des trucs genre bougerPerso, ouvrirFenetre, deplacerSprite, afficherMessage, des trucs bien génériques quoi ?
Sinon, tu peux peut-être nous en dire plus sur ces fameuses instructions qui ne peuvent être mises en fonction ?



Et pour info, t'es pas obligé de mettre une fonction dans setTimeout. Tu peux mettre une ou plusieurs instructions dans le premier argument de setTimeout, mais au delà d'une ou deux instructions, c'est très gitan Wink


RE: Fonction sleep en JS? - Hakushi - 23-02-2009

Comme tout langage Ecma based, JS n'a pas de fonction sleep() , il en est de même pour Flash, et je n'ai trouvé aucun equivalent, que ça soit en JS ou en As3, seul l'utilisation de Timer (en AS3) ou de setTimeout() te permet de créer des delais dans ton application.

L'utilisation d'un while() est une tres mauvaise pratique et peut faire crasher le navigateur.


RE: Fonction sleep en JS? - Argorate - 24-02-2009

En faite c'est exactement ça Allwise, l'utilisateur ne peut plus rien faire, à la manière d'une "cinématique" pour les jeux, j'aimerais qu'une suite d'événement se produise dans un ordre donnée, que le PC est la main, et que le joueur regarde juste se qu'il se passe (il reprendra le controle a la fin de cette "cinématique")
Il faut par exemple : l'affichage d'un texte dans une bulle(juste un display d'un div a changé) puis il faut laisser quelques secondes (le temps que le joueur puisse lire le dialogue [d'où mon besoin de faire "sleep()" !]) et ensuite remettre le diplay none, et qu'ensuite il se passe autre chose, style le(s) perso(s) bouge(nt) tout seul, mais pas trop vite, de manière que le joueur puisse voir le mouvement de case en case, donc entre chaque déplacement il faudrait un sleep de quelques millisecondes etc...

Donc je ne sais pas comment faire...?


RE: Fonction sleep en JS? - Allwise - 24-02-2009

Tu peux donner la main à ton jeu tout en laissant aux internautes le contrôle de leur navigateur.

Pour empêcher les internautes de pouvoir agir sur le jeu, cliquer ça et là, tu peux mettre une image transparente vide au dessus de tout le reste. Ça se fait beaucoup dans les scripts de galeries en javascript. Tu peux même mettre un fond un peu opaque pour "masquer le fond" et mettre l'emphase sur tes messages et tes actions. Dans ce cas, il faudra jouer avec les z-index.

Tu peux te faire une simple fonction, donc, pour mettre un masque sur toute la fenêtre à chaque fois que tu as besoin d'empêcher l'internaute d'agir, et pourquoi pas une icône cinématique, ou chargement dans un coin de l'écran pour indiquer aux internautes qu'ils n'ont plus la main ( vaut mieux le savoir que croire qu'il y a une couille dans le potage, c'est de l'ergonomie ).

Plus besoin de faire des sleeps, pas de risque de plantage du browser, et avec setTimeout, tu enlèves le masque quand tu veux. De plus, tu n'as aucune dépendance entre les actions de ton jeu : bougerPerso, afficherBulle... et la fonction afficherMasque, que tu peux utiliser à toutes les sauces. Tu peux même la mettre en callback de tes autres actions. dans beforeMovePerso, tu affiches ton masque, dans afterMovePerso, tu le caches, et le tour est joué Smile.


RE: Fonction sleep en JS? - Argorate - 24-02-2009

Je pense que j'ai mal exprimé la chose. Confused

Le problème n'est en aucun cas que le joueur n'est pas le contrôle, rien de plus facile, pas besoin de s'embêter avec un filtre ou quoi, il suffit qu'il n'y est aucune interactivité possible (aucun lien, aucun onclick, onmouseover etc), se qui fait que le joueur pourra clicker mais il ne se passera rien.

Tu dis que les actions sont indépendantes c'est pas tout fait vrai, puisqu'il y a un ordre dans l'accomplissement de ses taches.
Mais le problème n'est toujours pas résolu:

Admettons la suite d'action suivante (au pif) à effectuer:
-document.getElementById('dialogue1').style.display = 'block';
-document.getElementById('dialogue1').style.display = 'none';
-document.getElementById('x14y16').innerHTML = '<img src="images/vide.gif" border="0">';
-document.getElementById('x14y15').innerHTML = '<img src="images/perso/perso.gif" border="0">';
-document.getElementById('x14y15').innerHTML = '<img src="images/vide.gif" border="0">';
-document.getElementById('x13y14').innerHTML = '<img src="images/perso/perso.gif" border="0">';
-document.getElementById('dialogue2').style.display = 'block';
-document.getElementById('dialogue2').style.display = 'none';
etc...

Le problème étant qu'il faut donc un intervalle de temps entre chacune de ses actions pour que l'internaute est le temps de tous voir.

Et comme je l'ai dit, je ne peut tout de même pas m'amuser à faire 1 fonction par instruction! Donc??


RE: Fonction sleep en JS? - Anthor - 24-02-2009

Je vois vraiment pas ou se situe ton problème avec le setTimeOut dans cette suite d'action.

http://neilmix.com/narrativejs/doc/index.html


RE: Fonction sleep en JS? - Argorate - 24-02-2009

Oui, donc une solution consisterais a faire une fonction qui s'appelle elle même avec en paramètre l'étape où on en est, mais cela revient a conditionner chacune des instructions:

je reprend ton exemple d'IRC:
Code :
myFunction (etape)
{
  swith(etape)
  {
    case 1:
    document.getElementById('dialogue1').style.display = 'block';
    setTimeout(myFunction(2), 1000)
    break;

    case 2:
    document.getElementById('dialogue1').style.display = 'none';
    setTimeout(myFunction(3), 800)
    break;
    etc.
  }
}

Mais j'aimerais savoir s'il n'y a pas manière a faire plus simple.