代码之家  ›  专栏  ›  技术社区  ›  Dimentio

类型强制失败:无法将[]@13a355b9转换为flash。陈列显示对象

  •  0
  • Dimentio  · 技术社区  · 7 年前

    我在运行时遇到这个错误,没有编译错误。

    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]等替代方案。父母亲removeChild(circlearray1[i][0]);如果(circlearray1[i][0]是形状),但没有骰子。

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Organis    7 年前

    可能,这部分:

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

    指定给端点元素,最初假定为 形状 这些元素是 大堆 s、 然后你去 圆圈1[i][0] 如果是的话 形状 如果它不是空的,但已经是 大堆 由于上述任务。可能是打字错误,你的意思是:

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

    实际上有一种更干净的方法可以做到这一点。 大堆 在AS3中很像C# 阵列列表 ,可以在任意一端插入元素,也可以从任意一端提取元素,而无需手动重新索引元素:

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