来自数组的as3影片剪辑动态名称为null

时间:2012-04-16 23:24:35

标签: arrays actionscript-3 flash

我正在使用下面的代码,当我“追踪(TheVar);”它出来了。有人知道为什么吗?

var TheVar:MovieClip; 
var myArray:Array = ["TheContent", "TheContent2"];

function RandomM()
{
    trace(myArray.length);
    var r = Math.round(Math.random() * myArray.length);
    trace(myArray[r]);
    var TheVar:MovieClip =  myArray[r] as MovieClip;
    trace(TheVar);
}

RandomM();

更新

我正在使用完整的代码来展示我想要做的事情

this.stage.scaleMode = StageScaleMode.NO_SCALE;
this.stage.align = StageAlign.TOP_LEFT;

var TheContent:Loader = new Loader();
var TheContent2:Loader = new Loader();

function Load1()
{
    TheContent.load(new URLRequest("1.png"));
    TheContent.contentLoaderInfo.addEventListener(Event.COMPLETE, LoadContent);

    function LoadContent(e:Event)
    {
        addChild(TheContent);
        TheContent.width = ScreenX;
        TheContent.height = ScreenY;
        Load2()
    }
}

function Load2()
{
    TheContent2.load(new URLRequest("2.png"));
    TheContent2.contentLoaderInfo.addEventListener(Event.COMPLETE, LoadContent);

    function LoadContent(e:Event)
    {
        trace("Jesus");
        addChild(TheContent2);
        TheContent2.width = ScreenX;
        TheContent2.height = ScreenY;
        RandomM();
    }
}


在函数RandomM()中,我想将Loader“TheVar”更改为其中一个Arrays,其中也是Loaders。我想最终创建一个补间,根据用户的滑动,它将在加载器之间进行更改。

var TheVar:MovieClip; 
var myArray:Array = [TheContent, "TheContent2"];

function RandomM()
{
    trace(myArray.length);
    var r = Math.round(Math.random() * myArray.length);
    trace(myArray[r]);
    var Base:Class = getDefinitionByName(myArray[r]) as Class;
    var TheVar:MovieClip = new Base();
}

Load1();



Multitouch.inputMode = MultitouchInputMode.GESTURE;

stage.addEventListener(TransformGestureEvent.GESTURE_SWIPE, fl_SwipeHandler);

function fl_SwipeHandler(event:TransformGestureEvent):void
{
    switch(event.offsetX)
    {
        // swiped right
        case 1:
        {
            // Start your custom code
            // This example code moves the selected object 200 pixels to the right.
            TheVar.x += 200;
            // End your custom code

            break;
        }
        // swiped left
        case -1:
        {
            // Start your custom code
            // This example code moves the selected object 200 pixels to the left.
            TheVar.x -= 200;
            // End your custom code

            break;
        }
    }

    switch(event.offsetY)
    {
        // swiped down
        case 1:
        {
            // Start your custom code
            // This example code moves the selected object 200 pixels down.
            TheVar.y += 200;
            // End your custom code
            break;
        }
        // swiped up
        case -1:
        {
            // Start your custom code
            // This example code moves the selected object 200 pixels up.
            TheVar.y -= 200;
            // End your custom code
            break;
        }
    }
}

添加更新到CLARIFY:

我有一个名为TheContent的LOADER:这是代码:

var TheContent:Loader = new Loader();

我想创建具有图像和SWF内容的SEVERAL“Loaders”。然后我想使用ONE TWEEN将它们移出屏幕,但是动态的补间动画因此它将根据我在TWEEN中制作MovieClip的VAR移动不同的LOADERS。要做到这一点,我需要为TWEEN ... CHANGEABLE制作电影。我想也许最好的方法是创建一个包含LOADERS所有名称的ARRAY,然后随机调用它们并在TWEEN中移动内容。因此,我做了一个阵列:

var myArray:Array = ["TheContent", "TheContent2"];

但我根本无法从RandomM()函数中获取随机变量;所以我以后可以在TWEEN中使用它。该Loader被称为“TheVar”;

function RandomM()
{

trace(myArray.length);
var r = Math.round(Math.random() * (myArray.length -1) );


var theMC:String = myArray[r];
TheVar=this[theMC] as MovieClip;

trace(TheVar); //// TO BE USED LATER IN A TWEEN. 
///   IT WILL BE ONE TWEEN BUT WILL ANIMATE DIFFERENT MOVIES

}

我希望这是有道理的。

3 个答案:

答案 0 :(得分:3)

"TheContent""TheContent2"是字符串,而非MovieClip。

如果这些是舞台上MovieClip的实例名称,则需要使用以下内容:

var myArray:Array = [this["TheContent"], this["TheContent2"]);

或更简单:

var myArray:Array = [TheContent, TheContent2];

假设您正在从时间线开始工作。


如果TheContentTheContent2是您拥有的类,则可以使用getDefinitionByName()从您拥有的字符串创建这些类的实例。例如:

var Base:Class = getDefinitionByName("TheContent") as Class;
var TheVar:MovieClip = new Base();

addChild(TheVar);

答案 1 :(得分:1)

你的问题在于这一行

var r = Math.round(Math.random() * myArray.length);

random将为您提供0到1之间的数字

myArray.length //will give (in your example) 2

让我们说随机给你的值为.75
.75 * 2 = 1.5
当你使用圆函数时,它将四舍五入到最接近的整数,在这种情况下为2(1.5和向上四舍五入)
当你有一个2时它超出你的数组索引,它应该给你一个null 您需要做的是

var r = Math.round(Math.random() * (myArray.length -1) );

然后,您需要访问正确的元素并获取影片剪辑的名称

var mcName:String = myArray[r]

然后访问影片剪辑本身

var THEVAR:MovieClip = this[mcName];
trace(THEVAR);

答案 2 :(得分:1)

根据您的修改,这里有一个答案可以帮助您解决问题。

首先,就像我提到的,你的数组包含字符串而不是加载器本身。你想这样做:

var myArray:Array = [ TheContent, TheContent2 ];

请注意,每个人都缺少"

要选择随机加载器并将其分配给TheVar,请执行以下操作:

var TheVar:Loader = Loader( myArray[int(Math.random() * myArray.length)] );

您现在可以按预期使用TheVar