代码之家  ›  专栏  ›  技术社区  ›  dd .

Flash CS4中的ActionScript 3数组强制转换问题

  •  -1
  • dd .  · 技术社区  · 17 年前

       //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()
    
    
    
    
    }
    
    7 回复  |  直到 17 年前
        1
  •  1
  •   OXMO456    17 年前

    el1_spr 是一个 Class 对象不是a Sprite

    你应该这样做:

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

    为了得到你的 (传说中的)精灵 对象。

        2
  •  0
  •   blackberryoctopus    17 年前

    看来你可以添加 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 .

    希望这有帮助。

        3
  •  0
  •   Jacob Poul Richardt    17 年前

    Sprite确实继承了DisplayObject。

    继承链看起来像这样:

    雪碧->显示对象容器->交互式对象->显示对象

    我对你的代码的问题是:

    为什么要将一个已经是Sprite的对象转换为Sprite?

        4
  •  0
  •   Ross Henderson    17 年前

    你首先声明 elements 但后来你使用 allElements .有这样的说法吗?

    您设置了局部变量 v 但当你用as投球时,千万不要用它 operator 如果强制转换不可能,则返回null。所以你不会在这里出错。

    对我来说,这看起来像 所有元素 不包含 DisplayObject 元素。

    还有线 Puzzle.polozaj.(container[i]); ,看起来有点奇怪。也许你在波洛扎之后有点过分了?

        5
  •  0
  •   dd .    17 年前

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

    元素Array中的值是Flash库中的对象 符号的基本类别是闪光显示。Sprite(符号属性) 我需要将这个库精灵添加到舞台上,并用Puzzle.polozaj(类,方法)处理它们。

    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()
    
        6
  •  0
  •   dd .    17 年前

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

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

    很棒的网站btw!

        7
  •  0
  •   Ain Tohvri    16 年前

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

    当然,鉴于上述情况,使用Vector会更好。

    推荐文章