プレイヤーが近づいたらプレイヤーに向かってボール移動: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
// プレイヤーの周りの大きな球の半径
#define AREA_RADIUS 7.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( PlayerPos, BallPos[i] );
// ベクトルの長さを計算
float Length = VSize( Vec );
// エリアに入っている
if( Length < AREA_RADIUS ){
// 移動ベクトルを作成
VECTOR Mov = VScale( Vec, 0.1f );
// ボール座標の移動
BallPos[i] = VAdd( BallPos[i], Mov );
}
// ベクトルの距離と半径の合計よりも短かったら当たっている
if( Length < 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 );
// プレイヤーの周りの大きな球
DrawSphere3D( PlayerPos, AREA_RADIUS, 8, GetColor( 0, 255, 255 ), GetColor( 0, 255, 255 ), FALSE );
}
サンプルプログラムで記述している描画や操作関係はDXライブラリを使っていますが、DXライブラリを使わない開発でも処理としては同じような実装で動作すると思います。