1

Flash Professional CS5プラットフォームのActionScript3で開発しようとしているいくつかの機能で問題のある問題が発生し、誰かが私を正しい方向に向けることができるかどうか疑問に思っていました。

バックグラウンド

私のActionScriptクラス内で、同じMovieClip(user_shape)の複数のインスタンスをステージに動的に追加して、ユーザーがプログラムの初期段階で設計したシェイプを形成するMouseEvent関数を作成しました。

この形状効果は、多次元ブールベースの配列の全長をループしてtrueのインスタンス(以前のユーザーのアクションによって決定された)を探し、その場合はMovieClipをステージに追加するForループによって実現されます。 。

シングルクリックで追加されたMovieClipsの各グループには、常に同じインスタンス名(user_shape)が割り当てられますが、バッチを追加するたびに1ずつ増加する数値変数を含めることで設定した一意のIDが常に割り当てられます。 'user_shape' MovieClipsを左クリックして、ステージに移動します。

ユーザーは、ステージに追加する前に、最大8つの異なる色から選択して(選択ボックスを介して)形状に割り当てることができます。これらの8色のそれぞれに、数値変数(shapeCounterBlue、shapeCounterRedなど)を追加しました。これは、ステージに特定の色の形状を追加するたびに基本的に++をカウントし、同様にカウントします-形状を削除することを選択した場合。

メイン関数を使用して図形を追加するときに、動的なtextFieldを各MovieClipにアタッチし、選択した特定の色の可変カウンター番号を入力します(下の画像を参照)。

形

問題

OK、これが私の問題です。ステージから図形を削除したときに動的に再入力して更新するには、色付きの図形ごとに一意の番号(白で表示)が必要です。添付の画像でわかるように、2番目の青い図形を削除すると、3番目の青い図形の番号を3から2に戻す必要があります。

同様に、ステージ上に6つの赤い図形があり、3つ目の図形を削除することにした場合、図形4、5、6(3が削除される前)では、それぞれの番号を3,4,5に変更する必要があります。

または、4つの緑色の図形を作成して、最初の図形を削除することもできます。これは、形状2、3、4を実際に1、2、3に変更する必要があることを意味します。

あなたはその考えを理解します。しかし、私がこれをどのように達成できるか誰かが知っていますか?

私の問題は、各MovieClipのtextFieldsがForループを介してuser_shape子に動的に追加されるという事実によってさらに妨げられています。つまり、ASクラス内では、これらのtextFieldsを公に宣言して、その中の値にアクセスすることができませんでした。これらは、形状の追加関数で使用されるForループにのみ存在し、他の場所には存在しないためです。

よろしくお願いします。

4

1 に答える 1

0

動的に作成されたテキストフィールドのターゲティングについて。ループで、後でアクセスできる名前を割り当てます。

for(i:int=0;i<myArray.length;i++){
  var txt:TextField = new TextField();
  txt.name = "txt_" + i;
  this.addChild(txt);
}

次に、ループの外側のテキストフィールドにアクセスするには、次のようにターゲットを設定します。

var targetTxt:TextField = this.getChildByName("txt_10");

アップデート

さて、私はしばらく時間があり、先に進んであなたの問題全体を解決しました

ここに画像の説明を入力してください

ソースFLA / ASファイルをダウンロードします

さて、ライブラリには、コードで呼び出すMCがいくつかあります。ラベルテキストフィールド、境界線、および色をターゲットにできる背景MCを持つBoxMCを作成しました。

1つをクリックすると(各ボックス内のmouseEventからトリガーされる)、すべてのボックスをループするcountColors()を作成しました。配列内のさまざまな色の合計をカウントし、カスタムイベントを送信して、ラベルを更新するために色の合計を取得できることをすべてのボックスに通知します。

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

main.as

package  {

import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.Event;

public class main extends MovieClip {

    public static var ROOT:MovieClip;
    public var totalBoxes:int = 100;
    public var boxContainer:Sprite;
    public static var colorArray:Array = [0xFF0000, 0x0000FF, 0x00FF00];
    public static var colorCount:Array = [0,0,0];
    public static var currentColor = 0;

    public function main() {

        // set ref to this
        ROOT = this; // so I can get back to it from the boxes

        // color selection
        redBtn.addEventListener(MouseEvent.CLICK, chooseColor);
        blueBtn.addEventListener(MouseEvent.CLICK, chooseColor);
        greenBtn.addEventListener(MouseEvent.CLICK, chooseColor);

        // add box container to stage
        boxContainer = new Sprite();
        boxContainer.x = boxContainer.y = 10;
        this.addChild(boxContainer);

        var row:int=0;
        var col:int=0;
        for(var i:int=0; i < totalBoxes; i++){

            var box:Box = new Box();
            box.x  = col * box.width;
            box.y = row * box.height;
            box.name = "box_" + i;
            box.ID = i;
            box.updateDisplay();
            boxContainer.addChild(box);


            if(col < 9){
                col++;
            }else{
                col = 0;
                row++;
            }
        }

    }

    private function chooseColor(e:MouseEvent):void
    {

        var btn:MovieClip = e.currentTarget as MovieClip;

        switch(btn.name)
        {
            case "redBtn":
                currentColor=0;
                break;
            case "blueBtn":
                currentColor=1;
                break;
            case "greenBtn":
                currentColor=2;
                break;  
        }

        // move currentColorArrow
        currentColorArrow.x = btn.x;

    }

    public function countColors():void
    {
        colorCount = [0,0,0]; // reset array
        for(var i:int=0; i < totalBoxes; i++){
            var box:Box = boxContainer.getChildByName("box_" + i) as Box;
            if(box.colorID > -1)
            {
                colorCount[ box.colorID ]++;
            }
        }

        // send custom event that boxes are listening for
        this.dispatchEvent(new Event("ColorCountUpdated"));
    }
}

}

Box.as

package  {

import flash.display.MovieClip;
import flash.geom.ColorTransform;
import flash.events.MouseEvent;
import flash.events.Event;


public class Box extends MovieClip {

    public var ID:int;
    public var colorID:int = -1;
    private var active:Boolean = false;
    private var bgColor:Number = 0xEFEFEF;

    public function Box() {

        this.addEventListener(MouseEvent.CLICK, selectBox);
        main.ROOT.addEventListener("ColorCountUpdated", updateCount); // listen to root for custom event to update display

    }

    public function updateDisplay() {

        if(active == false){
            boxLabel.htmlText = "<font color='#000000'>"+ ID +"</font>";
        }else{
            boxLabel.htmlText = "<font color='#FFFFFF'>"+ main.colorCount[colorID] +"</font>";
        }

        var myColorTransform = new ColorTransform();
        myColorTransform.color = bgColor;
        boxBG.transform.colorTransform = myColorTransform;

    }

    private function selectBox(e:MouseEvent):void
    {   

        // set bgColor
        if(active == false){
            bgColor = main.colorArray[main.currentColor];
            colorID = main.currentColor;
        }else{
            bgColor = 0xEFEFEF;
            colorID = -1;
        }

        // set active state
        active = !active // toggle true/false
        main.ROOT.countColors();
    }

    private function updateCount(e:Event):void
    {
        updateDisplay();
    }

}

}

于 2012-10-20T03:18:06.770 に答える