首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3对象数组未添加到阶段

AS3对象数组未添加到阶段
EN

Stack Overflow用户
提问于 2012-10-02 03:52:21
回答 2查看 753关注 0票数 1

因此,我是AS3的新手,总体来说也是如此。我对Java有一定程度的了解,对PHP也很了解。

我正在尝试通过编写一个应用程序来学习,该应用程序以编程方式创建十六进制地图。我正在使用一个六边形的库,我将在下面将其包括在内,然而,这是我的问题。当我运行for循环,比如10次计数,然后创建一个形状,添加该形状并绘制该形状时,它没有任何问题。在同一个循环中,如果我将一个形状推到一个数组中,然后添加该数组元素,然后绘制它,我什么也得不到。

代码语言:javascript
复制
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);
            }   
        }
    }
}

下面是我使用的多边形类。我从网上某个地方拿来的。

代码语言:javascript
复制
 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;

代码语言:javascript
复制
    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个SWCs: 484ms预编译: 841ms C:\Users\jmasiello.place\Documents\flash\Main.as:警告:此编译单元没有在帧元数据中指定的factoryClass来加载已配置的运行时共享库。要在没有运行时共享库的情况下进行编译,要么将-static-link- true shared - libraries选项设置为true,要么删除-true shared-libraries选项。

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

EN

回答 2

Stack Overflow用户

发布于 2012-10-02 22:03:40

WWhen你做的

代码语言:javascript
复制
private var f:Array = new Array(20);

在implements中创建一个包含20个元素的数组

然后,稍后将一个元素推入同一数组中。

f.push(new Polygon());通过推入一个元素,可以将其添加到最后一个元素中

这使得该数组的前20个元素为空,第21个元素为多边形

您甚至可以通过执行以下操作来验证它。

代码语言:javascript
复制
for(var j:int = 0; j<stage.stageWidth/(radius*2);j++){
    f.push(new Polygon());
    trace(f)
}   

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

代码语言:javascript
复制
addChild(f[j]);

其中j=0且0中的元素仍为空

那么修复它的最好方法就是

代码语言:javascript
复制
private var f:Array = new Array();
票数 2
EN

Stack Overflow用户

发布于 2012-10-02 04:04:51

您是否收到任何错误?您可能需要强制转换为多边形,以便编译器接受drawPolygon方法。

代码语言:javascript
复制
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,因为这样编译器就会知道它是以独占方式处理多边形的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12680074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档