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

Flash Discussion :

Comportement d'incrémentation mystérieux


Sujet :

Flash

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Comportement d'incrémentation mystérieux
    Bonjour à tous!!

    C'est la première fois que je postule sur ce forum!!
    J'ai pris longtemps avant de me décider de poster chez vous car la je ne trouve pas la réponse à ma question.

    Je suis en train de créer un petit simulateur de mage ( qui fais référence au jeu wow )

    Pour l'instant tout est basique en période de test pour vérifier que toute les bases ne sont pas buggées pour pouvoir continuer dans mon programme!!

    Le programme :

    Nous avons 3 boutons à dispositions, chacun de ces boutons lance un sort "spécifique au bouton"!!

    Le lancement du sort va faire apparaître une barre de chargement qui durera plus au moins long en fonction du sort!!

    ( jusque la tout va bien =) )

    Quand le sort est envoyé ( fini le chargement ) il passe par une fonction qui va calculer les dégâts par rapport au stats du personnage ( bla bla bla ) et ensuite les afficher.

    Avec le temps, le texte va défiler vers le haut tout en devenant de plus en plus transparent jusqu'à disparaitre!!

    Coté technique :

    Mes boutons ont pour action :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    on (press) {
    	if ( _global.casting == false ) {
    		_global.magiesort = "givrefeu";
    		_global.casting = true;
    		anim_castbarre(_global.magiesort);
    	}
    }
    seul le nom de la magie varie pour le cas du bouton

    anim_castbarre est la fonction qui anime notre chargement :

    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
    function anim_castbarre(sort) {
    	_global.magiesort = sort;
    	if ( sort == "givrefeu" ) {
    		_global.temps = _global.tempsgivrefeu;
    	} else if ( sort == "brulure" ) {
    		_global.temps = _global.tempsbrulure;
    	} else {
    		_global.temps = _global.tempspyro;
    	}
    	_global.limitemax = cast.barrecast._x + limite;
    	_global.deplacement = _global.limite / ( (_global.temps / 1000 ) * _global.imageparseconde );
    	cast._visible = true;
    	_global.temps_debutcast = getTimer();
    	_global.tempsfin = _global.temps_debutcast + _global.temps;
    	_global.anim = true;
    }
    sur le clip de la barre de chargement il y a :

    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
    onClipEvent (enterFrame) { 
    	if ( _global.anim == true ) {
    		tempsecoule = getTimer();
    		tempsrestant = _global.tempsfin - tempsecoule;
    		if ( tempsrestant > 0.00 ) {
    			this.var_cast = tempsrestant / 1000;
    		} else {
    			this.var_cast = 0.0;
    		}
    		if ( _global.compteur < _global.limite ) {
    			this.barrecast._x += _global.deplacement;
    			_global.compteur += _global.deplacement;
    		} else {
    			_global.casting = false;
    			delete cast.onEnterFrame;
    			trace("Sort : " + _global.magiesort + " lancé");
    			trace("-------------");
    			_root.calculdegat(_global.magiesort);
    			_global.anim = false;
    			this.barrecast._x = _global.limitemax;
    			this.barrecast._x = this.barrecast._x - _global.limite;
    			this._visible = false;
    			_global.compteur = 0;
    		}
    	}
    }
    ps : pour l'effet chargement j'ai opté pour un déplacement de rectangle sous un masque pour pouvoir modifier la vitesse du chargement selon la vitesse du sort.

    Nous voici à la fonction de calcul des dégâts calculdegat() :

    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
    function calculdegat(sort) {
    	if ( sort == "givrefeu" ) {
    		degatnormal = Math.round(( _global.upgivrefeu + 1.0 ) * 
    						( random(_global.givrefeurandom) + _global.givrefeudebut
    						+ _global.bonusdegat*_global.givrefeucoeff ));
    		if ( random(10000) <= ( _global.critique + _global.critiquegivrefeu ) * 100 ) {
    			degatfinal = degatnormal * 2.3;
    		} else {
    			degatfinal = degatnormal;
    		}
    	} else if ( sort == "brulure" ) {
    		degatnormal = Math.round(( _global.upfeu + 1.0) * 
    						( random(_global.brulurerandom) + _global.bruluredebut
    						+ _global.bonusdegat*_global.brulurecoeff ));
    		if ( random(10000) <= ( _global.critique + _global.critiquebrulure ) * 100 ) {
    			degatfinal = degatnormal * 1.5;
    		} else {
    			degatfinal = degatnormal;
    		}
    	} else {
    		degatnormal = Math.round(( _global.upfeu + 1.0) * 
    						( random(_global.pyrorandom) + _global.pyrodebut 
    						+ _global.bonusdegat*_global.pyrocoeff ));
    		if ( random(10000) <= ( _global.critique + _global.critiquepyro ) * 100 ) {
    			degatfinal = degatnormal * 1.5;
    		} else {
    			degatfinal = degatnormal;
    		}
    	}
    	_global.mclevel++;
    	switch (_global.mclevel) {
    		case 1:
    			_global.mcdegat1ref = _root.attachMovie("degataffichagedyn", "degataffichagedyn1", 1);
    			setProperty (_global.mcdegat1ref, _x, 90);
    			setProperty (_global.mcdegat1ref, _y, 100);
    			setProperty (_global.mcdegat1ref, _alpha, 100);
    			setProperty (_global.mcdegat1ref, _xscale, 100);
    			setProperty (_global.mcdegat1ref, _yscale, 66);
    			_global.mcdegat1ref.dmg.embedFonts = true;
    			_global.mcdegat1ref.degat = degatfinal;
    			_global.mcdegat1 = true;
    			break;
    		case 2:
    			_global.mcdegat2ref = _root.attachMovie("degataffichagedyn", "degataffichagedyn2", 2);
    			setProperty (_global.mcdegat2ref, _x, 90);
    			setProperty (_global.mcdegat2ref, _y, 100);
    			setProperty (_global.mcdegat2ref, _alpha, 100);
    			setProperty (_global.mcdegat2ref, _xscale, 100);
    			setProperty (_global.mcdegat2ref, _yscale, 66);
    			_global.mcdegat2ref.dmg.embedFonts = true;
    			_global.mcdegat2ref.degat = degatfinal;
    			_global.mcdegat2 = true;
    			break;
    		case 3:
    			_global.mcdegat3ref = _root.attachMovie("degataffichagedyn", "degataffichagedyn3", 3);
    			setProperty (_global.mcdegat3ref, _x, 90);
    			setProperty (_global.mcdegat3ref, _y, 100);
    			setProperty (_global.mcdegat3ref, _alpha, 100);
    			setProperty (_global.mcdegat3ref, _xscale, 100);
    			setProperty (_global.mcdegat3ref, _yscale, 66);
    			_global.mcdegat3ref.dmg.embedFonts = true;
    			_global.mcdegat3ref.degat = degatfinal;
    			_global.mcdegat3 = true;
    			break;
    		case 4:
    			_global.mcdegat4ref = _root.attachMovie("degataffichagedyn", "degataffichagedyn4", 4);
    			setProperty (_global.mcdegat4ref, _x, 90);
    			setProperty (_global.mcdegat4ref, _y, 100);
    			setProperty (_global.mcdegat4ref, _alpha, 100);
    			setProperty (_global.mcdegat4ref, _xscale, 100);
    			setProperty (_global.mcdegat4ref, _yscale, 66);
    			_global.mcdegat4ref.dmg.embedFonts = true;
    			_global.mcdegat4ref.degat = degatfinal;
    			_global.mcdegat4 = true;
    			break;
    	}
    	tranche(sort);
    }
    à noter que je pense que la partie "switch" peut se permettre une optimisation du code au vu de la répétition, mais comme je n'ai pas encore trouver comment créer des pointeurs pour garder en référence les clips que j'attache j'en suis resté pour l'instant à la méthode fatidique...

    pour ce qui est de l'animation du texte d'affichage des dégâts :

    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
    _root.onEnterFrame = function() {
    	if ( _global.mcdegat1 == true ) {
    		_global.mcdegat1ref._y--;
    		_global.mcdegat1ref._alpha -= 1;
    		//trace(_global.mcdegat1ref._alpha + " 1");
    		if ( _global.mcdegat1ref._alpha <= 0 ) {
    			depiler();
    		}
    	}
    	if ( _global.mcdegat2 == true ) {
    		_global.mcdegat2ref._y--;
    		_global.mcdegat2ref._alpha -= 1;
    		//trace(_global.mcdegat2ref._alpha + " 2");
    	}
    	if ( _global.mcdegat3 == true ) {
    		_global.mcdegat3ref._y--;
    		_global.mcdegat3ref._alpha -= 1;
    		//trace(_global.mcdegat3ref._alpha + " 3");
    	}
    	if ( _global.mcdegat4 == true ) {
    		_global.mcdegat4ref._y--;
    		_global.mcdegat4ref._alpha -= 1;
    		//trace(_global.mcdegat4ref._alpha + " 4");
    	}
    }
    Et pour finir ma fonction dépiler qui me permet de faire une sorte de FIFO ( First In First Out ) pour l'affichage des dégâts des sorts étant donner qu'il est possible que plusieurs sorts arrivent avec un temps d'intervalle très court!!

    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
    function depiler() {
    	_global.mclevel--;
    	removeMovieClip(_global.mcdegat1ref);
    	if ( _global.mcdegat2 == true ) {
    		if ( _global.mcdegat3 == true ) {
    			if ( _global.mcdegat4 == true ) {
    				trace("Terminer - [x][x][x][x]");
    				_global.mcdegat1ref = null;
    				_global.mcdegat1ref = _global.mcdegat2ref;
    				_global.mcdegat2ref = _global.mcdegat3ref;
    				_global.mcdegat3ref = _global.mcdegat4ref;
    				_global.mcdegat1 = true;
    				_global.mcdegat2 = true;
    				_global.mcdegat3 = true;
    				_global.mcdegat4 = false;
    				_global.mcdegat4ref = null;
    			} else {
    				trace("Terminer - [x][x][x][ ]");
    				_global.mcdegat1ref = null;
    				_global.mcdegat1ref = _global.mcdegat2ref;
    				_global.mcdegat2ref = _global.mcdegat3ref;
    				_global.mcdegat1 = true;
    				_global.mcdegat2 = true;
    				_global.mcdegat3 = false;
    				_global.mcdegat4 = false;
    				_global.mcdegat3ref = null
    			}
    		} else {
    			trace("Terminer - [x][x][ ][ ]");
    			_global.mcdegat1ref = null;
    			_global.mcdegat1ref = _global.mcdegat2ref;
    			_global.mcdegat1 = true;
    			_global.mcdegat2 = false;
    			_global.mcdegat3 = false;
    			_global.mcdegat4 = false;
    			_global.mcdegat2ref = null;
    		}
    	} else {
    		trace("Terminer - [x][ ][ ][ ]");
    		_global.mcdegat1 = false;
    		_global.mcdegat2 = false;
    		_global.mcdegat3 = false;
    		_global.mcdegat4 = false;
    		_global.mcdegat1ref = null;
    	}	
    }
    J'espère avoir bien expliqué la situation!!
    Je profite pour vous mettre un lien de mon programme à l'état que j'écris ce post :

    Simulateur Mage

    Tester le sort brûlure c'est le plus rapide et c'est celui qui déclenche l'effet de défilement instable...

    ps : vous ne pouvez pas lancer plus de 4 sort en simultané ^^ ne spammer pas la touche en vous demandant pourquoi à un moment vous n'avez pas la barre de cast

    Maintenant place au problème :

    Quand je lance mes sorts, pas de problème, ils se suppriment bien, ils s'estompent avec le temps ( deviennent transparent ) !! Seulement que par moment, le texte d'affichage des dégâts se déplacent vers le haut un peu plus rapidement que les autres!! Sachant que ma seule fonction qui agit sur ce texte ne fait qu'incrémenter de 1 mon texte vers le haut!! Apparemment ce 1 est symbolique en étant dans un enterFrame !!

    J'ai aussi remarqué que cet effet survient au moment qu'un sort est lancé juste après qu'un sort soit effacer de la scène!!

    Je n'arrête pas les tests et la je ne comprend pas ce qui peut influencer tout d'un coup la vitesse de défilement d'un texte par rapport aux autres!!

    Je vous remercie d'avance et en espérant avoir été assez clair sur mes explications

    ps : des avis sur optimisations ou des critiques sur le code sont les bienvenues, j'avoue que je n'ai pas vraiment structuré, j'ai fais à la méthode brutal sans pseudo-code ultérieur et autre!!

    HelziX

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Rebonjour,

    Comme je l'avais pensé le code pouvait être grandement optimisé!!
    J'ai améliorer le code en ajoutant un tableau dynamique!!

    Malgré cette amélioration du code!! J'ai toujours ce même effet mystérieux, le texte défile vers le haut plus vite que certain!! Est-ce normal ? ou un détail que j'ai omis??

    Les actions sur les boutons, anim_castbarre et sur le clip de la barre de chargement restent inchangées!!

    Toutefois, ma fonction calcul dégât à subit un énorme changement ( plus court, plus lisible ) :

    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
    function calculdegat(sort) {
    	if ( sort == "givrefeu" ) {
    		degatnormal = Math.round(( _global.upgivrefeu + 1.0 ) * 
    						( random(_global.givrefeurandom) + _global.givrefeudebut
    						+ _global.bonusdegat*_global.givrefeucoeff ));
    		if ( random(10000) <= ( _global.critique + _global.critiquegivrefeu ) * 100 ) {
    			degatfinal = degatnormal * 2.3;
    		} else {
    			degatfinal = degatnormal;
    			_global.procpyrocpt = 0;
    		}
    	} else if ( sort == "brulure" ) {
    		degatnormal = Math.round(( _global.upfeu + 1.0) * 
    						( random(_global.brulurerandom) + _global.bruluredebut
    						+ _global.bonusdegat*_global.brulurecoeff ));
    		if ( random(10000) <= ( _global.critique + _global.critiquebrulure ) * 100 ) {
    			degatfinal = degatnormal * 1.5;
    		} else {
    			degatfinal = degatnormal;
    		}
    	} else {
    		degatnormal = Math.round(( _global.upfeu + 1.0) * 
    						( random(_global.pyrorandom) + _global.pyrodebut 
    						+ _global.bonusdegat*_global.pyrocoeff ));
    		if ( random(10000) <= ( _global.critique + _global.critiquepyro ) * 100 ) {
    			degatfinal = degatnormal * 1.5;
    		} else {
    			degatfinal = degatnormal;
    		}
    	}
    	_global.mclevel++;
    	_global.tableaudyn.push(_root.attachMovie("degataffichagedyn", "degataffichagedyn" + _global.mclevel, _global.mclevel));
    		setProperty (_global.tableaudyn[_global.tableaudyn.length - 1], _x, 90);
    		setProperty (_global.tableaudyn[_global.tableaudyn.length - 1], _y, 100);
    		setProperty (_global.tableaudyn[_global.tableaudyn.length - 1], _alpha, 100);
    		setProperty (_global.tableaudyn[_global.tableaudyn.length - 1], _xscale, 100);
    		setProperty (_global.tableaudyn[_global.tableaudyn.length - 1], _yscale, 66);
    		_global.tableaudyn[_global.tableaudyn.length - 1].dmg.embedFonts = true;
    		_global.tableaudyn[_global.tableaudyn.length - 1].degat = degatfinal;
     
    	if ( _global.testdemarrer == false ) {
    		_global.tempstest = getTimer();
    		_global.testdemarrer = true;
    	}
    	_global.compteurdps += degatfinal;
    	dpstotal = _global.compteurdps;
    	//tranche(sort);
    }
    l'animation du texte des dégâts aussi a énormément changé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    _root.onEnterFrame = function() {
    	if ( _global.tableaudyn.length > 0 ) {
    		for ( i = 0; i <= _global.tableaudyn.length - 1; i++ ) {
    			_global.tableaudyn[i]._y--;
    			_global.tableaudyn[i]._alpha--;
    		}
    		if ( _global.tableaudyn[0]._alpha <= 0 ) {
    			depileravancer();
    		}
    	}
    }
    Sans parler de ma fonction dépiler qui est devenu ridicule point de vue taille ^^ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function depileravancer() {
    	_global.mclevel--
    	clipsupp = _global.tableaudyn.shift();
    	removeMovieClip(clipsupp);
    }
    Pourtant, le problème est toujours la!!! Quelqu'un aurait une idée ? Auriez vous besoin du fichier .fla pour trouvez la faille?

    Merci d'avance

    HelziX

  3. #3
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    salut,

    le gros problème c'est que ton code est truffé de variables globales ... un nid a bug assuré et surtout une lecture très compliqué pour la personne qui n'est pas l'auteur du code !


    est ce que tu détruit bien le champ de texte ?
    est ce que tu re-crées bien le champ de texte ?
    Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
    Mon blog : http://web.codeur.free.fr

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    le texte étant dans un clip dynamique appelé degataffichagedyn que j'insère via attachMovie()!!

    Par la suite, je le supprime via removeMovieClip()!!

    D'après le debugger le texte est bien ajouter et supprimer!!
    Dans mon tableau dynamique j'ai bien mes références avec des niveaux différents qui sont insérer puis supprimer!!!

    Pour ce qui est des variables globales, c'est sur j'en ai beaucoup mais je ne comprend pas d'où peut sortir le bug!!!

    il y a des textes qui défilent bien par tranche de 1 vers le haut et de temps en temps d'autres textes qui défilent par tranche de 2 vers le haut!!!

    Je ne suis pas sur si c'est par tranche de 2 vu que leurs défilements sont gérés dans un enterFrame!!

    Un détail que j'ai remarqué :

    Si je lance vite mes dégâts par exemple : si j'appuie sur le bouton brûlure, l'effet du bug intervient par moment!!!
    Si je lance lentement mes dégâts par exemple :si j'appuie sur le bouton givrefeu ou pyro!! Le bug n'intervient plus!!!

    Étrange...

    J'aimerai pensé que c'est au moment de la suppression et de l'insertion du texte que le bug peut intervenir... mais en quoi une suppression et une insertion peut faire varier le taux de défilement du texte

Discussions similaires

  1. [AC-2007] le Nom du fichier PDF comporte une incrémentation
    Par Pittouti dans le forum IHM
    Réponses: 1
    Dernier message: 12/06/2012, 15h22
  2. Comportement mystérieux de multiprocessing
    Par Captain'Flam dans le forum Général Python
    Réponses: 4
    Dernier message: 11/04/2012, 21h12
  3. Incrémenter champ requete comportant des doublons
    Par krina85 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/11/2007, 15h59
  4. Réponses: 4
    Dernier message: 01/02/2007, 14h13
  5. Post incrémentation?
    Par Defrag dans le forum C
    Réponses: 4
    Dernier message: 08/10/2002, 10h36

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