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 :

Modification de la propriété d'un objet en javascript


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 Modification de la propriété d'un objet en javascript
    Bonjour,

    Je fais mes débuts en POO javascript pour réaliser mes petits jeu en HTML5.
    Après avoir lu quelques sites et quelques bouquins, voir même quelque exercices sur code academy, je me retrouve devant un problème que je ne comprends pas.

    J'ai crée un objet qui va me permettre de gérer mes sprites dans ma boucle. Voici mon objet :
    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
    var affImg = function(src,srcX,srcY,width,height,x,y){
     
    	var img = new Image();
    	img.src = src;
     
    	this.srcX = srcX;
    	this.srcY = srcY;
    	this.width = width;
    	this.height = height;
    	this.x = x;
    	this.y = y;
     
     
    	this.draw = function(){
     
    		if (ctx) {
    			ctx.drawImage(img,srcX,srcY,width,height,x,y,width,height);
    		} else {
    			console.log('ctx indéfini');
    		}
     
    	}
    	this.setSrcX = function(newSrcX){
    		this.srcX = newSrcX;
    	}
     
    	this.valeur = function(){
    		console.log('srcX=>'+srcX+'srcY=>'+srcY+'width=>'+width+'height=>'+height+'x=>'+x+'y=>'+y)
    	}
    }
    Et voici ma boucle ( elle fonctionne hein ^^ ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var flotte = new affImg('img/sprite_jeu.gif',0,0,50,50,100,100);
     
    flotte.srcX = 50;
    flotte.srcY = 0;
    var cpt = 0;
    function loop(){
     
    	cpt++;
    	flotte.setSrcX(cpt);
    	flotte.srcX = 150;
    	flotte.draw();
     
    	window.requestAnimFrame(loop);
    }
    Mais voila, rien. L'affichage fonctionne bien mais pas de modification la propriété srcX.

    Comme vous pouvez le voir j'ai même créer un méthode pour la modifé ( appris dans un bouquin sur la POO php ). Mais la encore, celle-ci n'est pas modifié.


    Pourtant il me semblait avoir lu qu'on pouvait modifier une propriété lorsque celle-ci était pubic ( via this ).
    Pourriez-vous m'éclairer sur le pourquoi je n'arrive pas à modifier cette valeur ?

    Merci

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function loop(){
    	...
    	flotte.setSrcX(cpt);
    	flotte.srcX = 150;
    	flotte.draw();
    	...
    }
    En faisant comme ça tu auras toujours une valeur de 150 au moment de l'affichage. Erreur de recopie du code ?

  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
    non non, c'était bien ce qui étais voulu pour tester.

    Hors la valeur reste de 100 et non pas 150.
    Si je fait un flotte.valeur() => j'obtiens 100 et pas 150.

    Et c'est la que je suis complètement perdu. Tout ce que je l'ai lu et appris m'indique le contraire.
    J'ai testé sur toutes les propriétés et aucune ne changent

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 183
    Points : 274
    Points
    274
    Par défaut
    ton conole.log fait affiche les valeurs des variables globales qui trianent dans ton code au lieu de faire des this.srcX, etc...

    si tu avais fait un test un peu plus propre tu n'aurais pas de soucis.
    ET comme te le dis le monsieur, ta valeurde srcX sera toujours de 150

  5. #5
    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 : 54
    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
    Quand on dit que nommer une propriété de la même façon qu'un paramètre est une source de confusion et d'erreur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var affImg = function(src,srcX,srcY,width,height,x,y){
     
    	var img = new Image();
    	img.src = src;
     
    	this.srcX = srcX;
    	this.srcY = srcY;
    	this.width = width;
    	this.height = height;
    	this.x = x;
    	this.y = y;
    Fais-tu bien la différence entre scrX et this.srcX ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ctx.drawImage(img,srcX,srcY,width,height,x,y,width,height);
    Ici, les paramètres de la fonction correspondent selon toi aux paramètres du constructeur ou aux propriétés de l'objet ?
    Bien sûr, avec des nommages appropriés, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.sourceX = srcX;
    // etc.
    la question ne se poserait pas ! Surtout, en cas d'oubli du this, le code te renverrait une erreur au lieu de trouver une autre valeur et ça faciliterait le débogage.

  6. #6
    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
    Quand on dit que nommer une propriété de la même façon qu'un paramètre est une source de confusion et d'erreur...
    Je n'ai jamais lu ceci dans aucun tutoriels. Et pourtant je comprend bien maintenant pourquoi et comment je me suis planté.



    ton conole.log fait affiche les valeurs des variables globales qui trianent dans ton code au lieu de faire des this.srcX, etc...
    Si j'ai bien tout suivi, il m'affiche les paramètres du constructeur, j'ai aucune variable globale de ce nom dans mon code.



    Un grand merci à vous deux, en effet je comprend la différence entre le srcX et this.srcX
    Mais comme le dit si bien Bovino, le même nommage est bien mon soucis. Je vais donc changer cette pratique pour m'éviter de me retrouver sans erreur en cas d'oubli du this. Ce qui parait quand même plus logique.


    si tu avais fait un test un peu plus propre tu n'aurais pas de soucis.
    ET comme te le dis le monsieur, ta valeur de srcX sera toujours de 150
    Pourrai tu développer un peu plus ce que tu appel un test plus propre stp ?

  7. #7
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Peut-être une autre source de confusion : tu crées les méthodes de affImg dans le constructeur au lieu de les attacher au prototype. Du coup il y a un risque que les méthodes utilisent des variables locales du constructeur. Si elles étaient déclarées en dehors, elles ne pourraient pas.

    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
    // déclaration du constructeur
    var affImg = function(){};
     
    // ajout des méthodes sur le prototype
    affImg.prototype.draw = function(){};
     
    affImg.prototype.setSrcX = function(newSrcX){};
     
    affImg.prototype.valeur = function(){};
     
    // les méthodes s'utilisent exactement de la même façon
    var flotte = new affImg();
    flotte.valeur();

  8. #8
    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
    Oui en effet mais c'est voulu pour le moment.

    Je veux voir quel impact cela va avoir sur les performances. J'avais lu ceci sur http://t-templier.developpez.com/tut...vascript-poo1/

    Une fois le jeu fini je ferai différentes branches sur mon git pour tester les différentes versions et voir un peu comment tout cela influence les performances.


    Par contre j'avoue ne pas avoir pensé à l'utilisation des variables locales. Merci pour la précision

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

Discussions similaires

  1. [VB6] Modification des propriétés d'un objet de form dans un module
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 09/06/2006, 09h46
  2. Réponses: 1
    Dernier message: 27/12/2005, 13h58
  3. javascript > modification d'une propriété déjà définie en
    Par Cypselos dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/12/2005, 17h44
  4. [POO] Problème lors de l'appel d'une propriété d'un objet.
    Par akecoocoo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/08/2005, 08h51
  5. Accés rapide aux propriétés d'un Objet
    Par Alacazam dans le forum C++Builder
    Réponses: 4
    Dernier message: 28/11/2002, 21h56

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