FlxNapeSprite の変更点


[[API Reference]] > [[flixel.addons.nape]] > FlxNapeSprite

* FlxNapeSprite [#z29889ef]
FlxNapeSpriteはFlxSpriteを継承し、Nape物理エンジンを実装した剛体です。
スプライトの動作は物理エンジンの挙動に従います。

なお、デフォルトでは[[createRectangularBody()>FlxNapeSprite#z355162f]]により直方体の剛体が生成されます。

----
#contents
----

*フィールド [#x5bf2a22]
** body:[[Body>nape.phys.Body]] : スプライトに適用するNapeの剛体 [#ze21e83d]
** physicsEnabled:Bool = false : 剛体の物理シミュレーションを行うかどうか [#s1209e49]
 この値がfalseになっていると、剛体の移動や衝突が無効となります

----
*メソッド [#hd3f7466]
**new() : 生成 [#ndf2d4a3]
 生成した剛体は各ステップで、物理エンジンの更新を行い、剛体の位置や回転に合わせてスプライトの位置と回転を一致させます。
 デフォルトでは、長方形の形状の物理学の体はあなたのスプライトグラフィックを中心に作成されます。 
 あなたは、この機能を無効にして(addPremadeBodyを参照)、あなたが望む剛体を追加することができます。
- 引数
--X:Float = 0 : 座標X
--Y:Float = 0 : 座標Y
--?SimpleGraphic:Dynamic : 画像データ
--CreateRectangularBody:Bool = true : 長方形の剛体を生成するかどうか
--EnablePhysics:Bool = true : 物理エンジンを有効にするかどうか

**destroy() : 破棄 [#fc71ece2]

**update() : 更新 [#yd2cb63f]

**kill() : 消滅 [#x51e03b6]

**revive() : 復活 [#b66fa1c8]

**[[addPremadeBody()>FlxNapeSprite#z2517dff]] : あらかじめ作った剛体を登録する [#z2517dff]
- 引数
-- NewBody:Body : 登録する剛体
- 戻り値 : Void

**[[createRectangularBody()>FlxNapeSprite#z355162f]] : 長方形の剛体を作成します [#z355162f]
 スプライトが使用する物理学エンジンの剛体を作成するデフォルトの方法です。 
 あなた自身の剛体を作成するには、このメソッドをオーバーライドします! 
 Width/Heightに「0」が渡された場合は、幅と高さはスプライトグラフィックのサイズに基づいています。 
 本体サイズを更新するmakeGraphics() またはloadGraphic() を呼び出した後は、
 このメソッドを呼び出すようにします。

- 引数
-- Width:Float = 0 : 剛体の幅
-- Height:Float = 0 : 剛体の高さ
-- ?_Type:[[BodyType>nape.phys.BodyType]] : 剛体の種別。デフォルトは「DYNAMIC」です
- 戻り値:Void

** [[createCircularBody()>FlxNapeSprite#pc0c8f55]] : 円形の剛体を作成します [#pc0c8f55]
- 引数
-- Radius:Float = 16 : 円の半径
-- ?_Type:[[BodyType>nape.phys.BodyType]] : 剛体の種別。デフォルトは「DYNAMIC」です
- 戻り値:Void

** [[setBodyMaterial()>FlxNapeSprite#p763a48a]] : 剛体のマテリアル設定のショートカットです [#p763a48a]
- 引数
-- Elasticity:Float = 1 : 弾力性
-- DynamicFriction:Float = 0.2 : 移動中の剛体の摩擦係数
-- StaticFriction:Float = 0.4 : 停止中の剛体の摩擦係数
-- Density:Float = 1 : 密度
-- RotationFriction:Float = 0.001 : 回転の摩擦係数
- 戻り値 : Void

** [[destroyPhysObjects>FlxNapeSprite#a8366ce4]] : 剛体を破棄します [#a8366ce4]
- 戻り値 : Void
** setDrag() : 移動速度と角速度の減衰値を指定します [#x866fdf9]
 減衰値は 0.0〜1.0 の値となります。値が小さいほど速度の減少値が大きくなります
-引数
--LinearDrag:Float = 1 : 移動速度の減衰値
--AngularDrag:Float = 1 : 角速度の減衰値
-戻り値 : Void

----

* Tips [#i160f4f1]
** 生成直後の描画位置がおかしい [#k785bee3]
FlxSpriteの座標は左上が基準となりますが、Napeの剛体は中心座標が基準となります。そのため生成直後に描画がずれてしまっています。これを解消するには、生成後にupdate関数を呼び出すか、Nape剛体の座標をFlxSpriteの座標に設定しておきます。

** FlxNapeSpriteインスタンスを使い回しすると表示されない [#zd894c10]
FlxNapeSpriteは物理世界における座標系で表示されます。そのため、FlxNapeSprite.position に値を設定しないと表示されません。

** 座標の扱い [#ff1c981a]
FlxNapeSprite.x / y は描画上の座標となります。そのためこの値を変更しても座標は変わりません。
座標を変更するには、剛体の座標値 (FlxNapeSprite.Body.position) を変更します

#geshi(Actionscript){{
  // 剛体の座標を変更する
  private function _setPosition(spr:FlxNapeSprite, px:Float, py:Float):Void {
    spr.body.position.setxy(px, px);
  }
}}

** 速度を初期化する方法 [#o1856c12]
FlxNapeSprite.body.velocity に (0, 0) を指定すると、速度をゼロにすることができます。例えば、マウスでつかんで座標を固定化すると速度が蓄積するため、つかんでいるときは速度をゼロにするとよいです

** [[BodyType>nape.phys.BodyType]]をSTATIC (衝突しても動かない) にする場合の注意点 [#v49ad1a0]
[[BodyType>nape.phys.BodyType]]をSTATICにした場合は、body.position の値を変更して動かすことができません。動かすには、[[createRectangularBody>FlxNapeSprite#z355162f]] などを呼び出して剛体を作り直す必要があります
** 衝突を検知する方法 [#b87779c2]
衝突を検知するには、以下の手順が必要となります

+ 衝突のコールバック関数を定義
+ 剛体を生成
+ 剛体にCbType(CallbackType)インスタンスを登録
+ 剛体にCbType(Callback Type)インスタンスを登録
+ 剛体のユーザデータ領域に自身のポインタを格納
+ 登録したCbTypeインスタンスと衝突のコールバック関数をリスナーに登録

#geshi(Actionscript){{
  private function addListener(spr:FlxNapeSprite):Void {
    
    // CbType生成
    var cbSpr = new CbType();
    
    // CbTypeを剛体に登録
    spr.body.cbTypes.add(cbSpr);

    // sprを剛体のユーザデータ領域に格納
    spr.body.userData.data = spr;
    
    // リスナーに登録
    var listener = new InteractionListener(
      CbEvent.BEGIN,             // 開始時
      InteractionType.COLLISION, // 衝突時
      cbSpr,           // 剛体に登録したCbType (Interaction1)
      CbType.ANY_BODY, // すべての剛体 (Interaction2)
      function(cb:InteractionCallback) {
        // 衝突した
        trace("hit!");

        // Interaction1の取り出し
        var spr:FlxNapeSprite = cast(cb.int1, Body).userData.data;
        // sprに何かの操作をする
        
        // Interaction2の取り出し
        var int2:Body = cast(cb.int2, Body);
      }
    };
    // Spaceに登録
    FlxNapeState.space.listeners.add(listener);
  }
}}

CbTypeは衝突のコールバックグループのようなもので、複数のインスタンスで共有化することができます。例えば、すべてのボールのインスタンスが、1つのCbTypeを共有して、処理を共通化することができます。

また、Interaction2 に「CbType.ANY_BODY」ではなく別のCbTypeを指定すると、そのCbTypeを登録した剛体と衝突したときのみ、コールバック関数が呼び出されるようになります。
** 特定の剛体とのみ衝突するようにしたい [#k673d219]
InteractionFilterに衝突グループ番号と、衝突グループマスクを指定することで、特定の剛体のみ衝突するようになります。

例えば、衝突のルールを以下のように定義します。

,,Ball(1),Box(2),Donut(4)
,Ball,○,×,×
,Box,×,○,○
,Donut,×,○,×

#geshi(Actionscript){{
  // ボール
  var ball:FlxNapeSprite;
  // 箱
  var box:FlxNapeSprite;
  // ドーナッツ
  var donut:FlxNapeSprite;
  
  // フィルターを生成 (衝突グループ番号, 衝突マスク)
  var ballFilter  = new InteractionFilter(1, ~(2 | 4));
  var boxFilter   = new InteractionFilter(2, ~(1    ));
  var donutFilter = new InteractionFilter(4, ~(1 | 4));

  // フィルターを登録
  ball.body.setShapeFilters(ballFilter);
  box.body.setShapeFilters(boxFilter);
  donut.body.setShapeFilters(donutFilter);
}}

衝突マスクは ~(チルダ)でビットを反転しています。例えば、「~(2 | 4)」であれば衝突グループ「2, 4」には衝突しないこととなります。