ActionScript版White Curtainを3時間で作るプロジェクト(その3)

■グラフィックスラッパーの作成

ビットマップに対してべたべた描画していくためのラッパークラスを作る。

http://www.saturn.dti.ne.jp/~npaka/flash/as30/BitmapEx/index.html
にある、JGraphics.asを参考に、っていうかほとんどそのままに。


ああ、重要なポイントとしては、
「ビットマップの一部分を描画する」
っていう関数のつくりかた。

//イメージの描画 public function drawImage( source:IBitmapDrawable, x:int, y:int, sx:int, sy:int, sw:int, sh:int):void { if (source == null) return; var pos:Matrix = new Matrix(); var clip:Rectangle = new Rectangle(x, y, sw, sh); pos.translate(x - sx,y - sy); bd.draw(source, pos, null, null, clip); }
ActionScript3.0のリファレンスには ビットマップの全部を描画するAPIしかないが、 うまいことクリッピングとtranslateしてやることで、 ソースのビットマップの好きな矩形領域を、 デスティネーションのビットマップの好きな領域に描画することができる。 ついでに、さっき作ったrs2.gifにあるビットマップフォントを描画できる関数群もつけておく。
[Embed(source='rs2.gif')]; static private var FontImage0:Class; static private var fimg:Bitmap=new FontImage0(); /** * 文字列を描画する * @param x X座標 * @param y Y座標 * @param s 表示する文字列 */ static public function drawString(x:int, y:int, s:String):void { var i:int; var len:int = s.length; for (i = 0; i < len; i++, x += 12) { var c:int = s.charCodeAt(i); drawImage(fimg, x, y, (c % 32) * 12, ((c / 32) - 1) * 12, 12, 12); } } /** * 整数を右詰めで描画する * @param x X座標 * @param y Y座標 * @param num 表示する数字 * @param keta 桁数 */ static public function drawNumber(x:int, y:int, num:int, keta:int):void { var i:int = 0; var sy:int = 0; x += (keta - 1) * 12; while (keta > 0) { drawImage(fimg, x, y, (num % 10) * 12 + 192, sy, 12, 12); i++; num /= 10; keta--; x -= 12; if (num == 0) break; } }
ちょっときたなくてすまん… ■描画できるかどうかテスト。 こんなメインプログラムを作ってテストする。 [WCurtain.as]
package { import flash.display.*; import flash.geom.*; import flash.utils.*; import flash.events.*; public class WCurtain extends Sprite { public static var DIV:int = 16; public static var DW:int = 264; public static var DH:int = 288; public static var H:int = DH * DIV; public static var W:int = DW * DIV; public var g:JGraphics = new JGraphics(DW,DH); private var count:int = 0; private var child:Sprite = new Sprite(); public function WCurtain() { child.addChild(new Bitmap(g.getBitmapData())); child.focusRect= false; child.addEventListener(Event.ENTER_FRAME,onTick); addChild(child); } private function onTick(ev:Event):void { count++; g.fillRect(0, 0, DW, DH, 0); g.drawString("COUNT:", 0, 0); g.drawNumber(count, 72, 0); } } }
ソース全体 ■Makefileを作る Dngn(http://www.asahi-net.or.jp/~cs8k-cyu/flash/dngn/) のソースを参考に。 というか、ほぼパクってます。
NAME = WCurtain SCREEN_WIDTH = 264 SCREEN_HEIGHT = 288 FRAME_RATE = 60 PROG = $(NAME).swf SRC = $(NAME).as DEFAULT_MXMLFLAGS = -default-size $(SCREEN_WIDTH) $(SCREEN_HEIGHT) -default-frame-rate $(FRAME_RATE) MXMLFLAGS = $(DEFAULT_MXMLFLAGS) -optimize=true all: mxmlc $(MXMLFLAGS) $(SRC)
mxmlcは良く出来ていて、メインのクラスを指定するだけで そこから紐付けされたクラスを全部コンパイルして、 Embed指定されたGIFやMP3のデータを全部まとめたSWFを作ってくれる。 ただ…コンパイルにちょっと時間かかるので エラーがいっぱい出てそれに対処しているときは ちょっとイライラするかもなぁ。 ■動いた
あーもう40分も経っちまったよ。 つづく