1

我在 Flash Professional CS5 平台上尝试在 ActionScript3 中开发某些功能时遇到了一个问题,想知道是否有人可以为我指明正确的方向?

背景

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

这种形状效果是通过一个 For 循环来实现的,该循环遍历基于多维布尔数组的整个长度,以查找 true 的实例(由用户之前的操作确定),然后在这种情况下将 MovieClip 添加到舞台.

通过单击添加的每组 MovieClip,虽然始终具有相同的实例名称 (user_shape),但始终被分配一个唯一 ID,我通过包含一个数字变量来设置该 ID,该变量在每次添加批次时递增 1 'user_shape' MovieClips 通过左键单击到舞台。

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

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

形状

问题

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

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

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

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

我的问题进一步受到以下事实的阻碍:每个 MovieClip 的 textFields 通过我的 For 循环动态添加到 user_shape Child。这意味着在我的 AS 类中,我无法公开声明这些文本字段并访问其中的值,因为它们仅存在于我的添加形状函数中使用的 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。我创建了一个 Box MC,它有一个标签文本字段、一个边框和一个背景 MC,我可以将它们作为目标颜色。

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

我希望这有帮助。

主文件

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

}

盒子.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 回答