1

そのため、addChild() を使用してライブラリからムービー クリップを正常に追加しましたが、動的に追加されたムービークリップに含まれていたいくつかのムービークリップにアクセスしたいと考えています。

標準のドット表記を使用し、インスタンス名を渡す getChildByName も使用しました。

ここで何が欠けていますか?

----編集済み----

ループスルーの提案を試み、インデックスでアクセスできますが、これを行う方法として直感的ではないようです...以下は、以前に試した2つの例で、すべて「1119:アクセス」として返されます静的タイプの flash.display:DisplayObject を使用した参照を通じて、未定義のプロパティ nameText の可能性があります。」または「1061: 静的タイプの flash.display:DisplayObject の参照を介して、未定義の可能性があるメソッド getChildByName を呼び出します。」

ドット表記の例:

 //  build circlular display
function buildCircle() {
    trace("buildCircle()");
    if (viewByState == "assignment") {

        var competencyContainer:MovieClip = new MovieClip();
        competencyContainer.name = "competencyContainer";
        this.addChild(competencyContainer);

        var angleSegment:Number = 360 / competenciesArray.length;
        var angleSum:Number = 360 - angleSegment / 2;

        for (var i:Number = 0; i < competenciesArray.length; i++) {

            var competencyInstance:competencyCircle = new competencyCircle();
            competencyInstance.name = "competency" + i;
            competencyContainer.addChild(competencyInstance);


            competencyContainer.getChildByName("competency" + i).x = circleCenter.x - (Math.sin(angleSum * (Math.PI / 180)) * (circleSize / 2));
            competencyContainer.getChildByName("competency" + i).y = circleCenter.y - (Math.sin((90 - angleSum) * (Math.PI / 180)) * (circleSize / 2));


            competencyContainer.getChildByName("competency" + i).nameText.wordWrap = true;
            competencyContainer.getChildByName("competency" + i).nameText.embedFonts = true;
            competencyContainer.getChildByName("competency" + i).nameText.htmlText = "COMPETENCY:<br />" + competenciesArray[i].name;

            competencyContainer.getChildByName("competency" + i).nameText.setTextFormat(tfTitle, 0, competencyContainer.getChildByName("competency" + i).nameText.text.length - competenciesArray[i].name.length);

            competencyContainer.getChildByName("competency" + i).nameText.setTextFormat(tfName, competencyContainer.getChildByName("competency" + i).nameText.text.length - competenciesArray[i].name.length, competencyContainer.getChildByName("competency" + i).nameText.text.length);

            competencyContainer.getChildByName("competency" + i).nameText.autoSize = TextFieldAutoSize.CENTER;

            competencyContainer.getChildByName("competency" + i).nameText.y = -(competencyContainer.getChildByName("competency" + i).nameText.height / 2);

            competencyContainer.getChildByName("competency" + i).filters = [circleDefaultDropShadow];
            competencyContainer.getChildByName("competency" + i).selectedIndicator.visible = false;

            competencyContainer.getChildByName("competency" + i).hit.buttonMode = true;
            competencyContainer.getChildByName("competency" + i).hit.mouseEnabled = true;
            competencyContainer.getChildByName("competency" + i).hit.tabEnabled = true;
            competencyContainer.getChildByName("competency" + i).hit.mouseChildren = true;

            competencyContainer.getChildByName("competency" + i).hit.addEventListener(MouseEvent.MOUSE_OVER, function(e:MouseEvent) {
                                                                                     e.target.parent.filters = [circleHoverDropShadow];
                                                                                     });

            competencyContainer.getChildByName("competency" + i).hit.addEventListener(MouseEvent.MOUSE_OUT, function(e:MouseEvent) {
                                                                                     e.target.parent.filters = [circleDefaultDropShadow];
                                                                                     });

            competencyContainer.getChildByName("competency" + i).hit.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) {
                                                                                     e.target.parent.filters = [circleDefaultDropShadow];
                                                                                     e.target.parent.selectedIndicator.visible = true;
                                                                                     });

            angleSum -= angleSegment;
            trace("end");
            trace(i);
            trace("\n\n\n");
        }
    } else if (viewByState == "competency") {



    } else {

    }
}
buildCircle();

.getChildByName() を使用した例:

    //  build circlular display
  function buildCircle() {
    trace("buildCircle()");
    if (viewByState == "assignment") {

        var competencyContainer:MovieClip = new MovieClip();
        competencyContainer.name = "competencyContainer";
        this.addChild(competencyContainer);

        var angleSegment:Number = 360 / competenciesArray.length;
        var angleSum:Number = 360 - angleSegment / 2;

        for (var i:Number = 0; i < competenciesArray.length; i++) {

                var competencyInstance:competencyCircle = new competencyCircle();
                competencyInstance.name = "competency" + i;
                competencyContainer.addChild(competencyInstance);


                competencyContainer.getChildByName("competency" + i).x = circleCenter.x - (Math.sin(angleSum * (Math.PI / 180)) * (circleSize / 2));
                competencyContainer.getChildByName("competency" + i).y = circleCenter.y - (Math.sin((90 - angleSum) * (Math.PI / 180)) * (circleSize / 2));


                competencyContainer.getChildByName("competency" + i).getChildByName("nameText").wordWrap = true;
                competencyContainer.getChildByName("competency" + i).getChildByName("nameText").embedFonts = true;
                competencyContainer.getChildByName("competency" + i).getChildByName("nameText").htmlText = "COMPETENCY:<br />" + competenciesArray[i].name;

                competencyContainer.getChildByName("competency" + i).getChildByName("nameText").setTextFormat(tfTitle, 0, competencyContainer.getChildByName("competency" + i).getChildByName("nameText").text.length - competenciesArray[i].name.length);

                competencyContainer.getChildByName("competency" + i).getChildByName("nameText").setTextFormat(tfName, competencyContainer.getChildByName("competency" + i).getChildByName("nameText").text.length - competenciesArray[i].name.length, competencyContainer.getChildByName("competency" + i).getChildByName("nameText").text.length);

                competencyContainer.getChildByName("competency" + i).getChildByName("nameText").autoSize = TextFieldAutoSize.CENTER;

                competencyContainer.getChildByName("competency" + i).getChildByName("nameText").y = -(competencyContainer.getChildByName("competency" + i).getChildByName("nameText").height / 2);

                competencyContainer.getChildByName("competency" + i).filters = [circleDefaultDropShadow];
                competencyContainer.getChildByName("competency" + i).getChildByName("selectedIndicator").visible = false;

                competencyContainer.getChildByName("competency" + i).getChildByName("hit").buttonMode = true;
                competencyContainer.getChildByName("competency" + i).getChildByName("hit").mouseEnabled = true;
                competencyContainer.getChildByName("competency" + i).getChildByName("hit").tabEnabled = true;
                competencyContainer.getChildByName("competency" + i).getChildByName("hit").mouseChildren = true;

                competencyContainer.getChildByName("competency" + i).getChildByName("hit").addEventListener(MouseEvent.MOUSE_OVER, function(e:MouseEvent) {
                                                                                                                                                                 e.target.parent.filters = [circleHoverDropShadow];
                                                                                                                                                                 });

                competencyContainer.getChildByName("competency" + i).getChildByName("hit").addEventListener(MouseEvent.MOUSE_OUT, function(e:MouseEvent) {
                                                                                                                                                                 e.target.parent.filters = [circleDefaultDropShadow];
                                                                                                                                                                 });

                competencyContainer.getChildByName("competency" + i).getChildByName("hit").addEventListener(MouseEvent.CLICK, function(e:MouseEvent) {
                                                                                                                                                                 e.target.parent.filters = [circleDefaultDropShadow];
                                                                                                                                                                 e.target.parent.getChildByName("selectedIndicator").visible = true;
                                                                                                                                                                 });

                angleSum -= angleSegment;
                trace("end");
                trace(i);
                trace("\n\n\n");
        }
    } else if (viewByState == "competency") {



    } else {

    }
}
buildCircle();
4

