Flash AS3 - 将多个变量名称组合在一起以定位新变量

时间:2012-01-31 15:40:09

标签: flash actionscript-3 variables object

我还在学习flash和actionscript 3,我遇到了变量和对象名称的问题。我需要能够将变量名称组合在一起(就像php可以通过var1.var2结合起来一样)。

我的swf包含4个加载器( image1_loader,image2_loader等.. ),它们是( image1_content,image2_content等... ...的孩子) 然后我有4个按钮将图像加载到加载器中,同时这样做它们定义了当前活动的加载器。 最后我有4个控制按钮 - 按比例向上/向下和顺时针/逆时针旋转,这应该只控制当前活动的加载器(由上面的按钮设置)

所以我的按钮以及加载图像都有事件监听器:

image1_btn.addEventListener(MouseEvent.CLICK, setCurrentSelection);
image2_btn.addEventListener(MouseEvent.CLICK, setCurrentSelection); 

(等等......)

function setCurrentSelection(e:MouseEvent):void {
    if (e.currentTarget===image1_btn){activeLoader='image1';}
    if (e.currentTarget===image2_btn){activeLoader='image2';}
    if (e.currentTarget===image3_btn){activeLoader='image3';}
    if (e.currentTarget===image4_btn){activeLoader='image4';}
}

因此,在将activeLoader设置为字符串'imageX'后,我有一个控制功能,如旋转一个:

rotateClock_btn.addEventListener(MouseEvent.MOUSE_DOWN, rotateClockwise);
rotateAnti_btn.addEventListener(MouseEvent.MOUSE_DOWN, rotateAntiClockwise);

function rotateClockwise(event:Event):void {
    rotateAroundCenter(imageX_content, 10, ptR);
}

function rotateAntiClockwise(event:Event):void {
    rotateAroundCenter(imageX_content, -10, ptR);
}

所以在rotateClockwise和rotateAntiClockwise函数中,我需要能够识别哪个是当前活动的加载器并且具有该数字而不是X - 所以如果它是image1_loader - 它需要是image1_content,如果4 - image4_content ... 我试图这样做,但它不喜欢它是一个字符串:

rotateAroundCenter((activeLoader+'_content'), 10, ptR);

请任何人帮助我理解如何解决(对不起,如果我没有清楚地解释它!)并且请放轻松我 - 我正在学习,因为我自己去了

劳伦:)

3 个答案:

答案 0 :(得分:0)

如果您有一对一的内容DisplayObjects to Loaders,您可以将内容保存在变量中。

function setCurrentSelection(e:MouseEvent):void {
    if (e.currentTarget===image1_btn){activeContent=image1_content;}
    if (e.currentTarget===image2_btn){activeContent=image2_content;}
    if (e.currentTarget===image3_btn){activeContent=image3_content;}
    if (e.currentTarget===image4_btn){activeContent=image4_content;}
}

function rotateClockwise(event:Event):void {
    rotateAroundCenter(image4_content, 10, ptR);
}

如果由于某种原因你需要存储加载器的字符串名称,你可以这样做

function rotateClockwise(event:Event):void {
    rotateAroundCenter(getChildByName(activeLoader+"_content"), 10, ptR);
}

如果image1_loader和其他人在舞台上。

更好的是,您可以使用冒泡并执行此操作(假设您的图像和内容DisplayObjects在同一范围内)。

addEventListener(MouseEvent.CLICK, setCurrentSelection);

function setCurrentSelection(e:MouseEvent):void {
    var name:String = e.target.name;
    var index:int = name.indexOf("_btn");
    if (index == -1) return;
    activeLoader = name.substr(0, index);    
}

function rotateClockwise(event:Event):void {
    rotateAroundCenter(getChildByName(activeLoader+"_content"), 10, ptR);
}

答案 1 :(得分:0)

我认为这就是你要做的......

rotateAroundCenter(getChildByName([activeLoader+"_content"]), 10, ptR);

答案 2 :(得分:0)

您可以将与一个项目相关的所有元素存储在自定义对象中,并使用这些对象的数组来存储它们。这样,你a)避免繁琐地比较名称字符串,b)创建一个可能接受gzillion加载器的解决方案,如果需要的话;)

var numLoaders : int = 4;
var items : Array = [];
var activeItem : Object = null;

init();

function init() : void {
    var i: int = -1;
    while (++i < numLoaders) {
        var item : Object = { 
           btn: getChildByName ("image"+i+"_btn"), 
           image: getChildByName ("image"+i+"_content") 
        };
        item.btn.addEventListener (MouseEvent.CLICK, setSelection);
        items.push ( item ); 
    } 
}

function setSelection (e:Event) : void {
    var i:int = -1;
    while (++i < items.length) {
        if (e.currentTarget == items[i].btn) activeItem = item; // compare by reference, not by name!
        break;
    }
}

function rotateClockwise(event:Event):void {
    if (activeItem) rotateAroundCenter(activeItem, 10, ptR);
}

我选择了getChildByName(),因为我假设你已经在舞台上拥有这些元素 - 你也可以在创建循环中分配这些元素。

另外,我按惯例使用了基于0的索引号。如果您的商品从“image1”开始,请使用

var i : int = 0;
while (++i <= numLoaders) 

在第一个循环中。