サンプル
ボクシング
バウンディングボリューム(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,
if( e != mcx_NoException )
{
/*----- Bone BoundingVolume -----*/
/*----- 手のボーン -----*/
pMe -> Player.Shape.pbvbone [ HAND_SHAPE ] = IMICRO3D_mcx_BVBuilder_createBoneBVx ( pMe -> pIM3D,
if ( e ! = mcx_NoException )
{
~以下略~
#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 );
&pMe -> Player.figure,
&e );
{
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 ) ;
&pMe -> Player.figure,
HAND_BONE, /* boneID */
0,
MCX_SHAPE_TYPE_SPHERE,
3072,
MCX_BV_ROTATE_NONE,
&e ) ;
{
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,
~中略~
/*----- 衝突時のイベント -----*/
if( isHit_head == HI_TRUE
~中略~
#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 );
( 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_PGUARD_B )
pMe -> NonPlayer.act_idx = NP_PHIT;
}~中略~

ボクシング実行時の画面


