【问题标题】:AS3 Object Array not adding to stageAS3 对象数组未添加到舞台
【发布时间】:2012-10-01 19:52:21
【问题描述】:

所以我是 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'));
            }
        }
    }
}

----编辑---- 现在的代码如下,出现了同样的问题。我尝试添加一个向量并尝试转换数组元素。 包裹 { 导入 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 Running Total: 78ms 加载 30 个 SWC:484 毫秒 预编译:841ms C:\Users\jmasiello.place\Documents\flash\Main.as:警告:此编译 化单元没有在 Frame 元数据中指定的 factoryClass 来加载 co 配置运行时共享库​​。在没有运行时共享库​​的情况下编译 e 将 -static-link-runtime-shared-libraries 选项设置为 true 或删除 -runtime-shared-libraries 选项。

文件:145 时间:961 毫秒 链接... 25ms 优化... 26ms SWF 编码... 11ms C:\Users\jmasiello.place\Documents\flash\Main.swf(1809 字节) 后编译:65ms 总时间:1595ms 峰值内存使用量:47 MB​​(堆:29,非堆:18)

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    W当你这样做时

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

    您在 implements 中创建一个包含 20 个元素的数组
    然后稍后您将一个元素推送到同一个数组中。
    f.push(新多边形()); 通过推送一个元素,您将添加到最后一个元素
    这使得数组的前 20 个元素为空,第 21 个元素为多边形
    你甚至可以通过做来验证它。

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

    因此,在您的代码中,您将推入第 21 个元素,然后通过

    访问数组
    addChild(f[j]);
    

    其中 j = 0 且 0 中的元素仍为 null
    那么解决它的最佳方法是

    private var f:Array = new Array();
    

    【讨论】:

    • 呜呜呜呜。愚蠢的我。我以为我正在初始化一个大小,然后我将它推入第一个空槽。我不知道我为什么这么想。让我试试。
    • 并且它工作正常!~ 完全解决了它。我的愚蠢疏忽。谢谢!
    【解决方案2】:

    您是否遇到任何错误?您可能需要强制转换为 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,因为编译器会知道它只处理多边形。

    【讨论】:

    • 我会再试一次。我以为我已经做到了,但让我试一试。我会让你知道情况如何。但不是。我没有收到任何编译器错误。我正在使用 senocular 的 make.bat,因为我们没有 flash builder 或任何东西。所以我也没有控制台可以追踪。
    • 好的,我尝试在调用函数之前转换数组元素。我还添加了用于测试的向量。编译器中没有错误...我正在尝试在此处添加代码但遇到问题。
    猜你喜欢
    • 2010-11-17
    • 2012-02-23
    • 2011-01-07
    • 2012-06-23
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    相关资源
    最近更新 更多