【AS3】丸をかくclass

このエントリーをはてなブックマークに追加

iyamaです。

ActionScriptで誰得?な、丸を描くclassを作ったのでご紹介します。


 

最近ActionScriptばっかりやってるんですが、そこで気がついたのが、
なんとなくしかclassとか継承とかgetter/setterとか理解してないなってこと。
class使えるけど、作れなくなってないか?と思いまして、勉強しなおしてます。
今日は練習の1つとして作った丸を表示するclassについてです。
 

■環境

ActionScript 3.0
(※今回もFlashDevelopにてパブリッシュして検証しました)
 

■classes/Circle.as

丸を描くCircleクラスをclasses内に配置しました。

package classes 
{
        import flash.display.Shape;
        
        public class Circle extends Shape
        {
                private var _color:Number = 0x000000;
                private var _alpha:Number = 1;
                private var _x:Number = 50;
                private var _y:Number = 50;
                private var _radius:Number = 50; // 半径
                
                public function Circle() 
                {
                        // init
                }
                
                // method ------------------------------
                public function draw():void {
                        graphics.beginFill(_color, _alpha);
                        graphics.drawCircle(_x, _y, _radius);
                        graphics.endFill();
                }
                
                // getter/setter ------------------------------
                /**
                 * alpha
                 */
                public function get circleAlpha():Number {
                        return _alpha;
                }
                
                public function set circleAlpha(value:Number):void {
                        _alpha = value;
                }
                
                /**
                 * color
                 */
                public function get color():Number {
                        return _color;
                }
                
                public function set color(value:Number):void {
                        _color = value;
                }
                
                /**
                 * redius
                 */
                public function get radius():Number {
                        return _radius;
                }
                
                public function set radius(value:Number):void {
                        _radius = value;
                }
                
                /**
                 * x
                 */
                public function get circleX():Number {
                        return _x;
                }
                
                public function set circleX(value:Number):void {
                        _x = value;
                }
                
                /**
                 * y
                 */
                public function get circleY():Number {
                        return _y;
                }
                
                public function set circleY(value:Number):void {
                        _y = value;
                }
                
        }

}

 

■Main.as

では実際にCircleクラスを使ってみましょう。

package Main
{
        import flash.display.Sprite;
        import flash.events.Event;
        
        import classes.Circle;
        
        public class Main extends Sprite 
        {
                private var myCircle:Circle;
                
                public function Main():void 
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
                
                private function init(e:Event = null):void 
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        
                        myCircle = new Circle();
                        myCircle.color = 0xff0000;
                        myCircle.circleAlpha = 0.5;
                        myCircle.circleX = 200;
                        myCircle.circleY = 200;
                        myCircle.radius = 150;
                        myCircle.draw();
                        addChild(myCircle);
                }
                
        }
        
}

 

■解説

Circle.asの解説から。
ホントにただ塗りつぶした丸を表示するだけのclassです。
丸を表示するにはdraw()を使用してください。
 
丸のプロパティを指定できるようにgetterとsetterを用意。
丸の色、透明度、丸の中心のx座標、丸の中心のy座標、半径が指定できます。
また、getterとsetterを作るとき、コーディングの注意がいくつかあるようです。
 

  • fooのストレージ変数には「_foo」という名前を付けます。
  • setterの引数にはvalueを使用
  • プロパティ名を基準にアルファベット順に並べます。
  • getterを記述してからsetterを記述

 

大体、上記のルールは守ったつもりですが、変数のつけ方が違いますね。
alpha、x、yは予約語だったっぽくてpublicにしてたら怒られました。
プロパティ名は直したんですがclass内の変数をそのままにしちゃってました。
 

それからMain.asのほうですが、Circleクラスをimportして指定してください。
インスタンスを作ってプロパティを指定し(指定しなくてもClass内のデフォルト値が入るだけ)
stageにaddChildしてください。
これで丸が表示されます。
 

■実行結果

Main.asを実行すると以下のようになります。

 
うむ。
これでgetterとsetterについて学びなおせたかな。
以上です。

    • さかい
    • 2012 06/04 10:01am

    >・fooのストレージ変数には「_foo」という名前を付けます。
    >・setterの引数にはvalueを使用
    >・プロパティ名を基準にアルファベット順に並べます。
    >・getterを記述してからsetterを記述

    ↑これコーディング規約的なものですか?それともエラーになっちゃう?

      • iyama
      • 2012 06/04 10:34am

      紛らわしくてごめんなさい。
      コーディング規約です。無視しても動きます。

      ただプロパティ名が、alpha、x、yなどだと
      既に存在するプロパティなのでエラーになります。

        • さかい
        • 2012 06/05 12:25pm

        ですよね、ありがとうございます!
        コード規約がそのままsyntax errorになったりする言語もあるっぽいので確認でした!

return top