IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[SVG] Problème de récursion


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut [SVG] Problème de récursion
    Bonjour,

    Voilà, je suis en train de coder un jeu dans lequel on a un carré qui se déplace.
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    function env_ennemis(nb)
    {
    	var rnd = RandomNum(1, 4);
    	var x;
    	var y;
          	var en = SVGDocument.createElementNS(svgns, 'rect');
     
    	if(rnd == 1)
    	{
    		x = 0;
    		y = RandomNum(0, 500);
    	}
    	else if(rnd == 2)
    	{
    		x = 500;
    		y = RandomNum(0, 500);
    	}
    	else if(rnd == 3)
    	{
    		y = 0;
    		x = RandomNum(0, 500);
    	}
    	else if(rnd == 4)
    	{
    		y = 500;
    		x = RandomNum(0, 500);
    	}
     
           en.setAttributeNS(null, 'id', 'ennemi_' + nb);
           	en.setAttributeNS(null, 'x', x);
           en.setAttributeNS(null, 'y', y);
           en.setAttributeNS(null, 'width', '20');
           en.setAttributeNS(null, 'height', '20');
           en.setAttributeNS(null, 'fill', 'blue');
           en.setAttributeNS(null, 'stroke', 'black');
           en.setAttributeNS(null, 'stroke-width', '2px');
    	SVGRoot.appendChild(en);
    	deplace_en(en, parseInt(x), parseInt(y));
     
    	window.setTimeout(function(){env_ennemis(nb+1)}, 1000);
    };
    L'idée de l'appel récursif à la fin de la fonction, c'est que toutes les secondes, un nouvel ennemi fasse son apparition et se déplace comme les autres, à l'aide de la fonction deplace_en, elle-même récursive.
    Or, ce n'est pas du tout ce qui se passe en pratique.
    Toutes les secondes, l'ancien élément disparait, et le suivant se déplace 2 fois plus rapidement que le précédent ! Comme si la fonction deplace_en était appeler 2 fois, puis 3 fois, etc. à chaque déplacement.

    Quelqu'un peut m'aider ?
    J'ai déjà du mal à comprendre cet histoire de vitesse, mais alors pourquoi mon objet disparait à chaque récursion, je n'y comprends strictement rien ! Surtout que j'ai d'autres fonctions qui fonctionnent selon le même principe de création par récursion et qui marchent parfaitement...

    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    Bon après quelques observations au pixel près, c'est encore pire que ce que je pensais : le premier élément ne disparait pas, il se superpose au suivant !
    Je ne comprends absolument rien... pourquoi il fait ça ?
    Help please

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    Bon je crois avoir compris ce qui se passe, mais ça n'a toujours pas le moindre sens et je n'ai pas toujours pas la moindre idée de comment réparer ça.
    Apparemment, quand 2 objets se déplacent en même temps, au lieu d'utiliser chacun une partie de la mémoire pour traiter la fonction deplacer_en séparément, ils utilisent le même emplacement mémoire, les même variables, et distribuent les résultats à tous les processus l'utilisant à ce moment là !!
    autrement dit, au lieu d'avoir, comme il faudrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    |                     |
    |                     |
    |                     |
    |                     |
    |                     |
    |  Ma Fonction        |
    |                     |
    |                     |
    |                     |
    v                     v
     
     
    J'ai ça :
     
     
     |                    |
      \                   /
        \              /
           \        /  
             \    /
        Ma Fonction 
              / \        
            /      \
          /          \
         v            v
    C'est complètement insensé !

    En fait, ça aurait du sens, si à chaque appel de la fonction setTimeout, ça ouvrait un thread dont la fonction passée en argument est le handler.
    Ça expliquerait le partage de la mémoire est ses conséquences...
    EDIT : sauf que voilà : j'ai une autre fonction, qui fonctionne de la même manière, et qui marche...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/10/2008, 10h49
  2. Excel et publipostage ( problème de "récursion" )
    Par Clad3 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 22/08/2007, 11h38
  3. [SVG] Problème utilisation use, g et javascript
    Par Mormegil dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 17/07/2007, 16h54
  4. [XSLT] [SVG] Problème de code Java ?
    Par kitsune dans le forum Format d'échange (XML, JSON...)
    Réponses: 28
    Dernier message: 22/06/2006, 15h58
  5. Réponses: 8
    Dernier message: 05/02/2006, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo