-1

我有这些数组

   //Array elements are Sprites (Class) in Flash Library

    var elements:Array  = new Array (el1_spr, el2_spr, el3_spr);
    var container:Array = new Array();

    for var (i:uint; allElements.length; i++){
       container.push(allElements[i]);
       var v:Sprite = (allElements[i] as Sprite);

    addChild(container[i]);
    Puzzle.polozaj.(container[i]);

//Error is:
//TypeError: Error #1034: Type Coercion failed: cannot convert el1_spr$ to flash.display.DisplayObject.
    at project_fla::MainTimeline/frame1()




}
4

7 回答 7

1

el1_spr是一个Class对象不是一个Sprite

你应该做:

var s:Sprite = new el1_spr() as Sprite;

为了得到你的Sprite对象。

于 2009-07-06T14:08:41.220 回答
0

看起来您可能可以添加v到显示列表中,而不是container[i]. 你试过吗?

更新:实际上,我认为问题来自循环定义中的第二项。应该是i < allElements.length,而不是allElements.length。按照您设置它的方式,它运行的时间比它应该运行的多一倍。

下面是一些工作代码,基于您在上面发布的内容。如果我需要澄清一下,请给我留言(任何人 - 到目前为止,这是一个艰难的早晨......)。

var el1_spr:Sprite = new Sprite;
var el2_spr:Sprite = new Sprite;
var el3_spr:Sprite = new Sprite;

el1_spr.graphics.beginFill(0x0000FF);
el1_spr.graphics.moveTo(0,0);
el1_spr.graphics.lineTo(100,0);
el1_spr.graphics.lineTo(100,100);
el1_spr.graphics.lineTo(0,100);
el1_spr.graphics.lineTo(0,0);
el1_spr.graphics.endFill();

el2_spr.graphics.beginFill(0x00FF00);
el2_spr.graphics.moveTo(0,0);
el2_spr.graphics.lineTo(100,0);
el2_spr.graphics.lineTo(100,100);
el2_spr.graphics.lineTo(0,100);
el2_spr.graphics.lineTo(0,0);
el2_spr.graphics.endFill();

el3_spr.graphics.beginFill(0xFF0000);
el3_spr.graphics.moveTo(0,0);
el3_spr.graphics.lineTo(100,0);
el3_spr.graphics.lineTo(100,100);
el3_spr.graphics.lineTo(0,100);
el3_spr.graphics.lineTo(0,0);
el3_spr.graphics.endFill();

var elements:Array  = new Array (el1_spr, el2_spr, el3_spr);
var container:Array = new Array();

for (var i:uint; i < elements.length; i++)
{
    container.push(elements[i]);
    var v:Sprite = (elements[i] as Sprite);

    addChild(v);
    //addChild(elements[i]);        // this also works
    //addChild(container[i]);       // this also works

    v.x += (100 * i);
    //elements[i].x += (100 * i);   // this also works
    //container[i].x += (100 * i);  // this also works
}

我不知道你的代码的上下文是什么,但为了它可能的价值,我添加了几行额外的行来表明你不一定需要container数组,或者创建v.

希望这会有所帮助。

于 2009-07-06T13:18:53.363 回答
0

Sprite 确实继承自 DisplayObject。

继承链如下所示:

Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject

我对您的代码的问题是:

为什么要将已经是 Sprite 的对象投射到 Sprite ?

于 2009-07-06T13:26:05.650 回答
0

您首先声明elements,但后来您使用allElements. 应该是这样吗?

您设置了局部变量v但从不使用它,当您使用 as operatornull 进行转换时,如果转换不可行,则返回。所以你不会在这里得到错误。

对我来说,这看起来allElements不包含任何DisplayObject元素。

还有这条线Puzzle.polozaj.(container[i]);,看起来有点奇怪。也许你在polozaj之后有一个点?

于 2009-07-06T13:44:24.323 回答
0

谢谢你的帮助。我在这里清除了代码和上下文。

元素数组中的值是 Flash 库中的对象 el1_spr、el2_spr、el3_spr 是符号属性中的类名称。符号的基类是 flash.display.Sprite(Symbol Properties) 我需要将此库 Sprites 添加到舞台并使用 Puzzle.polozaj(Class, Method) 处理它们。

var elements:Array = new Array (el1_spr, el2_spr, el3_spr);

for (var i:uint; i < elements.length; i++){

    addChild(elements[i]);
    Puzzle.polozaj(elements[i]);

}
//TypeError: Error #1034: Type Coercion failed: cannot convert a1_spr$ to flash.display.DisplayObject.
    at puzzle_fla::MainTimeline/frame1()
于 2009-07-06T15:37:25.943 回答
0

我解决了这个问题。我只需要创建符号的新实例,并将变量名称作为引用放在数组中。

有没有一个选项可以将线程标记为已解决?

顺便说一句,很棒的网站!

于 2009-07-06T16:59:01.197 回答
0

通常,使用数组文字而不是构造函数是一个更好的主意。在 AS3 中有很大的不同:ActionScript 3 Array constructor vs Array literals benchmark

当然,考虑到上述情况,使用 Vector 会更好。

于 2009-12-21T00:23:34.110 回答