オワタをFlashで動かす方法の解説
前置き
最近書いているコードは、もともとhttp://www.kajisoku.com/archives/0006.htmlを再現するつもりのものだ。まだ「グロ・ラグドール」と「セリフシステム」などができていないが、ベース部分はできたので、その解説をしてみる。
AAを動かす
AAを表示して動かすために、以下の手順を踏んでいる。
- 元となるAAをTextFieldとして表示
- それをBitmapDataとして取り込む
- そのBitmapDataをもとにBitmapを作成
具体的なコードは以下の通り。
protected function CreateAASprite(in_text:String):Sprite{ //まずは文字列を普通に表示するものを作成 var text_field:TextField = new TextField(); { text_field.text = in_text; text_field.border = false; text_field.x = 0; text_field.y = 0; } //その内容をビットマップデータとして取り込む var bmp_data : BitmapData = new BitmapData(text_field.textWidth+5, text_field.textHeight+5, true , 0x00000000); { var matrix : Matrix = new Matrix(1,0,0,1,0,0); var color : ColorTransform = new ColorTransform(1,1,1,1,0,0,0,0); var rect : Rectangle = new Rectangle(0,0,bmp_data.width,bmp_data.height); bmp_data.draw(text_field, matrix, color, BlendMode.NORMAL, rect, true); } //取り込んだビットマップデータを表示 var bmp_obj:Bitmap = new Bitmap( bmp_data , PixelSnapping.AUTO , true); { bmp_obj.x = -text_field.textWidth*0.5; bmp_obj.y = -text_field.textHeight*0.5; } //さらにそれを表示するスプライトを作成して返す var sprite:Sprite = new Sprite(); { addChild(sprite); sprite.addChild(bmp_obj); } return sprite; }
元のコードを少しいじったので、上手くいかないところもあるかもしれない。あと、最後はspriteをはさまなくても良かったかもしれない。それはともかく、上のような流れで作成している。
TextFieldをそのまま使わないのは、「反転」ができないため。Scaleにマイナスを入れてもTextFieldの表示は反転されないので、Bitmapにすることによって反転できるようにしている。
重力の働かない弾を撃つ
あまりオワタとは関係ないが、Box2Dで重力を無視しながら(=浮きながら)移動する方法の話。
Box2Dで「重力を無視する」という設定は見つけられなかったので、「毎回重力を相殺するような力をかける」という力技で反重力を実現している。具体的なコードは以下の通り。
public function AntiGravity(in_Gravity:Number):void{ m_Body.m_force.Add(b2Math.MulFV(m_Body.GetMass(), new b2Vec2(0.0, -in_Gravity))); }
毎回このAntiGravityを呼び、「重力と反対方向の力」×「質量」の力をコリジョンにかけることで重力を相殺している。
あとがき
書くことが意外と少なかった。せめて「グロ・ラグドール」を作成してからの方が良かったかもしれない。作ってから書き足すかもしれない。