見出し画像

プレイヤーと当たったボールが飛んでいく:3Dサンプルプログラム

実装イメージ

・プレイヤーと当たったらボールが飛んでいきます。
・ボールの移動する方向はプレイヤー座標からボール座標の方向です。
・ボールは徐々にゆっくりになっていきます。

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

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

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

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

// カメラ座標
VECTOR CameraPos;
// 注視点座標
VECTOR CameraTarget;

// ボールの座標
VECTOR BallPos;
// ボールの移動ベクトル
VECTOR BallMov;

// ==============================
// *** 初期化処理 ***
// ==============================
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 );

	// ボール座標は原点付近にランダム
	BallPos.x = GetRand( 30 ) - 15;
	BallPos.y = BALL_RADIUS;
	BallPos.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;
	}

	// プレイヤーからボールまでのベクトルを作成
	VECTOR Vec = VSub( BallPos, PlayerPos );
	// ベクトルの長さを計算
	float Length = VSize( Vec );
	// ベクトルの距離と半径の合計よりも短かったら当たっている
	if( Length < PLAYER_RADIUS + BALL_RADIUS ){
		Vec.y = 0.0f;
		// 移動ベクトルを作成
		BallMov = VScale( VNorm( Vec ), 1.0f );
	}
	// ボールの座標移動
	BallPos = VAdd( BallPos, BallMov );
	// 移動ベクトルを小さくしていく
	BallMov = VScale( BallMov, 0.9f );

	// カメラ座標はプレイヤー座標から少し離れたところ
	CameraPos = VAdd( PlayerPos, VGet( 0.0f, 5.0f, -7.0f ) );
	// 注視点の座標はプレイヤー座標の少し上
	CameraTarget = VAdd( PlayerPos, VGet( 0.0f, 2.0f, 0.0f ) );
}
// ==============================
// *** 描画処理 ***
// ==============================
void Game_Draw()
{
	// カメラの位置と注視点をセット
	SetCameraPositionAndTarget_UpVecY( CameraPos, CameraTarget );

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

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

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

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