ドット絵ツール作成開始
=前置き=
GAEでアクションゲームの共有システムを作るにあたり、「ドット絵を自作できると色々と楽だよね」というあたりから、「仕事や家で"作る"作業が多くなるから、しばらくはドット絵で息抜きしよう」という流れになり、「ドット絵に3Dの技術(シェーダとか)を持ってこれないだろうか」という疑問が合わさり、「じゃあ、ドット絵ツールを自作して検証してみよう」という風になったので、ドット絵ツールを作ることになった。
途中で「"作る"作業が多くなるからドット絵を描こう」という流れになったにも関わらず、何故かツールを作っている不思議。
=方針=
「テクスチャ(基本の色)とシェード(陰)は分けられる」というシェーダの発想をドット絵でも使えるかどうかを検証するため、「色の指定と陰の指定を別のウィンドウで行うドット絵ツール」を作る。
まぁ、普通のエディタでレイヤーを駆使すれば似たような事はできるんだけど。
ただ、自作すればGAEのアクションゲーム共有システムに組み込めるかもしれないし、自作する。
=セットアップ=
Flashのノウハウを流用できるので、今回はツールをAIRで作ることにする。
ということで、まずはAIR用のセットアップをした。
基本的にはhttp://www.saturn.dti.ne.jp/~npaka/flash/apollo10/の「チュートリアル」の項目に従えばOK。
ただ、Flex3SDKに関してはURLが変わったようで、現在はAdobe: Creative, marketing and document management solutionsからダウンロード可能。
セットアップの詳細は「Adobe AIR Flex」とかでググるのに任せるとして、一点だけ「adlが実行できない」というのにはまったのでそこだけ解説。
実行できない原因はhttp://blog.seyself.com/2008/10/post_2008100916.htmlで解説されているように、バージョンの指定が違うため。解説されているようにバージョンを書き換えればOK。
=サンプル=
まずは基本的な「お絵かき」の機能を仮で作ってみた。AIRで作ると、ついでにFlashもできるので公開しやすい。画像の保存とかはAIRじゃなきゃできないけど。
とりあえず、マウスで灰色のドットが打てるようになったところまで。
=コード=
一応コードも載せておく。ゲームから流用してるので変数名にCAMERAが使われていたり、クラスを使わずにクラスっぽい挙動をさせてみたりしてるので、あまり良いサンプルではないかもしれないけど、普通のサンプルなら前述のサイトにもあるし。
以下のファイルを指定ファイル名で保存して、「amxmlc DotEditor.mxml」でswfが作成できて、「adl.exe DotEditor-app.xml」でAIRとしての動作確認ができる。
Game.as
package { import flash.display.*; import flash.events.*; import flash.filesystem.*; import flash.utils.*; import flash.filters.*; import flash.geom.*; //mxml import mx.core.*; import mx.controls.*; import mx.containers.*; //Class public class Game extends Box { //==Const== static public const CAMERA_W:int = 320; static public const CAMERA_H:int = 320; //==Var== public var m_Canvas_Color:Image; public var m_Color_Graphic:uint = 0x888888; //==Function== public function Game() { } public function Init():void{ { var createCanvas:Function = function(i_GetColor:Function):Image{ var bmp_data:BitmapData = new BitmapData(32, 32, true, 0xFFFFFFFF); var img:Image = new Image(); { img.addChild(new Bitmap(bmp_data)); } { //#メンバ変数相当 //マウスが押されてるかどうかを知るためにフラグを持っておく var is_mouse_down:Boolean = false; //線を引くために前回の位置を覚えておく var mouseX_Old:int = 0; var mouseY_Old:int = 0; //#マウスに応じた処理 //Move img.addEventListener( MouseEvent.MOUSE_MOVE, function(e:MouseEvent):void{ if(e.buttonDown){ //!!ここで代わりに線を引く bmp_data.setPixel(img.mouseX, img.mouseY, i_GetColor()); } mouseX_Old = img.mouseX; mouseY_Old = img.mouseY; } ); } return img; } m_Canvas_Color = createCanvas(function():uint{return m_Color_Graphic;}); addChild(m_Canvas_Color); m_Canvas_Color.scaleX = 10; m_Canvas_Color.scaleY = 10; } } } }
DotEditor.xml
<?xml version="1.0" encoding="UTF-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:comp="*" paddingTop="0" paddingLeft="0" paddingRight="0" paddingBottom="0" applicationComplete="init()" > <!--Script--> <mx:Script> <![CDATA[ //最初のロード完了時の初期化 private function init():void{ //幅を、実際のゲーム画面に合わせる MyViewStack.width = Game.CAMERA_W; MyViewStack.height = Game.CAMERA_H; button_to_start.width = Game.CAMERA_W; button_to_start.height = Game.CAMERA_H; } //ボタンが押されて開始する時の処理 private function start():void{ MyViewStack.selectedChild = main_game; main_game.Init(); } ]]> </mx:Script> <!--View--> <mx:ViewStack id="MyViewStack" width="10" height="10"> <mx:HBox borderStyle="none"> <mx:Button id="button_to_start" label="Click to Start" buttonDown="start()" width="10" height="10"/> </mx:HBox> <comp:Game id="main_game" borderStyle="solid"/> </mx:ViewStack> </mx:Application>
DotEditor-app.xml
<?xml version="1.0" encoding="UTF-8"?> <application xmlns="http://ns.adobe.com/air/application/1.5"> <id>show.o.healer.DotEditor</id> <version>1.0</version> <filename>DotEditor</filename> <description>"graphic" and "shade" painter</description> <copyright>Show_O_Healer</copyright> <initialWindow> <title>DotEditor</title> <content>DotEditor.swf</content> <systemChrome>standard</systemChrome> <transparent>false</transparent> <visible>true</visible> </initialWindow> </application>