我遇到了一个问题,我试图在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,并使用我选择的特定颜色的变量计数器编号填充它(参见下图)。
问题
好的,所以这是我的问题。我需要每个彩色形状的唯一编号(以白色显示),以便在从舞台上移除形状时动态重新填充和更新。正如你在附图中看到的那样,如果我要移除第二个蓝色形状,我的第三个蓝色形状的数字将需要从3恢复为2.
同样如果我在舞台上有六个红色形状并且我决定移除第三个,那么形状4,5,6(在删除3之前)将需要将它们的数字分别改为3,4,5
或者我可以有四个绿色形状并移除第一个形状;这意味着形状2,3,4实际上需要变为1,2,3。
你明白了。但有人知道我怎么能做到这一点吗?
我的问题进一步受到阻碍,因为每个MovieClip的textField都是通过我的For循环动态添加到user_shape Child的。这意味着在我的AS类中,我无法公开声明这些textField并访问其中的值,因为它们仅存在于我的添加形状函数中使用的For循环中,而不存在于其他位置。
非常感谢提前。
答案 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");
好的,所以我有一些时间,继续解决你的整个问题
(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();
}
}
}