書き物

技術とか作った物の話とか愚痴文句感想など

BitmapCanvasクラスを少し賢くした

drawメソッドでいろんな描画ができるようになりました。

単に、描画したいものを判断して、BitmapData.copyPixcelメソッドとBitmapData.drawメソッドを切り替えるようにしただけですが。

package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.IBitmapDrawable;
import flash.display.Sprite;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
/**
    * ビットマップキャンバス
    */
public class BitmapCanvas
{
private var _canvas:Bitmap; // 描画対象ビットマップ
/**
        * コンストラクタ
        * 
        * @param width  キャンバスの横幅(ピクセル単位)
        * @param height キャンバスの高さ(ピクセル単位)
        */
public function BitmapCanvas(width:uint, height:uint)
{
var bitmapData:BitmapData = new BitmapData(width, height);
_canvas = new Bitmap(bitmapData, "auto", true);
// 最初に画面内容を消去しておく
clear();
}
/**
        * キャンバスを描画リストに登録
        * 
        * @param stageSp キャンバスを登録するステージ
        * 
        * @throws Error すでに描画リストに登録されているキャンバスは登録できません。
        */
public function added(stageSp:Sprite):void
{
// すでに登録されているなら
if (_canvas.parent != null)
{
// 例外
throw new Error("すでに描画リストに登録されているキャンバスはリストに登録できません。");
}
stageSp.addChild(_canvas);
}
/**
        * キャンバスを描画リストから削除
        * 
        * @throws Error 描画リストに登録されていないキャンバスをリストから削除できません。
        */
public function removed():void
{
// 登録されていないなら
if (_canvas.parent == null)
{
// 例外
throw new Error("描画リストに登録されていないキャンバスをリストから削除できません。");
}
_canvas.parent.removeChild(_canvas);
}
/**
        * オブジェクト描画
        * 
        * @param drawable  描画するオブジェクト(BitmapDataまたはDisplayObject)
        * @param destPoint 描画位置(DisplayObjectもこの位置に描画される)
        * @param matrix    DisplayObjectを描画する際に加える効果変換データ(描画位置はdestPointが適用される)
        */
public function draw(drawable:IBitmapDrawable, destPoint:Point, matrix:Matrix = null):void
{
// copyPixelsを使用するパターン
if (drawable is BitmapData && matrix == null)
{
var rect:Rectangle = new Rectangle(0, 0, BitmapData(drawable).width, BitmapData(drawable).height);
_canvas.bitmapData.copyPixels(BitmapData(drawable), rect, destPoint, null, null, true);
}
// drawを使用するパターン
else
{
// 効果変換データが作られていない場合作る
if (matrix == null)
{
matrix = new Matrix();
}
// 表示位置をリセット
matrix.translate(-matrix.tx, -matrix.ty);
// 表示位置の設定
matrix.translate(destPoint.x, destPoint.y);
// 描画
_canvas.bitmapData.draw(drawable, matrix, null, null, null, true);
}
}
/**
        * 描画内容の消去
        */
public function clear():void
{
var canvasData:BitmapData = _canvas.bitmapData;
var rect:Rectangle = new Rectangle(0, 0, canvasData.width, canvasData.height);
canvasData.fillRect(rect, 0x00FFFFFF);
}
}
}

これです。

public function draw(drawable:IBitmapDrawable, destPoint:Point, matrix:Matrix = null):void

matrixが何であれ、断固destPointの位置に描画します。

何て仕様!

これで何でも描画できますね!!!!!