オワタを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を呼び、「重力と反対方向の力」×「質量」の力をコリジョンにかけることで重力を相殺している。


あとがき

書くことが意外と少なかった。せめて「グロ・ラグドール」を作成してからの方が良かったかもしれない。作ってから書き足すかもしれない。