6 に答える 6

3

クリップを作成するときにこれを使用するのはどうですか:

...
competencyInstance.name = "competency" + i;  
competencyContainer.addChild (competencyInstance);          
// this is the additional line, cecessary for accesing later by name
competencyContainer["clipFichaEjemplo2"] = competencyInstance;
...

そして、これは後でそれらにアクセスするためのものです:

...
var M:MovieClip = clipMapa["competency" + i];
...

addChildを動的に使用する際に問題がある同様のフラッシュプロジェクトで私にとってはうまくいきました。

ihih: お役に立てば幸いです :)

于 2010-08-13T04:24:07.063 に答える
1

AS3 では、AS2 で使用されていたようにドット表記が機能しません。子の名前を親オブジェクトの変数として明示的に宣言した場合にのみ、これを使用できます。getChildByName2 人の兄弟が同じ名前を持つことはできないという規則がないため、信頼性も低くなります。getChildAtすべての子をループするために使用します。次のようなものを試してください:

//assuming newMC as the added movie clip
var num:Number = newMC.numChildren;
for(var i:Number = 0; i < num; i++)
{
  var child:DisplayObject = newMC.getChildAt(i);
  trace(child.name);
}
于 2009-09-25T13:27:42.870 に答える
1

動的に追加されたムービークリップへの参照が必要です。インスタンス名があれば、特定の子ムービークリップにアクセスできます。

したがって、インスタンス名が「a」のムービークリップがあり、その中にインスタンス名が「b」のムービークリップがある場合は、単に ab として参照できます。その場合、ムービークリップの 1 つだけがアクセスされます。

于 2009-09-25T14:34:03.763 に答える
1

次のコードのように試すことができます。

//prizma, küp, dortgen, koni, kure, silindir are mc's name
var movieList:Array = [prizma, küp, dortgen, koni, kure, silindir];
var k:Number=Math.round(Math.random()*5);
var nes:MovieClip=new movieList [k] ();
addChild(nes);
于 2016-01-05T21:27:56.120 に答える
0

わかりました、私はあなたのコードを数回読みましたが、次のことを指摘したいと思います。

以下は、コードのスニペットです。

 var competencyInstance:competencyCircle = new competencyCircle();
 competencyInstance.name = "competency" + i;
 competencyContainer.addChild(competencyInstance);

 competencyContainer.getChildByName("competency" + i).x = circleCenter.x - (Math.sin(angleSum * (Math.PI / 180)) * (circleSize / 2));
 competencyContainer.getChildByName("competency" + i).y = circleCenter.y - (Math.sin((90 - angleSum) * (Math.PI / 180)) * (circleSize / 2));

コンピテンシーインスタンスの属性を設定しているだけのように見えますが、何らかの理由で親を通じてそれを行っています。これは AS2 メソッドであるため、AS3 を学習している AS2 開発者であると想定します。オブジェクトへの参照が既にあり、親にアクセスする必要はありません。

コードは次のようになります。

 var competencyInstance:competencyCircle = new competencyCircle();
 competencyInstance.name = "competency" + i;

 competencyInstance.x = circleCenter.x - (Math.sin(angleSum * (Math.PI / 180)) * (circleSize / 2));
 competencyInstance.y = circleCenter.y - (Math.sin((90 - angleSum) * (Math.PI / 180)) * (circleSize / 2));
 competencyContainer.addChild(competencyInstance);

x と y は常に親に対して相対的です。

これらを理解する最善の方法は、各オブジェクトの名前をたどる親/コンテナーを反復処理することです。物事をさらに深くネストしたことを忘れていることに気付くかもしれません。

親を介して参照する長いドット構文ではなく、直接参照を介してオブジェクトにアクセスできるため、as3 表示リストは優れた機能です。親を介して物事にアクセスする必要があるのは、参照がない場合だけです。buildCircle() の実行中にのみアクセス可能なローカル変数 compencyInstance を作成しました。buildCircle() の実行が完了すると、その中で作成されたすべてのローカル変数の寿命が終わります。とはいえ、参照がない場合は、各子にアクセスする親メソッドを介して for ループを反復処理する必要があります。関係するものに。

