【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について学びなおせたかな。
以上です。
>・fooのストレージ変数には「_foo」という名前を付けます。
>・setterの引数にはvalueを使用
>・プロパティ名を基準にアルファベット順に並べます。
>・getterを記述してからsetterを記述
↑これコーディング規約的なものですか?それともエラーになっちゃう?
紛らわしくてごめんなさい。
コーディング規約です。無視しても動きます。
ただプロパティ名が、alpha、x、yなどだと
既に存在するプロパティなのでエラーになります。
ですよね、ありがとうございます!
コード規約がそのままsyntax errorになったりする言語もあるっぽいので確認でした!