Japanese | English | Korean

Samples

ボクシング

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

目次


1. 攻撃の当たり判定

攻撃の当たり判定は、プレイヤーの手足のボーンに設定した バウンディングボリュームと NPC のすべてのボーンに設定した バウンディングボリュームの衝突判定で行ないます。プレイヤー側の バウンディングボリュームと NPC 側の バウンディングボリュームが衝突した際、NPC が防御状態でなければ当たったと判定します。




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

ここでは、バウンディングボリュームによる攻撃の当たり判定を中心にサンプルコードを説明します。まず、衝突判定用にプレイヤーの手足のボーンに バウンディングボリュームを設定します。

/**
  * m3dNode* handNode;
  * m3dNode* footNode;
  * float         matrix [ 16 ];
  */


/* Player の BVFigure の生成 */
pmcx -> pPlayerBvfig =
IMICRO3Dv4es_mcx_BVBuilder_createBVFigureOnlyBonef (
pMe -> pIM3D, pMe -> pAlc, ( m3dSkinnedMesh * ) pmc -> pPlayer, &pMe ->e );

/* Player の変換行列取得および BVFigure への設定 */
IMICRO3Dv4es_m3dTransform_get ( pMe -> pIM3D, pmc -> pPlayerTrans, matrix );
IMICRO3Dv4es_mcx_BVFigure_setTransformf ( pMe -> pIM3D, pmcx -> pPlayerBvfig, matrix, &pMe -> e );

/* 手足のボーンを取得 */
/* Player は UID 64, 75 の各 Node がそれぞれ手と足のボーンに対応。 */
handNode = ( m3dNode * ) IMICRO3Dv4es_m3dObject3D_find ( pMe -> pIM3D, ( m3dObject3D * ) pmc -> pPlayer, 64 );
footNode  = ( m3dNode * ) IMICRO3Dv4es_m3dObject3D_find ( pMe -> pIM3D, ( m3dObject3D * ) pmc -> pPlayer, 75 );

/* 手足のボーン ID を取得 */
pmcx -> player_handBoneID =
IMICRO3Dv4es_mcx_BVFigureM3g_getBoneIdf ( pMe -> pIM3D, pmcx -> pPlayerBvfig, handNode, &pMe -> e );

pmcx -> player_footBoneID =
IMICRO3Dv4es_mcx_BVFigureM3g_getBoneIdf ( pMe -> pIM3D, pmcx -> pPlayerBvfig, footNode, &pMe -> e );

/* 手足のボーンからバウンディングボリュームを生成 */
pmcx -> pPlayerHandBV =
IMICRO3Dv4es_mcx_BVBuilder_createBoneBV_m3gf (
pMe -> pIM3D, pMe -> pAlc, ( m3dSkinnedMesh * ) pmc -> pPlayer,
handNode, MCX_SHAPE_TYPE_SPHERE, 1.f, MCX_BV_ROTATE_NONE, &pMe -> e );

pmcx -> pPlayerFootBV =
IMICRO3Dv4es_mcx_BVBuilder_createBoneBV_m3gf (
pMe -> pIM3D, pMe -> pAlc, ( m3dSkinnedMesh * ) pmc -> pPlayer,
footNode, MCX_SHAPE_TYPE_SPHERE, 1.f, MCX_BV_ROTATE_NONE, &pMe -> e );

/* 手足のボーンにバウンディングボリュームを設定 */
IMICRO3Dv4es_mcx_BVFigure_setBVToBonef ( pMe -> pIM3D,
pmcx -> pPlayerBvfig, pmcx -> pPlayerHandBV,
pmcx -> player_handBoneID, &pMe -> e );
IMICRO3Dv4es_mcx_BVFigure_setBVToBonef ( pMe -> pIM3D,
pmcx -> pPlayerBvfig, pmcx -> pPlayerFootBV,
pmcx -> player_footBoneID, &pMe -> e );

また、プレイヤー同様、衝突判定用のバウンディングボリュームを NPC のすべてのボーンに対して設定します。

/* NPC の BVFigure の生成 */
pmcx -> pNPCBvfig =
IMICRO3Dv4es_mcx_BVBuilder_createBVFiguref ( pMe -> pIM3D,
pMe -> pAlc, ( m3dSkinnedMesh * ) pmc -> pNPC, MCX_SHAPE_TYPE_BOX, 1.f, &pMe -> e );

/* NPC の変換行列取得および BVFigure への設定 */
IMICRO3Dv4es_m3dTransform_get ( pMe -> pIM3D, pmc -> pNPCTrans, matrix );

IMICRO3Dv4es_mcx_BVFigure_setTransformf ( pMe -> pIM3D, pmcx -> pNPCBvfig, matrix, &pMe -> e );

作成したバウンディングボリュームを用いて、プレイヤーの攻撃の当たり判定を行ないます。当たりと判定されたとき、NPC はのけぞりのアクションを行ないます。

/**
  * mcxCollisionf*            pCollision;
  * mcxCollisionIsHitDataf hidData;
  * hi_bool                       isHit = HI_FALSE;
  */


/* パンチの衝突判定 */
if ( mcSample_player_isPunching ( pMe ) && mcSample_npc_isPunchChance( pMe ) ) {
isHit =
IMICRO3Dv4es_mcx_Collision_isHitShapeToBVFiguref(
pMe -> pIM3D, pCollision,
( mcxShapef * ) pmcx -> pPlayerHandBV,
pmcx -> pNPCBvfig, HI_FALSE, &hitData, &pMe -> e );

if ( isHit ) {
/* パンチが当たった */
mcSample_npc_action ( pMe, NPC_ACTION_TYPE_PHITTED );
}
}

isHit = HI_FALSE;

/* キックの衝突判定 */
if ( mcSample_player_isKicking ( pMe ) && mcSample_npc_isKickChance ( pMe ) ) {
isHit =
IMICRO3Dv4es_mcx_Collision_isHitShapeToBVFiguref(
pMe -> pIM3D, collision,
( mcxShapef * ) pmcx -> pPlayerFootBV,
pmcx -> pNPCBvfig, HI_FALSE, &hitData, &pMe -> e );
if ( isHit ) {
/* キックが当たった */
mcSample_npc_action ( pMe, NPC_ACTION_TYPE_KHITTED );
}
}

 
Boxing の実行時の画面