类型强制失败:无法将[] @ 13a355b9转换为flash.display.DisplayObject

时间:2018-02-14 19:06:54

标签: actionscript-3

运行时出现此错误,没有编译错误。

package  {
import flash.display.*;
import flash.events.*;
import flash.utils.*;

public class mainCode extends MovieClip{
    //global variables go here
    public var circled:Shape = new Shape();
    public var circled2:Shape = new Shape();
    public var circled3:Shape = new Shape();
    public var angled:int = new int();
    public var circlearray1:Array = new Array(4); 
    public var circlearray2:Array = new Array(4); 
    public function mainCode(){
        makeCircle(circled, 100);
        makeCircle(circled2, 50);
        makeCircle(circled3, 50);
        for(var i:int=0; i<4; i++){circlearray1[i] = new Array(20);}
        for(var n:int=0; n<4; n++){circlearray2[n] = new Array(20);}
        stage.addEventListener(Event.ENTER_FRAME, mainLoop);

    }
    //functions go here
    private function mainLoop(e:Event){
        trace(1);
        angled+=1;
        angled%=360;
        circled.x = stage.stageWidth / 2;
        circled.y = stage.stageHeight/ 2;
        circled2.x = circled.x + 100*Math.cos(radians(angled));
        circled2.y = circled.y + 100*Math.sin(radians(angled));
        circled3.x = circled.x + 100*Math.cos(radians((angled + 180) % 360));
        circled3.y = circled.y + 100*Math.sin(radians((angled + 180) % 360));
        trace(2);
        for (var i:int = 0; i < 4; i++)
        {
            trace(3);
            if (circlearray1[i][0] != undefined) 
            {removeChild(circlearray1[i][0]);}
            if (circlearray2[i][0] != undefined) 
            {removeChild(circlearray2[i][0]);}
            trace(4);
            for (var m:int = 0; m < 19; m++)
            {
                circlearray1[i][m] = circlearray1[m+1];
                circlearray2[i][m] = circlearray2[m+1];
            }
            circlearray1[i][19] = new Shape();
            circlearray2[i][19] = new Shape();
            makeCircle(circlearray1[i][19], 25);
            makeCircle(circlearray2[i][19], 25);
            circlearray1[i][19].x = circled2.x + 50*Math.cos(radians(((-angled + (i*90)) * 2) % 360));
            circlearray1[i][19].y = circled2.y + 50*Math.sin(radians(((-angled + (i*90)) * 2) % 360));
            circlearray2[i][19].x = circled3.x + 50*Math.cos(radians(((-angled + (i*90)) * 2) % 360));
            circlearray2[i][19].y = circled3.y + 50*Math.sin(radians(((-angled + (i*90)) * 2) % 360));
            trace(8);
        }
    }
    private function makeCircle(circles:Shape, radius:int)
    {
        circles.graphics.clear();
        circles.graphics.lineStyle(2,0x000000);
        circles.graphics.beginFill(0x990000);
        circles.graphics.drawCircle(0,0,radius);
        circles.graphics.endFill();
        addChild(circles);
    }
    private function degrees(radians:Number):Number
    {
        return radians * 180/Math.PI;
    }

    private function radians(degrees:Number):Number
    {
        return degrees * Math.PI / 180;
    }
    private function killCircle(circlei:Shape):void {
        removeChild(circlei);
    }
}   
}

我已将其追溯到{removeChild(circlearray1 [i] [0]);},它似乎正在返回错误。我不知道为什么会这样做,我已经尝试过诸如circlearray1 [i] [0] .parent.removeChild(circlearray1 [i] [0])等替代方案。如果(circlearray1 [i] [0]是形状)...,但没有骰子。

作为参考,我试图让一些圆圈围绕其他圆圈,但最外面的圆圈在移动时会留下“图像滞后”(或残像)。我这样做是通过创建对象并使用for循环和多维数组删除它们,因为我不想手动输入50个创建对象调用并手动编辑每个对象。

1 个答案:

答案 0 :(得分:1)

可能这部分:

        for (var m:int = 0; m < 19; m++)
        {
            circlearray1[i][m] = circlearray1[m+1];
            circlearray2[i][m] = circlearray2[m+1];
        }

您分配给端点元素,您最初认为 Shape 数组的元素。然后你去 circlearray1 [i] [0] ,假设它是 Shape ,如果它不是空的,但它已经是数组到期了到上面的任务。它可能是一个错字,你的意思是:

        for (var m:int = 0; m < 19; m++)
        {
            circlearray1[i][m] = circlearray1[i][m+1];
            circlearray2[i][m] = circlearray2[i][m+1];
        }

实际上这是一种更干净的方法。 AS3中的数组与C# ArrayList 非常相似,您可以在任何一端插入元素并从任一端提取元素,而无需手动重新索引元素:

        trace(3);
        // If you are sure the first element is not empty
        // you can get its reference removing them from 
        // the Array at the same time.
        removeChild(circlearray1[i].shift());
        removeChild(circlearray2[i].shift());
        trace(4);
        // All Array elements are automatically shifted
        // by -1 so you don't need to move each of them manually.
        circlearray1[i][19] = new Shape();
        circlearray2[i][19] = new Shape();