Forums Développement Multimédia

Aller au contenu

- - - - -

[AS3] Problème de RemoveChild(); avec un DisplayObjectContainer

CODE Flash as3 gaga

3 réponses à ce sujet

#1 steelfox

    Ceinture Jaune

  • Members
  • PipPip
  • 22 messages

Posté 11 April 2014 - 10:43 AM

Bonjour,

Je me permets de venir vous demander de l'aide car je peine actuellement sur un problème relatif à la suppression de movieclips contenus dans un tableau.
J'ai donc créer un tableau de variables contenant des mc qui sont affichés grâce à un DisplayObjectContainer. A cela j'ai ajouté un autre tableau de variables numériques, dont les valeurs changent après chaque clic sur un mc. Lorsque 3 variables numériques spécifiques ont une valeur de 1 (et que donc les 3 mc spécifiques ont été cliqués), tout les autres mc doivent disparaître.
Mais il se trouve que j'ai une erreur "#2025: The supplied DisplayObject must be a child of the caller".

Voici mon code (loin d'être propre je vous l'accorde, mais je suis débutant, alors pas taper ! :oops: ) :
(sinon si vous préférez j'ai joint le fichier en pièce jointe)

import flash.display.DisplayObjectContainer;
import flash.text.TextField;
import flash.display.MovieClip;
import com.greensock.*;
import com.greensock.easing.*;
import flash.events.Event;
import flash.display.DisplayObject;

/*
* VARIABLES
*/


var case_1:mc_case_1 = new mc_case_1();
var case_2:mc_case_2 = new mc_case_2();
var case_3:mc_case_3 = new mc_case_3();
var case_4:mc_case_4 = new mc_case_4();
var case_5:mc_case_5 = new mc_case_5();
var case_6:mc_case_6 = new mc_case_6();
var case_7:mc_case_7 = new mc_case_7();
var case_8:mc_case_8 = new mc_case_8();
var case_9:mc_case_9 = new mc_case_9();
var case_h_a:int = 0;
var case_h_b:int = 0;
var case_h_c:int = 0;
var case_m_a:int = 0;
var case_m_b:int = 0;
var case_m_c:int = 0;
var case_b_a:int = 0;
var case_b_b:int = 0;
var case_b_c:int = 0;
var toutes_les_cases:Array=[case_1, case_2, case_3, case_4, case_5, case_6, case_7, case_8, case_9]; // liste des mc_cases
var valeurs_cases:Array=[case_h_a, case_h_b, case_h_c, case_m_a, case_m_b, case_m_c, case_b_a, case_b_b, case_b_c];// liste des variables num. associées aux mc_cases
var un_mc_case:DisplayObjectContainer; // énumération des mc_case

/*
* CODE PRINCIPAL
*/


// code commun à tous les mc_case
for each (un_mc_case in toutes_les_cases)
{
  un_mc_case.x = stage.stageWidth / 2;
  un_mc_case.y = stage.stageHeight / 1.99;
  un_mc_case.addEventListener (MouseEvent.MOUSE_DOWN, clic_case);
  addChild (un_mc_case);
}
// cas particuliers des mc_case
case_1.x -= case_1.width;
case_2.x == case_1.width;
case_3.x += case_2.width;
case_4.x -= case_5.width;
case_4.y += case_1.height;
case_5.y += case_5.height;
case_6.x += case_5.width;
case_6.y += case_3.height;
case_7.x -= case_1.width;
case_7.y += case_9.height*2;
case_8.x == case_1.width;
case_8.y += case_9.height*2;
case_9.x += case_9.width;
case_9.y += case_9.height*2;

/*
* FONCTIONS
*/


for each (un_mc_case in toutes_les_cases) {
function clic_case(event:Event):void // Les trois bonnes cases sont cliquées
{
        event.currentTarget.removeEventListener (MouseEvent.MOUSE_DOWN, clic_case);

        if (event.currentTarget == case_1){
        case_h_a = 1;
   trace("H_A="+case_h_a.valueOf());
        }
        if (event.currentTarget == case_2){
         case_h_b =1;
         trace("H_B="+case_h_b.valueOf());
        }
        if (event.currentTarget == case_3){
         case_h_c =1;
         trace("H_C="+case_h_c.valueOf());
        }
        if (event.currentTarget == case_4){
         case_m_a =1;
         trace("M_A="+case_m_a.valueOf());
        }
        if (event.currentTarget == case_5){
         case_m_b =1;
         trace("M_B="+case_m_b.valueOf());
   }
   if (event.currentTarget == case_6){
         case_m_c =1;
         trace("M_C="+case_m_c.valueOf());
        }
   if (event.currentTarget == case_7){
         case_b_a =1;
         trace("B_A="+case_b_a.valueOf());
        }
        if (event.currentTarget == case_8){
         case_b_b =1;
         trace("B_B="+case_b_b.valueOf());
   }
        if (event.currentTarget == case_9){
         case_b_c =1;
         trace("B_C="+case_b_c.valueOf());
        }

  for (var i = 0; i < valeurs_cases.length; i++) {
 
        if (case_h_a == 1 && case_h_b == 1 && case_h_c == 1) {
 
                        toutes_les_cases.splice(0,2)// bonnes cases enlevées du tableau
                        for each (un_mc_case in toutes_les_cases) { //<---c'est la que ça coince
                                        removeChild(un_mc_case);
                        }
   }
   } else if (case_m_a == 1 && case_m_b == 1 && case_m_c == 1) {
          //pas fini
   } else if (case_b_a == 1 && case_b_b == 1 && case_b_c == 1) {
         //pas fini
   } else if (case_h_a == 1 && case_m_a == 1 && case_b_a == 1) {
        //pas fini
   } else if (case_h_b == 1 && case_m_b == 1 && case_b_b == 1) {
        //pas fini
   } else if (case_h_c == 1 && case_m_c == 1 && case_b_c == 1) {
        //pas fini
   } else if (case_h_a == 1 && case_m_b == 1 && case_b_c == 1) {
        //pas fini
   } else if (case_h_c == 1 && case_m_b == 1 && case_b_a == 1) {
        //pas fini
   }
  }
}
}
 


