Japanese | English | Korean

Samples

ボクシング

バウンディングボリューム ( BV ) の当たり判定を利用して、ボクシングをするサンプルです。
NPC ( 青トランクス ) はランダムに防御を繰り返しています。プレイヤー ( 赤トランクス ) を操作し、隙をついてNPCを攻撃してください。1キーがパンチ、3キーがキックです。

目次


1. 攻撃の当たり判定

攻撃の当たり判定は、プレイヤーの手足のボーンに設定したBVとNPCの頭と胴に設定したBVの衝突判定で行います。プレイヤー側のBVとNPC側のBVが衝突した際、NPCが防御状態でなければ当たったと判定します。




2. ボクシングのサンプルコード

ここでは、BVによる攻撃の当たり判定を中心にサンプルコードを説明します。
以下のコードでは、プレイヤーの手のボーンにBVを設定しています。足、頭、胴も同様の方法で設定が可能です。 詳しくは、「 特定ボーンのみへのBVの設定 」を参照してください。

/*----- bone ID -----*/
#define HAND_BONE    12

/*----- bone shape -----*/
#define HAND_SHAPE    0

 ~中略~

/*----- Player -----*/
/*----- Shapeインスタンスの作成 -----*/
/*----- BVFigure -----*/
pMe->Player.Shape.pbvfig = IMICRO3D_mcx_BVBuilder_createBVFigureOnlyBonex( pMe -> pIM3D,
            pMe -> pAlc,
            &pMe -> Player.figure,
            &e );
if( e != mcx_NoException )
{
return HI_FALSE;
}

/*----- Bone BoundingVolume -----*/
/*----- 手のボーン -----*/
pMe->Player.Shape.pbvbone [ HAND_SHAPE ] = IMICRO3D_mcx_BVBuilder_createBoneBVx ( pMe -> pIM3D,
           pMe -> pAlc,
           &pMe -> Player.figure,
           HAND_BONE,   /* boneID */
           0,
           MCX_SHAPE_TYPE_SPHERE,
           3072,
           MCX_BV_ROTATE_NONE,
           &e ) ;
if ( e ! = mcx_NoException )
{
return HI_FALSE;
}

~以下略~

作成したBVを用いて、プレイヤーの攻撃の当たり判定を行います。当たりが判定され、かつ、NPCがガードをしていなかった場合に、NPCにのけぞりのアクションをさせます。

/*----- action index -----*/
#define P_NORMAL          0          /* Player通常                                      */
#define P_PUNCH            1          /* Playerパンチ                                    */
#define P_KICK               2          /* Playerキック                                     */
#define NP_PGUARD_B     0          /* NonPlayerパンチに対するガードを開始 */
#define NP_PGUARD_E     1          /* NonPlayerパンチに対するガードを終了 */
#define NP_KGUARD_B     2          /* NonPlayerキックに対するガードを開始 */
#define NP_KGUARD_E     3          /* NonPlayerキックに対するガードを終了 */
#define NP_PHIT             4          /* NonPlayerパンチがヒット                   */
#define NP_KHIT             5          /* NonPlayerキックがヒット                    */

  ~中略~

/*----- Playerの手とNonPlayerの頭の衝突判定 -----*/
isHit_head = IMICRO3D_mcx_Collision_isHitShapeToShapex ( pMe -> pIM3D,
      pMe -> mc_data.Collision.pcollision,
      ( mcxShapex* ) pMe -> Player.Shape.pbvbone [ HAND_SHAPE ],
      ( mcxShapex* ) pMe -> NonPlayer.Shape.pbvbone [ HEAD_SHAPE ],
      &hitData,
      &e ) ;

  ~中略~

/*----- 衝突時のイベント -----*/
if( isHit_head == HI_TRUE
&& pMe -> Player.act_idx == P_PUNCH
&& pMe -> NonPlayer.act_idx != NP_PGUARD_B )
{
pMe -> NonPlayer.act_idx = NP_PHIT;
}

~中略~

 
ボクシング実行時の画面