AS3 - 动态重新填充一组MovieClip中保存的一系列textField

时间:2012-10-19 16:12:34

标签: actionscript-3

我遇到了一个问题,我试图在Flash Professional CS5平台上的ActionScript3中开发一些功能,并且想知道是否有人能指出我正确的方向吗?

背景

在我的ActionScript类中,我编写了一个MouseEvent函数,它可以动态地将同一个MovieClip(user_shape)的多个实例添加到舞台上,形成用户在程序的早期阶段设计的形状。 / p>

这种形状效果是通过For循环实现的,循环遍历基于多维布尔的数组的整个长度,寻找一个真实的实例(由之前用户的操作决定),然后将一个MovieClip添加到舞台上是这样的。

每一组MovieClip只需单击一次,同时总是具有相同的实例名称(user_shape),总是会分配一个唯一的ID,我通过包含一个数字变量来设置,每次我增加1通过左键单击将一批'user_shape'MovieClips添加到舞台。

在将其添加到舞台之前,用户可以从多达八种不同颜色中选择以指定其形状(通过选择框)。对于这八种颜色中的每一种,我都添加了一个数值变量(shapeCounterBlue,shapeCounterRed等),每当我向舞台添加某种颜色的形状时,它基本上都会计算++,如果我选择去除一个形状,它也很重要

当通过我的main函数添加一个形状时,我将动态textField附加到每个MovieClip,并使用我选择的特定颜色的变量计数器编号填充它(参见下图)。

shapes

问题

好的,所以这是我的问题。我需要每个彩色形状的唯一编号(以白色显示),以便在从舞台上移除形状时动态重新填充和更新。正如你在附图中看到的那样,如果我要移除第二个蓝色形状,我的第三个蓝色形状的数字将需要从3恢复为2.

同样如果我在舞台上有六个红色形状并且我决定移除第三个,那么形状4,5,6(在删除3之前)将需要将它们的数字分别改为3,4,5

或者我可以有四个绿色形状并移除第一个形状;这意味着形状2,3,4实际上需要变为1,2,3。

你明白了。但有人知道我怎么能做到这一点吗?

我的问题进一步受到阻碍,因为每个MovieClip的textField都是通过我的For循环动态添加到user_shape Child的。这意味着在我的AS类中,我无法公开声明这些textField并访问其中的值,因为它们仅存在于我的添加形状函数中使用的For循环中,而不存在于其他位置。

非常感谢提前。

1 个答案:

答案 0 :(得分: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");

更新

好的,所以我有一些时间,继续解决你的整个问题

enter image description here

Download Source FLA/AS files

好的,所以我在代码中调用了库中的一些MC。我创建了一个Box MC,它具有标签文本字段,边框和背景MC,我可以将其定位为颜色。

我创建了一个countColors(),一旦你点击一个盒子就会循环遍历所有盒子(从每个盒子里的mouseEvent触发)。它计算数组中不同颜色的总数,然后发送一个自定义事件,让所有框都知道他们可以获取颜色总数来更新其标签。

我希望这会有所帮助。

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();
    }

}

}