于 2009-09-26T18:40:31.380 に答える
0

動的に読み込まれたライブラリ movieClip 内の子オブジェクトに簡単にアクセスできました。実際に、XML ドキュメント内の要素の数に基づいてボタンを作成する手動ループを作成しました。トゥイーン関数が呼び出され、アニメーションが完了すると、新しいボタン インスタンスが作成され、x 値の計算に従って配置されます。ここで作成したのは、Web サイトの Flash ナビゲーションです。ユーザーがボタンをクリックすると「選択」ムービークリップをオンにし、ユーザーが別のボタンを選択するとオフにしたいと思いました。

あなたは正しい方向に進んでおり、私は基本的にあなたが getChildByName メソッドで行っていたことを使用しました。for ループを使用すると、作成時に付けた名前 (この場合は "btn_" と変数 "i." の値) を参照することで、動的に読み込まれたボタンのすべての子にアクセスできました。つまり、"btn_0, btn_1、btn_2" など。その後、ボタンが btnGroup ムービー クリップに追加されました。したがって、本質的には、 getChildByName("movie clip name") を使用して btnGroup の子要素を参照し、その後に括弧 [""] の形式で子要素からアクセスするオブジェクトの名前を指定するだけで済みました。ストリング。以下の「マウス機能」の例を見て、答えを見つけてください

function btnMaker():void   
{  
  btnGroup.x = 170;  
  if(btnCount < clubXML.btn_group.*.length())  
  {  
    btnCount++;  
    b = new btn();  
    spacer = b.width-27;  
    b.x = (btnCount-1)*spacer;  
    b.y = 25;  
    b.name = "btn_"+(btnCount-1);//Name the dynamicly loaded movie clip  
    b.buttonMode = true;  
    b.mouseChildren = false;  
    b.btn_txt.text = clubXML.btn_group.btn[btnCount-1];  
    b.addEventListener(MouseEvent.CLICK, mouseFunctions);  
    b.addEventListener(MouseEvent.MOUSE_OVER, mouseFunctions);  
    b.addEventListener(MouseEvent.MOUSE_OUT, mouseFunctions);  
    b.grid_mc.stop();  
    b.grid_mc.visible = false;  
    b.select.visible = false;  
    btnGroup.addChild(b);  
    btnGroup.getChildByName("btn_0")["select"].visible = true;   
    tweenIn();  
  }  
  if(btnCount == clubXML.btn_group.*.length())  
  {  
    //btnTimer.stop();  
    xTween.removeEventListener(TweenEvent.MOTION_FINISH, animFinish);  
  }  
}  

function mouseFunctions(e:MouseEvent):void   
{  
  var btnName = e.target.name.substring(4, 5);   

  switch(e.type)   
  {   
    case("mouseOver"):   
      bounceIn = new Tween(e.target, "scaleY", Bounce.easeOut, 1.5, 1, 10, false);  
      e.target.gotoAndPlay(2);   
      e.target.getChildByName("grid_mc").visible = true;   
      //trace(e.target.getChildByName("grid_mc").totalFrames());   
      e.target.getChildByName("grid_mc").play();   
      break;   

    case("mouseOut"):   
      e.target.gotoAndPlay(12);   
      e.target.getChildByName("grid_mc").stop();   
      e.target.getChildByName("grid_mc").visible = false;   
      break;

    case("click"):   
      trace("Button Name: "+btnName);   

      currentSelection = e.target.name;   

      for(var i:int = 0; i < btnGroup.numChildren-1; i++)   
      {   
        btnGroup.getChildByName("btn_"+i)["select"].visible = false;     
      }  

      notIt != currentSelection;   

      if(currentSelection != notIt)   
      {   
        e.target.getChildByName("select").visible = true;   
      }   
      break;   
  }
}

これがお役に立てば幸いです。

平和

于 2009-10-13T22:11:51.433 に答える