ボクシング
バウンディングボリューム ( BV ) の当たり判定を利用して、ボクシングをするサンプルです。NPC ( 青トランクス )はランダムに防御を繰り返します。プレイヤー ( 赤トランクス ) を操作し、隙をついて NPC を攻撃してください。
目次
1. 攻撃の当たり判定
攻撃の当たり判定は、プレイヤーの手足のボーンに設定した バウンディングボリュームと NPC のすべてのボーンに設定した バウンディングボリュームの衝突判定で行ないます。プレイヤー側の バウンディングボリュームと NPC 側の バウンディングボリュームが衝突した際、NPC が防御状態でなければ当たったと判定します。
2. ボクシングのサンプルコード
ここでは、バウンディングボリュームによる攻撃の当たり判定を中心にサンプルコードを説明します。まず、衝突判定用にプレイヤーの手足のボーンに バウンディングボリュームを設定します。
/**
* m3dNode* handNode;
* m3dNode* footNode;
* float matrix [ 16 ];
*/
/* Player の BVFigure の生成 */
pmcx -> pPlayerBvfig =
/* 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 =
pmcx -> player_footBoneID =
/* 手足のボーンからバウンディングボリュームを生成 */
pmcx -> pPlayerHandBV =
pmcx -> pPlayerFootBV =
/* 手足のボーンにバウンディングボリュームを設定 */
IMICRO3Dv4es_mcx_BVFigure_setBVToBonef ( pMe -> pIM3D,
* 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 );
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 );
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 -> player_handBoneID, &pMe -> e );
pmcx -> pPlayerBvfig, pmcx -> pPlayerFootBV,
pmcx -> player_footBoneID, &pMe -> e );
pmcx -> player_footBoneID, &pMe -> e );
また、プレイヤー同様、衝突判定用のバウンディングボリュームを NPC のすべてのボーンに対して設定します。
/* NPC の BVFigure の生成 */
pmcx -> pNPCBvfig =
IMICRO3Dv4es_mcx_BVBuilder_createBVFiguref ( pMe -> pIM3D,
/* NPC の変換行列取得および BVFigure への設定 */
IMICRO3Dv4es_m3dTransform_get ( pMe -> pIM3D, pmc -> pNPCTrans, matrix );
IMICRO3Dv4es_mcx_BVFigure_setTransformf ( pMe -> pIM3D, pmcx -> pNPCBvfig, matrix, &pMe -> e );
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 = HI_FALSE;
/* キックの衝突判定 */
if ( mcSample_player_isKicking ( pMe ) && mcSample_npc_isKickChance ( pMe ) ) {
* mcxCollisionf* pCollision;
* mcxCollisionIsHitDataf hidData;
* hi_bool isHit = HI_FALSE;
*/
/* パンチの衝突判定 */
if ( mcSample_player_isPunching ( pMe ) && mcSample_npc_isPunchChance( pMe ) ) {
isHit =
if ( isHit ) {
}
IMICRO3Dv4es_mcx_Collision_isHitShapeToBVFiguref(
pMe -> pIM3D, pCollision,
( mcxShapef * ) pmcx -> pPlayerHandBV,
pmcx -> pNPCBvfig, HI_FALSE, &hitData, &pMe -> e );
( mcxShapef * ) pmcx -> pPlayerHandBV,
pmcx -> pNPCBvfig, HI_FALSE, &hitData, &pMe -> e );
if ( isHit ) {
/* パンチが当たった */
mcSample_npc_action ( pMe, NPC_ACTION_TYPE_PHITTED );
}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(
if ( isHit ) {
pMe -> pIM3D, collision,
( mcxShapef * ) pmcx -> pPlayerFootBV,
pmcx -> pNPCBvfig, HI_FALSE, &hitData, &pMe -> e );
( mcxShapef * ) pmcx -> pPlayerFootBV,
pmcx -> pNPCBvfig, HI_FALSE, &hitData, &pMe -> e );
/* キックが当たった */
mcSample_npc_action ( pMe, NPC_ACTION_TYPE_KHITTED );
}mcSample_npc_action ( pMe, NPC_ACTION_TYPE_KHITTED );

Boxing の実行時の画面

