2019-05-30

[Flash] Box2DFlashAS3 v2.0.2 (1)

[Flash] Box2DFlashAS3 v2.0.2 を学習 (1)

動作確認環境:

  • Windows7 64bit
  • Adobe AIR SDK 22
  • Java7

[話者] Physics Engine(物理演算エンジン)を学んでみるよ。

Research

ActionScript3向けのPhysicEngineは複数ある。『ActionScript3.0ライブラリ入門(翔泳社 2010)』によるとBox2Dがいいようだ。いろんな環境で使えるから。

  • Box2DのActionScript3版は Box2DFlashAS3 とか Box2DFlash とか呼ばれている。最新v2.1aはアルファ版らしい。v2.0.2は安定版。
  • JavaScript版Box2DWebは Box2DFlash v2.1aを機械的にconvert
  • C++版本家はv2.3.1(2014)が最新

[合いの手] https://sourceforge.net/projects/box2dflash/files/box2dflash/ によるリリース日一覧。

version date
Box2DFlashAS3_2.1a 2010-03-28
Box2DFlashAS3_2.0.2 2008-12-09
Box2DFlashAS3_2.0.1 2008-06-17
Box2DFlashAS3_2.0.0 2008-04-17
Box2DFlashAS3_1.4.3.1 2008-01-09

[話者] 書籍でBox2DのAS3日本語解説は以下だけ。

Web上でBox2DのAS3日本語解説を探してみると、以下があった。

Box2DFlash

QuickBox2D

  • Web記事 2011-04-15 QuickBox2Dがいい感じみたいなので使ってみました
    • QuickBox2D 1.1 + Box2DFlashAS3 v2.0.2
      Box2DFlashAS3を簡単に利用するためのライブラリ「QuickBox2D」を見つけました。QuickBox2D公式サイトにも記述されてるとおり、Box2DFlashAS3は2.0.2を使用しましょう。
  • Web記事 [AS3.0] QuickBox2Dを試すのだ! (1)
    • QuickBox2D 1.1 + Box2DFlashAS3 v2.0.2
      QuickBox2Dコンストラクタの引数はSpriteじゃダメとか、サイズの単位が 1=30px とか。ちょっとクセがあるな。QuickBox2D.as 内のタイプミス? 「fillAlpha」となるべき部分で「fillAllpha」となっている箇所が4箇所ある。

消滅した記事

[合いの手] v2.1aの日本語解説が少ないね。v2.1aはアルファ版 というのも気になる。v2.0.2がいいみたい。

Get

[話者] それではダウンロードしよう。

http://www.box2dflash.org/download で v2.0.2 を取得。 Older releaseのリンクから v2.0.0 も取得。

Learn

評判のよい Box2DでActionScript物理プログラミング 技術評論社 の記事を読む。

第1回 Box2Dを使ってみよう

これはBox2D付属サンプルを見るだけ。

第2回 物理エンジンをセットアップし,箱を落とすFlashを作る

提供されているソースコード DropBox.as は、 Box2DFlash v2.0.2 そのままではコンパイルが通らない。

$ mxmlc -source-path='C:\home\as3\Box2DFlashAS3_2.0.2' DropBox.as
Error: Call to a possibly undefined method CreateStaticBody through a reference with static type b2World.
Error: Call to a possibly undefined method CreateDynamicBody through a reference with static type b2World.

ver 2.0.0 では CreateStaticShape() と CreateDynamicShape() に分かれていたが、 ver 2.0.1 からは CreateShape() に統一された

http://tech.nitoyon.com/ja/blog/2009/04/28/box2dflashas3-2-0-2/

Box2DFlashAS3_2.0.2\Box2D\Dynamics\b2World.as だと同様に CreateBody() に統一されてるようだ。じゃあDynamicとStaticはどこで設定するのか?

(動く物体の場合のみ) 重さを計算する SetMassFromShapes() を実行。

すでにSetMassFromShapes()記述済みだったので「CreateBody()に統一」だけでv2.0.2コンパイルOK。

--- DropBox.as  2019-05-26 11:22:06.618219900 +0900
+++ DropBox_v202.as 2019-05-26 11:13:54.547075000 +0900
@@ -53,3 +53,3 @@
            // 床を動かない物体として作る
-           var floor:b2Body = world.CreateStaticBody(floorBodyDef);
+           var floor:b2Body = world.CreateBody(floorBodyDef);
            floor.CreateShape(floorShapeDef);
@@ -71,3 +71,3 @@
            // 箱を動く物体として作る
-           var boxBody:b2Body = world.CreateDynamicBody(boxBodyDef);
+           var boxBody:b2Body = world.CreateBody(boxBodyDef);
            boxBody.CreateShape(boxShapeDef);

第3回 ~ 第6回 までは同じ修正だけでいい。

第7回 円を落として星を飛び散らせる

以下の修正で同じになったと思う。

--- KiraKira.as 2019-06-02 18:49:43.634187500 +0900
+++ KiraKira_v202.as    2019-06-02 19:00:37.038560100 +0900
@@ -56,3 +56,3 @@
            // 床を動かない物体として作る
-           var floor:b2Body = world.CreateStaticBody(floorBodyDef);
+           var floor:b2Body = world.CreateBody(floorBodyDef);
            floor.CreateShape(floorShapeDef);
@@ -62,5 +62,5 @@
            contactListener.parent = this;
-           world.SetListener(contactListener);
+           world.SetContactListener(contactListener);
            
@@ -133,3 +133,3 @@
            
-           var star:b2Body = world.CreateDynamicBody(starDef);
+           var star:b2Body = world.CreateBody(starDef);
            star.CreateShape(starShapeDef);
--- ContactListener.as  2019-06-02 18:49:48.364458100 +0900
+++ ContactListener_v202.as 2019-06-02 19:28:17.566536900 +0900
@@ -13,3 +13,3 @@
            // 衝突時の力の大きさをもとに、エフェクトを発生させる数を計算する
-           var num:int = point.normalForce / 10 + 1;
+           var num:int = point.normal.Length() + 1;
            // 計算ミスで大きな力がかかることがあるので、値を10までに制限する

0 件のコメント:

コメントを投稿

人気記事