簡體   English   中英

AS3 對象數組未添加到舞台

[英]AS3 Object Array not adding to stage

所以我一般都是 AS3 和 AS 的新手。 我確實在一定程度上了解 Java 和 PHP。

我正在嘗試通過編寫一個以編程方式創建十六進制地圖的應用程序來學習。 我正在使用一個六邊形庫,我將在下面包含它,但是,這是我的問題。 當我運行 for 循環時,例如 10 計數,然后創建一個形狀,添加形狀並繪制形狀,它沒有問題。 在同一個循環中,如果我將一個形狀推送到一個數組,然后添加該數組元素,然后繪制它,我什么也得不到。

package
{
    import flash.display.MovieClip;
    import flash.display.Shape;
    import flash.text.TextField;

    public class Main extends MovieClip
    {
        private var radius:Number = 30;
        private var sides:Number = 6;
        private var myrotation:Number = 0;
        private var lineColor:Number = 0x000000;
        private var lineThickness:Number = 1;
        private var l:TextField = new TextField();
        private var f:Array = new Array(20);
        public function Main()
        {
            l.text = "test";
            addChild(l);
            //WORKS should be red
            for(var j:int = 0; j<stage.stageWidth/(radius*2);j++)
            {
                var t:Polygon = new Polygon();
                addChild(t);
                t.drawPolygon(radius,sides,2*radius*j,radius*2,0xFF0000,lineThickness,myrotation);
            }

            //DOES NOT WORK (note the *3 is so it is lower down) should be blue
            for(var j:int = 0; j<stage.stageWidth/(radius*2);j++)
            {
                f.push(new Polygon());
                addChild(f[j]);
                f[j].drawPolygon(radius,sides,2*radius*j,radius*3,0x0000FF,lineThickness,myrotation);
            }   
        }
    }
}

我正在使用的多邊形類如下。 我從某個地方的互聯網上抓取了它。

 package
{
    import flash.display.MovieClip;
    import flash.events.Event;

    public class Polygon extends MovieClip
    {
        //PROPERTIES
        private var points:Array;

        private var id:int;
        private var ratio:Number;
        private var top:Number;

        private var fade_value:int;

        //CONSTRUCTOR
        public function Polygon()
        {
            addEventListener(Event.ADDED_TO_STAGE,init);
        }

        private function init(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE,init);
            stage.frameRate=31;
        }

        //METHODS
        public function drawPolygon(radius:int,segments:int,centerX:Number,centerY:Number,tint:uint,line:int,rotating:Number):void
        {
            id=0;
            points=new Array();
            ratio=360/segments;
            top=centerY-radius;
            for(var i:int=rotating;i<=360+rotating;i+=ratio)
            {
                var xx:Number=centerX+Math.sin(radians(i))*radius;
                var yy:Number=top+(radius-Math.cos(radians(i))*radius);
                points[id]=new Array(xx,yy);
                if(id>=1) 
                {
                    drawing(points[id-1][0],points[id-1][1],points[id][0],points[id][1],tint,line);
                }
                id++;
            }
            id=0;
        }

        private function radians(n:Number):Number 
        {
            return(Math.PI/180*n);
        }

        private function drawing(startX:Number,startY:Number,stopX:Number,stopY:Number,tint:Number,line:int):void 
        {
            graphics.lineStyle(line,tint,1);
            graphics.moveTo(startX,startY);
            graphics.lineTo(stopX,stopY);
        }

        public function fadeOut():void
        {
            fade_value=0;
            addEventListener(Event.ENTER_FRAME,fade);
        }
        public function fadeIn():void
        {
            fade_value=1;
            addEventListener(Event.ENTER_FRAME,fade);
        }

        //PRIVATE
        private function fade(evt:Event):void
        {
            var da:Number=fade_value-alpha;
            var aa:Number=da*.1;
            alpha+=aa;
            if(Math.abs(da)<=.05)
            {
                alpha=fade_value;
                removeEventListener(Event.ENTER_FRAME,fade);
                if(fade_value==0)
                    dispatchEvent(new Event('fadeOutDone'));
                else
                    dispatchEvent(new Event('fadeInDone'));
            }
        }
    }
}

----EDIT---- 代碼現在如下,出現相同的問題。 我嘗試添加一個向量,並嘗試轉換數組元素。 包 { 導入 flash.display.MovieClip; 導入 flash.display.Shape; 導入 flash.text.TextField;

    public class Main extends MovieClip
    {
        private var radius:Number = 30;
        private var sides:Number = 6;
        private var myrotation:Number = 0;
        private var lineColor:Number = 0x000000;
        private var lineThickness:Number = 1;
        private var l:TextField = new TextField();
        private var f:Array = new Array(20);
        private var v:Vector.<Polygon> = new Vector.<Polygon>(10);
        public function Main()
        {
            l.text = "test";
            addChild(l);
            //WORKS should be red
            for(var i:int = 0; i<stage.stageWidth/(radius*2);i++)
            {
                var t:Polygon = new Polygon();
                addChild(t);
                t.drawPolygon(radius,sides,2*radius*i,radius*2,0xFF0000,lineThickness,myrotation);
            }

            //DOES NOT WORK (note the *3 is so it is lower down) should be blue
            for(var j:int = 0; j<stage.stageWidth/(radius*2);j++)
            {
                f.push(new Polygon());
                addChild(f[j]);
                Polygon(f[j]).drawPolygon(radius,sides,2*radius*j,radius*3,0x0000FF,lineThickness,myrotation);
            } 

            for(var k:int = 0; k<stage.stageWidth/(radius*2);k++)
            {
                v.push(new Polygon());
                addChild(v[k]);
                v[k].drawPolygon(radius,sides,2*radius*k,radius*3.5,0x00FF00,lineThickness,myrotation);
            }   
        }
    }
}

整理筆記...

加載配置文件 C:\\Program Files (x86)\\Adobe\\Adobe Flash Builder 4.6\\sdks\\4.6.0\\frameworks\\flex-config.xml 初始設置:64ms 開始加載 swcs 14ms 運行總計:78ms 加載 30 個 SWC:484ms 預編譯: 841ms C:\\Users\\jmasiello.place\\Documents\\flash\\Main.as: 警告:這個編譯單元沒有在 Frame 元數據中指定的 factoryClass 來加載配置的運行時共享庫​​。 要在沒有運行時共享庫​​的情況下進行編譯,請將 -static-link-runtime-shared-libraries 選項設置為 true 或刪除 -runtime-shared-libraries 選項。

文件:145 時間:961 毫秒鏈接... 25 毫秒優化... 26 毫秒 SWF 編碼... 11 毫秒 C:\\Users\\jmasiello.place\\Documents\\flash\\Main.swf(1809 字節)后編譯:65 毫秒總時間:1595 毫秒峰值內存使用:47 MB​​(堆:29,非堆:18)

W當你做

private var f:Array = new Array(20);

您在工具中創建了一個包含 20 個元素的數組
然后稍后您將一個元素推送到同一個數組中。
f.push(new Polygon()); 通過推送要添加到最后一個元素的元素
這使得數組的前 20 個元素為 null,第 21 個元素為 Polygon
你甚至可以通過這樣做來驗證它。

for(var j:int = 0; j<stage.stageWidth/(radius*2);j++){
    f.push(new Polygon());
    trace(f)
}   

因此,在您的代碼中,您將推入第 21 個元素,然后通過訪問數組

addChild(f[j]);

其中 j = 0 且 0 中的元素仍為空
那么修復它的最佳方法是

private var f:Array = new Array();

你有任何錯誤嗎? 您可能需要強制轉換為 Polygon,以便編譯器接受 drawPolygon 方法。

for(var j:int = 0; j<stage.stageWidth/(radius*2);j++) {
 f.push(new Polygon());
 addChild(f[j]);
 Polygon(f[j]).drawPolygon(radius,sides,2*radius*j,radius*3,0x0000FF,lineThickness,myrotation;
} 

要跳過轉換,您可以使用 Vector 而不是 Array,因為這樣編譯器就會知道它專門處理多邊形。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM