Lab arrow FLASH arrow 汎用的なカスタムクラスの作成

汎用的なカスタムクラスの作成

FLASHの制作ではグラフィックオブジェクトを作成したり、配列を操作したり、毎回同じようなコードを作成するケースがよくあります。そんな普段のワークフローに登場しそうなコードは、カスタムクラスとして作成しておくと制作の効率が上がります。
例えばグラフィックグラフィックオブジェクトの作成では、Shapeオブジェクトの作成、グラフィックの描画のためにサイズやカラーなど、いくつかパラメータを渡さないといけないので、単純なグラフィックでもコードが冗長になりがちです。

次のコードは矩形を作成するためのカスタムクラスです。

package citrus {
	
	import flash.display.DisplayObjectContainer;
	import flash.display.Shape;
	import flash.geom.Point;
	import flash.geom.Rectangle;

	public class Shapes {
		
		public function Shapes() {
		}

		public function squareFill(container:DisplayObjectContainer, param:Object):Shape {
			if (param.align == undefined) param.align = "lt";
			if (param.width == undefined) param.width = 100;
			if (param.height == undefined) param.height = 100;
			if (param.radius == undefined) param.radius = 0;
			if (param.color == undefined) param.color = 0x000000;
			var shape:Shape = new Shape();
			var rect:Rectangle = new Rectangle(param.radius, param.radius, param.width-param.radius*2, param.height-param.radius*2);
			var pos:Point = new Point(0, 0);
			switch (param.align.substr(0, 1)) {
				case "l": pos.x = 0; rect.x = param.radius; break;
				case "c": pos.x = -param.width/2; rect.x = param.radius-param.width/2; break;
				case "r": pos.x = -param.width; rect.x = param.radius-param.width; break;
				default: pos.x = 0;
			}
			switch (param.align.substr(1, 1)) {
				case "t": pos.y = 0; rect.y = param.radius; break;
				case "m": pos.y = -param.height/2; rect.y = param.radius-param.height/2; break;
				case "b": pos.y = -param.height; rect.y = param.radius-param.height; break;
				default: pos.y = 0;
			}
			shape.graphics.beginFill(param.color);
			shape.graphics.drawRoundRect(pos.x, pos.y, param.width, param.height, param.radius);
			shape.graphics.endFill();
			if (param.radius != 0) shape.scale9Grid = rect;
			container.addChild(shape);
			return shape;
		}
	}
}

上のコードでは矩形を作成するための関数のみを書いてあります。
関数に引数には、必要なパラメータのみを渡せる様にオブジェクトにして渡しています。これはTweenerの書き方を参考にさせてもらいました。
矩形を描くためのパラメータではサイズ、カラーの他に四隅を角アールにした際の9スライスの処理を組み込んでいます。あとグラフィックを回転や拡大・縮小したときにの原点を左上固定ではなく、センターなどにも配置できる様にしています。

実際の記述と表示結果は次の様になります。

import citrus.Shapes;

var shapes:Shapes = new Shapes();
var place_01:Sprite = new Sprite();
var place_02:Sprite = new Sprite();

place_01.x = 20;
place_01.y = 20;
place_02.x = 210;
place_02.y = 20;

addChild(place_01);
addChild(place_02);

shapes.squareFill(place_01, {width:170, height:160, color:0xcccccc});
shapes.squareFill(place_02, {width:170, height:160, radius:50, color:0xcccccc});

こんな感じで自分のワークフローにあったカスタムクラスを作成しておくと制作の効率も上がって、コード記述の際のミスも減らすことができると思います。
グラフィックや外部ファイルの読み込み、ビットマップの処理などよく使う機能ではありますが、つい書き方を忘れて、その都度リファレンスを読み返したりすることも多いので、そんな時にもカスタムクラスにしておくと便利です。