見出し画像

プレイヤー(球)とボールの当たり判定:3Dサンプルプログラム

・プレイヤーは左右キーで向きを変更して上キーで移動します。
・プレイヤー(球)とボールで当たり判定をしています。
・当たったボールは座標をランダムに設定しなおしています。

#include "DxLib.h"
#include <math.h>

// 度をラジアンに変換する
#define D2R(deg) ((deg)*DX_PI_F/180.0f)
// ボールの最大数
#define MAX_BALL	10
// ボールの半径
#define BALL_RADIUS	0.3f
// プレイヤーの半径(プレイヤーモデルを囲むくらいの大きさの球として)
#define PLAYER_RADIUS	1.0f

// ステージモデルハンドル
int StageHandle;

// プレイヤーモデルハンドル
int PlayerHandle;
// プレイヤーの座標
VECTOR PlayerPos;
// プレイヤーの向き
VECTOR PlayerAngle;

// ボールの座標
VECTOR BallPos[MAX_BALL];

// ==============================
// *** 初期化処理 ***
// ==============================
void Game_Init()
{
	// 3Dモデルの読み込み
	StageHandle = MV1LoadModel( "stage.mqo" );
	PlayerHandle = MV1LoadModel( "player.mqo" );

	// プレイヤー座標は原点から
	PlayerPos = VGet( 0.0f, 0.0f, 0.0f );
	// 回転なしの状態から開始
	PlayerAngle = VGet( 0.0f, D2R( 0.0f ), 0.0f );

	for( int i = 0; i < MAX_BALL; i++ ){
		// ボール座標は原点付近にランダム
		BallPos[i].x = GetRand( 30 ) - 15;
		BallPos[i].y = 0.5f;
		BallPos[i].z = GetRand( 30 ) - 15;
	}
}
// ==============================
// *** 更新処理 ***
// ==============================
void Game_Update()
{
	// 左右キーで向きの変更
	if( CheckHitKey( KEY_INPUT_RIGHT ) ){
		PlayerAngle.y += D2R( 2.0f );
	}
	if( CheckHitKey( KEY_INPUT_LEFT ) ){
		PlayerAngle.y -= D2R( 2.0f );
	}
	// 向きに合わせて座標移動
	if( CheckHitKey( KEY_INPUT_UP ) ){
		PlayerPos.x += sinf( PlayerAngle.y ) * 0.1f;
		PlayerPos.z += cosf( PlayerAngle.y ) * 0.1f;
	}

	for( int i = 0; i < MAX_BALL; i++ ){
		// プレイヤーからボールまでの距離を計算
		VECTOR Vec = VSub( BallPos[i], PlayerPos );
		// 半径の合計よりも短かったら当たっている
		if( VSize( Vec ) < PLAYER_RADIUS + BALL_RADIUS ){
			BallPos[i].x = GetRand( 30 ) - 15;
			BallPos[i].y = 0.5f;
			BallPos[i].z = GetRand( 30 ) - 15;
		}
	}
}
// ==============================
// *** 描画処理 ***
// ==============================
void Game_Draw()
{
	// カメラの位置と注視点をセット
	SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 10.0f, -20.0f ), VGet( 0.0f, 0.0f, -5.0f ) );

	// ステージモデルの描画
	MV1DrawModel( StageHandle );

	// ボールの描画
	for( int i = 0; i < MAX_BALL; i++ ){
		DrawSphere3D( BallPos[i], BALL_RADIUS, 10, GetColor( 255, 255, 0 ), GetColor( 255, 255, 0 ), TRUE );
	}
		
	// プレイヤーモデルの座標をセットする
	MV1SetPosition( PlayerHandle, PlayerPos );
	// プレイヤーモデルの回転値をセットする
	MV1SetRotationXYZ( PlayerHandle, PlayerAngle );
	// プレイヤーモデルを描画する
	MV1DrawModel( PlayerHandle );
}

サンプルプログラムで記述している描画や操作関係はDXライブラリを使っていますが、DXライブラリを使わない開発でも処理としては同じような実装で動作すると思います。

いいなと思ったら応援しよう!