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 :

Construction d'objet et récursion non voulue [API HTML5]


Sujet :

JavaScript

  1. #1
    Membre habitué Avatar de GalliezB
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 89
    Points : 162
    Points
    162
    Par défaut Construction d'objet et récursion non voulue
    Bonjour,

    En baladant dans Firebug, je me suis aperçu d'une chose étrange lors d'un affichage de mon objet. Étant néophyte, je m'y perds un peu. SpaceFrog m'as fait remarqué sur le tchat que cela fait penser à un problème de récursion.

    Le tout sert à gérer l'affichage et manipulation des images sur un canvas.

    Le hic, c'est que la, je suis perdu. Pourriez-vous me dire si je construit mal mes objets ? Ou si je fait quoique ce soit qui ne soit pas correct ?

    Bref, si vous avez une piste pour expliqué ce soucis, je suis preneur

    En image :



    Le code :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
     
    /******************************************** VARIABLE ************************************************/
    var elem,ctx = false;                      // le canvas
    var windowHeight = window.innerHeight;     // hauteur fenetre
    var windowWidth = window.innerWidth;       // largeur fenetre
    var asteroide = new Array();               // tableau des objets astéroides
    var posMouseX,posMouseY,cursor=false;      // position et état souris
    var clickObject;                           // Click astéroide, station etc...
    /******************************************** FONCTION ************************************************/
    function loop(){
     
        // efface le canvas
        ctx.clearRect(0,0,windowWidth,windowHeight);
     
        // affichage des astéroides
        for ( key in asteroide ){
            asteroide[key].move();
            asteroide[key].draw();
        }
     
        // affiche la sation
        station.draw();
     
        // interaction souris
        interactCursor();
     
        // relance la boucle
        window.requestAnimFrame(loop);
    }
    function traiteRetour(retour){
        // fin de session
        if(retour.security!==undefined){window.location='http://expansion.damocorp.com';}
    }
    function genereAsteroide(){
        var rand = Math.random();
        if ( rand < 0.3 ){
            var tmp = new affImg('img/sprite_game.png',150,50,50,50,-50,-50);
        } else if ( rand > 0.3 && rand < 0.6 ){
            var tmp = new affImg('img/sprite_game.png',200,50,50,50,-50,-50);
        } else {
            var tmp = new affImg('img/sprite_game.png',250,50,50,50,-50,-50);
        }
        asteroide.push(tmp);
        tmp.resetPosition();
    }
    function interactCursor(){
     
        cursor = false;
     
        // La station
        if ( posMouseX > windowWidth/2-50 && posMouseX < windowWidth/2+50 && posMouseY > windowHeight/2-50 && posMouseY < windowHeight/2+50 ){
            cursor = true;
            clickObject='station';
        }
        // Les astéroides
        for ( key in asteroide ){
            if ( posMouseX > asteroide[key].posx && posMouseX < asteroide[key].posx+asteroide[key].affWidth && posMouseY > asteroide[key].posy && posMouseY < asteroide[key].posy+asteroide[key].affHeight ){
                cursor = true;
                clickObject = key;
                break;
            }
        }
     
        if ( cursor ){
            $('#canvas').css({'cursor':'pointer'});
        } else {
            $('#canvas').css({'cursor':'auto'});
        }
    }
    function interactClick(){
        if ( cursor ){
            console.log(asteroide[clickObject]);
        }
    }
    /******************************************** OBJET ************************************************/
    window.requestAnimFrame = (function(){
        return window.requestAnimationFrame ||
        window.webkitRequestAnimationFrame  ||
        window.mozRequestAnimationFrame     ||
        window.oRequestAnimationFrame       ||
        window.msRequestAnimationFrame      ||
        function(callback){
            window.setTimeout(callback, 1000/30);
        };
    })();
    var affImg = function(s,sX,sY,w,h,x,y){
     
        this.img = new Image();
        this.img.src = s;
     
        this.srcX = sX;
        this.srcY = sY;
        this.width = w;
        this.height = h;
        this.posx = x-this.width/2;
        this.posy = y-this.height/2;
        this.affWidth=w;
        this.affHeight=h;
    }
    affImg.prototype.draw = function(){
        ctx.drawImage(this.img,this.srcX,this.srcY,this.width,this.height,this.posx,this.posy,this.affWidth,this.affHeight);
    }
    affImg.prototype.move = function(){
     
        if ( this.sensX === undefined ){
            this.sensX=3;
            this.sensY=3;
        }
     
        this.posx+=this.sensX;
        this.posy+=this.sensY;
     
        // relance l'astéroide s'il sort de la zone
        if ( this.posx > windowWidth+250 || this.posy > windowHeight+250 || this.posx < -250 || this.posy < -250 ){
            this.resetPosition();
        }
     
    }
    affImg.prototype.resetPosition = function(){
     
        // vitesse de déplacement
        this.sensX=Math.random();
        if ( this.sensX < 0.1 ){ this.sensX = 0.1; }
        this.sensY=Math.random();
        if ( this.sensY < 0.1 ){ this.sensY = 0.1; }
     
        var rand = Math.random();
        // l'astéroide viens du haut
        if ( rand <= 0.25 ){
     
            this.posx= Math.floor(Math.random()*windowWidth);
            this.posy=-50;
            // l'astéroide part vers la gauche
            if ( this.posx > windowWidth/2){
                this.sensX--;
            }
     
        // l'astéroide viens de la droite
        } else if ( rand > 0.25 && rand <= 0.50 ){
     
            this.posx= windowWidth+50;
            this.posy= Math.floor(Math.random()*windowHeight);
     
            // l'astéroide part vers le haut et va vers la gauche
            this.sensX--;
            if ( this.posy > windowHeight/2){
                this.sensY--;
            }
     
        // l'astéroide viens du bas
        } else if ( rand > 0.25 && rand <= 0.50 ){
     
            this.posx= Math.floor(Math.random()*windowWidth);
            this.posy=windowHeight+50;
            // l'astéroide part vers le haut et va vers la gauche
            this.sensY--;
            if ( this.posx > windowWidth/2){
                this.sensX--;
            }
     
        // l'astéroide viens de la gauche
        } else {
     
            this.posx= -50;
            this.posy=Math.floor(Math.random()*windowHeight);
            // l'astéroide part vers le haut et va vers la gauche
            if ( this.posy > windowHeight/2){
                this.sensX--;
            }
     
     
        }
     
        // modifie la taille des astéroide
        rand = Math.random();
        var scale = (rand*5+5)/10;
        this.affWidth = this.width*scale;
        this.affHeight = this.height*scale;
     
        // modifie le type de l'astéroide
        if ( rand < 0.3 ){
            this.sX=150;
        } else if ( rand > 0.3 && rand < 0.6 ){
            this.sX=200;
        } else {
            this.sX=250;
        }
    }
    /******************************************** JQUERY ************************************************/
    $(document).ready(function(){
     
        // Ajout du canvas
        $('body').prepend('<canvas id="canvas" width="'+windowWidth+'" height="'+windowHeight+'"></canvas>');
        // Elem + ctx
        elem = document.getElementById('canvas');
        ctx = elem.getContext('2d');
     
        // affichage de la station
        var station = new affImg('img/sprite_game.png',0,50,100,100,(windowWidth/2),(windowHeight/2));
     
        // ajout de X astéroide
        for (var i=0; i<10; i++) {
            genereAsteroide();
        };
     
        //lancement de la boucle
        loop();
     
        /***************************** EVENEMENT *********************************/
        document.getElementById('canvas').addEventListener('mousemove',function(e){posMouseX=e.pageX;posMouseY=e.pageY;},false);
        document.getElementById('canvas').addEventListener('click',interactClick,false);
    });
    Ou sur le pastebin : http://pastebin.com/08vA62t0


    Merci

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    C'est tout à fait normal.
    Lorsque tu crées un constructeur, tu lui affectes un prototype. Or, parmi les propriétés automatiquement ajoutées à ce prototype se trouve son constructeur (constructor) qui lui-même référence le prototype.
    Malgré le rendu visuel dans Firebug, il ne s'agit pas de récursion mais de références croisées, rien d'inquiétant donc.
    Regarde par exemple avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var Obj = function(){
      this.foo = 'bar',
      this.toto = 'tata'
    };
    Obj.prototype.retourne = function(nom){
      return this[nom] || 'Inconnu';
    }
    var monObj = new Obj();
    console.log(monObj)

  3. #3
    Membre habitué Avatar de GalliezB
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 89
    Points : 162
    Points
    162
    Par défaut
    Super

    J'peux donc continuer sans la petit voix qui me dis "Tu fais encore des conneries "

    Merci bien Bovino

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

Discussions similaires

  1. [Windev 12] Probleme objet identique non voulu
    Par jonas0 dans le forum WinDev
    Réponses: 3
    Dernier message: 04/08/2008, 15h55
  2. Objet.evenement --> Erreur : Non implémenté
    Par Darkdaemons dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/09/2005, 17h24
  3. Pb Firefox + pb fermeture Windows non voulue
    Par trotters213 dans le forum Firefox
    Réponses: 9
    Dernier message: 13/06/2005, 16h16
  4. [CSS][IE >= 5.5] Transparence non voulue !
    Par pimousse76 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 12/05/2005, 16h06
  5. probleme d'espace non voulu entre 2 bloc
    Par piff62 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 12/04/2005, 16h07

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