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


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

Citation :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 virerais tous les callbacks présents sur ta page pour les remettre ensuite ? Pfiou t'es courageux toi ^^

Le bref aperçu de code que tu donnes confirme bien que tu ne structures rien, t'envoies tout en block : pas d'objet, pas de fonctions... Ca peut marcher mais comme tu t'en rends compte, c'est source de problèmes, à un moment ou à un autre.

Bon sinon, une solution crade mais qui marcherait :
Code :
var delay = 1000;

setTimeout("document.getElementById('dialogue1').style.display = 'block'", delay);
delay += 1000;

setTimeout("document.getElementById('dialogue1').style.display = 'none'", delay);
delay += 1000;

setTimeout("document.getElementById('x14y16').innerHTML = '<img src=\"images/vide.gif\" border=\"0\">'", delay);
delay += 1000;
...

Tu vas me trouver lourdingue mais j'insiste, factorise ton code, tu vas pas t'en sortir sinon...

Un dernier truc : chez ExtJs, et peut-être d'autres FW JS, ils ajoutent une fonction au prototype Function, qui sert à retarder l'exécution d'une fonction.

Exemple tiré de leur doc :
Code :
var sayHi = function(name){
    alert('Hi, ' + name);
}

// executes immediately:
sayHi('Fred');

// executes after 2 seconds:
sayHi.defer(2000, this, ['Fred']);

// this syntax is sometimes useful for deferring
// execution of an anonymous function:
(function(){
    alert('Anonymous');
}).defer(100);



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

Pour se qui est d'empêcher le joueur d'intervenir, je pense que l'absence de bouton/lien et autres suffise, après je ne sais pas a quel callback tu fais références, mais si l'internaute touche outre se qu'un internaute standard touche, ce n'est pas de mon ressort. :non:

Ensuite, le code que j'ai mis est la pour résume l'idée, il est sortit d'une discution sur irc, et ce n'est même pas le mien Wink

Pour se qui est de la structure il y a au mieux dans le script une seul fonction donc pourquoi dire qu'il n'y en a pas? Et je trouverais stupide de s'embêter avec de l'objet pour des choses simples qui n'en ont pas besoin.
De pus le temps entre les instruction n'est pas constant ni croissant...

Sinon je n'ai pas suivit ton histoire de function qui retarde avec des alert partout? :heuuu:


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

Aïe aïe aïe...
Faire de l'objet est stupide ? Tout mettre dans une fonction c'est mieux ? Franchement tu me fais peur là. Tu devrais peut-être revoir tes ambitions de développement de jeu vidéo à la baisse et te former davantage... Autant se passer d'objet, ça peut tenir la route. On en a pas tout le temps besoin, et des langages ne s'y prêtent pas / mal. Autant, se passer de faire des fonctions, et dire que c'est stupide de faire de l'objet... Là j'ai du mal à te suivre.

Bon, soit je m'exprime mal, soit j'ai fait fausse route jusqu'à présent. Soit tu manques de recul en programmation pour comprendre des notions un chouilla abstraites Smile.

En gros, avec la méthodologie et le raisonnement que tu as :
- Tu dois copier / coller des instructions à chaque fois que tu en as besoin ( car pas de fonction )
- Quand tu veux modifier un "comportement", une action : tu dois la modifier autant de fois qu'elle se trouve dans ton code. Supposons qu'il y a 5 façons d'avoir un message à l'écran : le perso clique sur un npc, sur une maison, sur le bouton d'aide, le perso meurt, le perso passe un level. Tu vas devoir aller à chacun de ces endroits dans ton code et faire les mêmes modifs Confused
- Vu que tu fous tout dans un même fichier ( ce qui n'est pas un tort lorsqu'on passe en production, mais là le prob est d'ordre conceptuel ), c'est la grande joie pour s'y retrouver dans un grand nombre de lignes de code, toutes interdépendantes les unes des autres.
- Tu ne cherches pas à comprendre comment marche javascript, pourquoi la fonction sleep ne se prêterait pas à ton problème, pourquoi il y a une fonction setTimeout, pourquoi c'est pas comme PHP, pourquoi il faut éviter les boucles while bloquantes. Donc forcément, ta paresse te conduit dans des impasses où il faudra toujours utiliser des rustines pour t'en sortir.

Ce ne serait pas plus simple d'avoir des fonctions moveTo, afficherMsg, cacherMsg etc ?

Le premier bout de code que j'ai posté avec setTimeout, ne répond-il pas néanmoins à ta problématique ?

Le deuxième bout de code parle d'une fonction qui retarde les fonctions. Comme setTimeout, sauf que c'est plus propre, plus lisible. L'exemple parle de fonction anonyme donc c'est pas génial. Mais en gros, au lieu de faire
setTimeout("maFonction('test')", 200);
Tu fais
maFonction.defer(200, ['test']);
Defer est ajouté au prototypes des fonctions, on le retrouve donc dans toutes les fonctions.

Et vite fait, pour le premier point :
J'ai cru comprendre que dans ton jeu, le joueur pourra cliquer avec sa souris, comme c'est le cas presque partout sur Internet. Donc je trouvais ça bizarre de "désactiver les liens" comme solution pour l'empêcher d'interagir avec le jeu. Parce qu'après faut réactiver les liens. Mais décidément, on n'a pas la même conception des choses. Je respecterai la tienne quand tu mettras ton jeu en ligne...

Mais je te souhaite tout de même bonne chance pour la suite, et je continuerai à te marteler le cerveau pour que tu factorises ton code Smile


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

J'avoue que je n'ai pas saisie ton raisonnement et d'où tu tire de tel conclusion, mais en attendant, tu m'a fait bien rire ^^

Faire de l'objet dans notre cas, oui c'est totalement stupide/inutile/non adapté au probleme! Je ne comprend même pas pourquoi tu y a fait référence, cela prouve je pense que tu as mal perçu le présent sujet.

J'ai trouvé ta démarche pédagogique très drôle, mais tes jugements personnel infonder un peu irritant! Tu tires des conclusions hâtives sur ma manière de coder dont tu ignore tout.
Bien que je n'ai absolument rien a te prouver, juste pour te rassurer:
Je n'ai ni "foutu" tout dans le même fichier, et je n'en suis plus a écrire 20 fois les même choses et a devoir toutes les modifier a chaque fois... Wink
Que tu te permette de dire que je ne cherche pas a comprendre mon propre problème et en quoi la fonction sleep() y répondais a était le summum du comique, j'avoue Big Grin
Encore une fois, cela me prête a penser que tu as mal saisie le problème puisque la fonction sleep() si elle existait, serait le solution par excellence en mon cas.

Bon, pour en finir avec la « non interactivité »: Apparemment par manque d'imagination, et peut être parce-ce que j'ai mal exprimé la manière dont je le voyais, tu ne conçois pas la chose...
Je vais une dernière fois tenter de te le faire comprendre (suis peut être un peu optimiste pour le coup :p), si tu as une page qui comprend juste un <table> avec rien d'autre, et que les élément a l'intérieur bouge tout seul via JS, alors c'est se que j'appelle une page où l'internaute ne peut interagir. Il ne peut que regarder...
De toute manière peut importe, là n'est pas le problème, puisque j'ai la solution en tête et que ce n'est pas le sujet de mon post.

Pour en revenir a mon simple problème, je pense que la seul solution possible techniquement a était évoqué: le setTimeout() d'une fonction récursive et conditionné. Elle ne me plait guère, mais bon, il semblerait que se soit la seul solution.

Ainsi soit il. Merci Wink


RE: [RESLU]Fonction sleep en JS? - orditeck - 26-02-2009

Code PHP :
<?php 
function sleep(seconds) {
// http://kevin.vanzonneveld.net
// + original by: Christian Doebler
// + bugfixed by: Brett Zamir
// % note: For study purposes. Current implementation could lock up the user's browser.
// % note: Consider using setTimeout() instead.
// * example 1: sleep(1);
// * returns 1: 0

var start = new Date().getTime();
while (new
Date() < start + seconds*1000);
return
0;
}

-> http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_sleep/
Je sais pas ce que ça vaut, mais ça vaudrait la peine de tester Wink


RE: [RESLU]Fonction sleep en JS? - Anthor - 26-02-2009

Ben avec une librairie ce serait fait proprement et de façon transparente. Gestion de queue dans les événements, et callback.
Mais ça résout pas la chose, c'est simplement transparent Smile


RE: [RESLU]Fonction sleep en JS? - Argorate - 27-02-2009

orditeck : c'est marrant que tu proposes cette algo, car c'est celui là que j'ai tester, j'ai horreur des while (true), ça n'a pas de sens, une boucle a toujours une condition de sortie pour moi.
Le code que j'ai mis dans mon psot initial c'est le premier que j'ai trouver, c'était pour montré quel genre de solution il y avait et savoir si quelqu'un avait mieux.

Bref, j'ai donc tenté ça pour voir, le problème c'est pas que le navigateur plante, disons qu'il exécute le script en figeant la page, mais on ne vois pas les différentes étapes, on voit que le résultat final une fois le script fini, j'ai ensuite tester avec ce qu'on a dit, et ça marche bien, on vois toutes les étapes, dans l'ordre avec le temps qu'il faut entre chaque, sans bug, ni lag!

Voilà les fonction test:
Code :
function test()
{
    document.getElementById("data").style.display = "none";
    pause(2000);
    document.getElementById("data").style.display = "block";
    pause(1000);
    document.getElementById("data").style.backgroundColor = "#000000";
    pause(1000);
    alert('Finish!');
}

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

    while(now < exitTime)
    {
        now = new Date();
    }
}

et celle qui marche bien :

Code :
function scene(etape)
{
    switch(etape)
    {
        case 1: document.getElementById("data").style.display = "none";
        setTimeout("scene(2)", 2000);
        break;
        
        case 2: document.getElementById("data").style.display = "block";
        setTimeout("scene(3)", 5000);
        break;
        
        case 3: document.getElementById("data").style.backgroundColor = "#000000";
        setTimeout("scene(4)", 1000);
        break;
        
        case 4: alert('Finish!');
        break;
    }
}

avec l'extrait du html (utile):
Code :
<body onload="setTimeout('scene(1)', 3000);">
<div id="data" style="display:block; background-color:#FF0000">Le supra test de la mort qui tue!</div>;

Pour faire ce que j'avais en tête, ça devrait être bien Wink

Merci.