3Dゲームでレーダーみたいな物を作ってみる

 

はい、てなわけで敵が映されるレーダー作ります。

 

今回もDxlib使用。

 

まずどんなレーダーを作るかと言うと。

f:id:haina817:20160613214351p:plain

こんなの
中心が自分で赤い点が敵。
これがあるとFPSとかに使えるよね。

 

んじゃ先にこれからやることメモ。

  1. XZ軸で自機から敵の距離とカメラと敵の角度差を取得。
  2. レーダーに映る範囲を決めて範囲内の敵を保管。
  3. 取得した値を使って描画。

以上。

まず最初にそれぞれの値を格納する構造体を作る

//敵との距離と角度を格納

struct RadarEnemy
{
float angle;
float range;
bool flag;
};

 

 んでレーダーに移す敵の分だけ配列で定義

//レーダーの処理と描画
class CRadar
{
//敵の出力限界が30体のため
RadarEnemy enemy[RADAR_ENEMY_MAX];
public:
CRadar();
void Init();
void Render();
void GetEnemy(float &angle, float &range);

};

 

敵の確保のやり方はこんな感じ。

//距離算出
VECTOR tmp2 = GetVSub(enemy->position,Player->position);
float range =(tmp2 .x a tmp2 .x + tmp2 .y a tmp2 .y + tmp2 .z a tmp2 v1.z);

//レーダー範囲内
if (range <= (RADAR_RANGE * RADAR_RANGE))
{
//カメラの向いている向きを基準に敵の角度を算出
float angle = GetAngle(tmp, tmp2, TRUE);
//レーダーに記憶させる
radar->GetEnemy(angle, range);
}

 

 

描画はこうやってする

void CRadar::Render()
{
//レーダーの背景描画
DrawCircle(POSITION_X, POSITION_Y, RADAR_SIZE, GetColor(30, 130, 40));
DrawCircle(POSITION_X, POSITION_Y, RADAR_SIZE, GetColor(0, 0, 0), false);
DrawCircle(POSITION_X, POSITION_Y, RADAR_SIZE*0.8f, GetColor(0, 0, 0),false);
DrawCircle(POSITION_X, POSITION_Y, RADAR_SIZE*0.6f, GetColor(0, 0, 0), false);
DrawCircle(POSITION_X, POSITION_Y, RADAR_SIZE*0.4f, GetColor(0, 0, 0), false);
DrawCircle(POSITION_X, POSITION_Y, RADAR_SIZE*0.2f, GetColor(0, 0, 0), false);
DrawLine(POSITION_X - RADAR_SIZE, POSITION_Y, POSITION_X + RADAR_SIZE, POSITION_Y, GetColor(0, 0, 0));
DrawLine(POSITION_X, POSITION_Y - RADAR_SIZE, POSITION_X, POSITION_Y + RADAR_SIZE, GetColor(0, 0, 0));
//敵の位置を描画
for (int i = 0; i < RADAR_ENEMY_MAX; i++)
{
if (enemy[i].flag == true)
{
VECTOR pos = VGet(0, -1,0);
VECTOR  tmp;
//あらかじめ取得しておいた角度までベクトルを回転する
float sinParam = sin(-enemy[i].angle);
float cosParam = cos(-enemy[i].angle);
tmp.x = (pos.x * cosParam) - (pos.y * sinParam);
tmp.y = (pos.x * sinParam) + (pos.y * cosParam);
tmp.z = 0.0f;
//比率を出してレーダーに反映
pos = VScale(tmp, (tmp, enemy[i].range / GetSquareNumber(RADAR_RANGE) * RADAR_SIZE));
DrawCircle(pos.x + POSITION_X, pos.y + POSITION_Y, 2, GetColor(253, 0, 40));
DrawCircle(pos.x + POSITION_X, pos.y + POSITION_Y, 2, GetColor(255, 255, 255), false);
}
}
//初期化
Init();

}

 

出来上がったレーダーがこちら(右下の丸いやつ)

f:id:haina817:20160613223859j:plain

ちょっとだけドラ〇ンレーダー意識しました。
(今気が付いたけど本家は囲碁の基盤みたいな模様だったorz)

 

最近忙しいから全然更新出来てなかったけどこうゆうライトな記事も出していこうかと思います。