【问题标题】:ActionScript 3 Array Casting problem in Flash CS4Flash CS4 中的 ActionScript 3 数组转换问题
【发布时间】:2009-07-06 12:36:11
【问题描述】:

我有这些数组

   //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()




}

【问题讨论】:

  • 在您的代码中,您有一个名为“elements”的数组和一个名为“allElements”的数组。看起来他们应该是一样的。
  • 另外,var 关键字需要在括号内 -- for (var i:uint...)
  • oxmo 发布的正确答案...但是,令我惊讶的是,您的代码运行...例如: Puzzle.polozaj.(container[i]) ... 必须是一个错字某种或什么...问候

标签: flash actionscript-3 arrays casting flash-cs4


【解决方案1】:

el1_sprClass 对象而不是 Sprite

你应该这样做:

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

为了得到你的Sprite对象。

【讨论】:

    【解决方案2】:

    看起来您可以将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 数组,或者创建 @ 987654327@.

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      Sprite 确实继承自 DisplayObject。

      继承链如下所示:

      Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject

      我对您的代码的问题是这样的:

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

      【讨论】:

      • 一个数组是无类型的,所以它实际上是正确的做法。
      • @blackberryoctopus -- 是的,早上的开始很糟糕。在有人看到之前无法足够快地纠正我的答案。 :) 感谢您的更正。将来,最好将那些错误的答案放在 cmets 中,以免在问题答案得到修复后使您的答案变得混乱。
      【解决方案4】:

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

      您设置了局部变量v,但从不使用它,当您使用operator 进行转换时,如果无法进行转换,则返回null。所以这里不会出错。

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

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

      【讨论】:

        【解决方案5】:

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

        elements Array 中的值是来自 Flash 库的对象 el1_spr、el2_spr、el3_spr 是符号属性中的类名称。 符号的基类是 flash.display.Sprite(Symbol Properties) 我需要将此库精灵添加到舞台并使用 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()
        

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

            一般来说,使用数组字面量代替构造函数会更好。在 AS3 中有很大的不同:ActionScript 3 Array constructor vs Array literals benchmark

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

            【讨论】:

              猜你喜欢
              • 2014-10-24
              • 2013-11-21
              • 1970-01-01
              • 1970-01-01
              • 2010-11-25
              • 2011-09-25
              • 2013-09-10
              • 1970-01-01
              • 2011-04-04
              相关资源
              最近更新 更多