#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 11 April 2014 - 11:01 AM

Salut,

Citation

erreur "#2025: The supplied DisplayObject must be a child of the caller"

L'objet que ton programme essayes de supprimer doit être un enfant du conteneur à partir duquel tu souhaite faire la suppression.

Dans ton code tu as : removeChild(un_mc_case);

Ton removeChild n'utilise pas de syntaxe pointée, l'objet auquel il se référè est donc l'objet principal de ta fonction, or ta fonction c'est : function clic_case(event:Event):void

Donc l'objet principal est un événement qui ne contient pas le displayObject que tu souhaite effacer...
Tu devrais avoir un truc du genre : leConteneur.removeChild(displayObject);

Autre remarque, tu as :

Citation

for each (un_mc_case in toutes_les_cases) {
function clic_case(event:Event):void // Les trois bonnes cases sont cliquées{

Très mauvais ça !
On ne met jamais une fonction dans une boucle, surtout si son déclenchement dépend d'un événement...

#3 steelfox

    Ceinture Jaune

  • Members
  • PipPip
  • 22 messages

Posté 11 April 2014 - 14:47 PM

Merci pour ta réponse et tes remarques Monsieur Spi !

J'ai essayé de remédier au problème comme tu me l'as indiqué, en faisant :


toutes_les_cases.removeChild(un_mc_case);
 

mais cependant j'obtiens une nouvelle erreur...

Error #1006: removeChild is not a function.

Pourrais-tu m'aiguiller ? Merci de ton aide.

#4 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 11 April 2014 - 16:18 PM

Ton objet "toutes_les_cases" est un tableau, pas un displayObject (regarde la doc AS3 à ce sujet).

J'ai relu ton code, il faut factoriser quand tu le peux, voici un exemple, je ne sais pas si c'est ce que tu cherches à faire exactement, mais si ça peut aider :


var stock:Array;
var bloc:Case;
var W:int = stage.stageWidth;
var H:int = stage.stageHeight;
var combinaisons:Array;

init();

// initialisation du programme
function init():void{
       
        stock = [];
       
        // boucle pour créer les cases
        for (var i:int=1; i<10 ;i++){
                bloc = new Case();
                stock.push(bloc);
                bloc.gotoAndStop(i);
                bloc.valeur = 0;
                bloc.ref = i;
                bloc.x = ((i-1)%3)*bloc.width;
                  bloc.y = int((i-1)/3)*bloc.height;
                bloc.num.text = bloc.valeur;
                  bloc.addEventListener(MouseEvent.MOUSE_DOWN, clic_case);
                  addChild (bloc);
        }
       
        // tableau des combinaisons à valider
        combinaisons = [
                                        [1,2,3],
                                        [4,5,6],
                                        [7,8,9],
                                        [1,4,7]
                                        ]
       
}

// évenement au clic sur une case
function clic_case(e:Event):void {
       
        var ob = e.currentTarget;
        ob.removeEventListener(MouseEvent.MOUSE_DOWN, clic_case);
        ob.valeur = 1;
        ob.num.text = 1;
        checkWin();
       
}

// vérifie si combi gagnante
function checkWin():void{
       
        var num:int = 0;
        var win:int = 0
       
        // parcours toutes les combinaisons
        for(var i:int=0; i<combinaisons.length; i++){
                win = 0;
                for(var j:int=0; j<combinaisons[i].length; j++){
                        num = combinaisons[i][j]-1;
                        if(stock[num].valeur == 1) win++;
                        if (win == combinaisons[i].length) {
                                nettoieGrille(combinaisons[i]);
                                return;
                        }
                }      
        }
}

// nettoie la grille
function nettoieGrille(combi:Array):void{
        for(var i:int=0; i<stock.length; i++){
                if(combi.indexOf(stock[i].valeur)==-1){
                        removeChild(stock[i]);
                }
        }
}

 

Fichier(s) joint(s)






Répondre à ce sujet



  

1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP