1

したがって、私はAS3とAS全般に不慣れです。私は Java と PHP をある程度知っています。

プログラムで16進マップを作成するアプリを作成して学習しようとしています。以下に含める六角形のライブラリを使用していますが、これが私の問題です。たとえば、10 カウントの for ループを実行してから、形状を作成し、形状を追加して形状を描画すると、問題はありません。同じループで形状を配列にプッシュし、その配列要素を追加してから描画すると、何も得られません。

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'));
            }
        }
    }
}

----編集----コードは次のようになり、同じ問題が発生しています。ベクトルを追加しようとしましたが、配列要素をキャストしようとしました。パッケージ { import 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: 警告: このコンパイル ユニットには、構成されたランタイム共有ライブラリをロードするためのフレーム メタデータで指定された 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)

4

2 に答える 2

2

Wあなたがするとき

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

実装で20個の要素を含む配列を作成します
。その後、同じ配列に要素をプッシュします。
f.push(new Polygon()); 要素をプッシュすることにより、最後の要素に追加します。
これにより、配列の最初の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();
于 2012-10-02T14:03:39.930 に答える
0

エラーが発生していますか?コンパイラがdrawPolygonメソッドを受け入れるには、おそらくPolygonにキャストする必要があります。

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;
} 

キャストをスキップするには、配列の代わりにベクトルを使用できます。これにより、コンパイラはポリゴンを排他的に処理することがわかります。

于 2012-10-01T20:04:50.957 に答える