적을 잠그는 기능 구현
액션 게임 등에서 자주 있는 적을 록온하는 기능을 구현하고 싶습니다.
잠그는 적
우선 어떤 적을 잠그는지,
플레이어의 정면 벡터와 플레이어로부터 에너지로 늘어나는 벡터 사이의 각도 θ를 구하여,
플레이어와 에너지의 거리를 곱합니다. 나온 값이 가장 낮습니다. 즉, 거리가 가까워서 플레이어 앞에 있는 적을 잠급니다.
a = (θ의 절대 값) × (플레이어와 에너지의 거리)
a의 값이 가장 낮은 적을 잠급니다.
Player.cpp std::vector<Enemy*> m_enemyList; //エネミーの配列
Vector3 m_position //プレイヤーの座標
bool m_isRockOn = false;
//プレイヤーの向いている角度を計算します
float degreep = atan2f(forward.x, forward.z);
//計算して出た暫定的に一番小さい角度を記憶する変数です
float degreemum= M_PI * 2;
for(Enemy* enemy : m_enemyList)
{
Vector3 pos = m_position - enemy->GetPosition();
//プレイヤーとエネミーの距離が一定外だったら下の処理をスキップします。
if (pos.Length() >= 500)
continue;
//プレイヤーとエネミーを結ぶベクトルを出します
CVector3 pos2 = enemy->GetPosition() - m_position;
//y座標、すなわち高さを0にします
pos2.y = 0.0f;
//ベクトルを正規化します
pos2.Normalize();
//プレイヤーとエネミーを結ぶベクトルの角度を計算します
float degree = atan2f(pos2.x, pos2.z);
//ここら辺のif文要らない可能性が微レ存、「プレイヤーの正面のベクトルの角度」と
//「プレイヤーとエネミーを結ぶベクトルの角度」の差を計算します
if (M_PI <= (degreep - degree)) {
degree = degreep - degree - M_PI * 2;
}
else if (-M_PI >= (degreep - degree)) {
degree = degreep - degree + M_PI * 2;
}
else {
degree = degreep - degree;
}
//求めた角度にプレイヤーとエネミーの距離に応じて補正をかけます、距離が長いほど補正は大きいです(値が大きくなります)
degree = degree + degree * (pos.Length() / 500) * 0.3f;
//求めた値を比較していき、一番小さい値を決めていきます
if (fabs(degreemum) >= fabs(degree)) {
degreemum = degree;
}
}
//求めた一番小さい値が一定値より小さい場合、ターゲッティングをオンにします
if (fabs(degreemum) <= M_PI / 3) {
m_isRockOn = true;
}
//逆に一定値より大きい場合、ターゲッティングをオフにします
else {
m_isRockOn = false;
}
카메라
락 온했을 때의 카메라의 거동입니다만, 카메라의 주시점을 적의 좌표에, 카메라 자체의 좌표는 플레이어보다 적으로부터 떨어진 좌표로 설정합니다.
Camera.cpp Vector3 m_position; //カメラの座標
Vector3 m_target; //カメラの注視点
Vector3 m_playerPosition; //プレイヤーの座標
Vector3 m_enemyPosition; //ロックオンするエネミーの座標
//注視点はエネミーの座標にします。
m_target = m_enemyPosition;
//エネミーからプレイヤーに伸びるベクトルを求めます。
Vector3 pos = m_playerPosition - m_enemyPosition;
//カメラの高さは一定にしたいので、y成分を0にします。
pos.y = 0.0f;
//ベクトルを正規化します。
pos.Normalize();
//スカラーを掛けます
pos *= 50.0f;
//カメラがどれだけプレイヤーの座標より高いかを設定します。
pos.y = 50.0f;
//プレイヤーの座標に求めたベクトルを足して、カメラの座標とします。
m_position = m_playerPosition + pos;
Reference
이 문제에 관하여(적을 잠그는 기능 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/akurobit/items/4a221bc8bc892dd2f12f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
std::vector<Enemy*> m_enemyList; //エネミーの配列
Vector3 m_position //プレイヤーの座標
bool m_isRockOn = false;
//プレイヤーの向いている角度を計算します
float degreep = atan2f(forward.x, forward.z);
//計算して出た暫定的に一番小さい角度を記憶する変数です
float degreemum= M_PI * 2;
for(Enemy* enemy : m_enemyList)
{
Vector3 pos = m_position - enemy->GetPosition();
//プレイヤーとエネミーの距離が一定外だったら下の処理をスキップします。
if (pos.Length() >= 500)
continue;
//プレイヤーとエネミーを結ぶベクトルを出します
CVector3 pos2 = enemy->GetPosition() - m_position;
//y座標、すなわち高さを0にします
pos2.y = 0.0f;
//ベクトルを正規化します
pos2.Normalize();
//プレイヤーとエネミーを結ぶベクトルの角度を計算します
float degree = atan2f(pos2.x, pos2.z);
//ここら辺のif文要らない可能性が微レ存、「プレイヤーの正面のベクトルの角度」と
//「プレイヤーとエネミーを結ぶベクトルの角度」の差を計算します
if (M_PI <= (degreep - degree)) {
degree = degreep - degree - M_PI * 2;
}
else if (-M_PI >= (degreep - degree)) {
degree = degreep - degree + M_PI * 2;
}
else {
degree = degreep - degree;
}
//求めた角度にプレイヤーとエネミーの距離に応じて補正をかけます、距離が長いほど補正は大きいです(値が大きくなります)
degree = degree + degree * (pos.Length() / 500) * 0.3f;
//求めた値を比較していき、一番小さい値を決めていきます
if (fabs(degreemum) >= fabs(degree)) {
degreemum = degree;
}
}
//求めた一番小さい値が一定値より小さい場合、ターゲッティングをオンにします
if (fabs(degreemum) <= M_PI / 3) {
m_isRockOn = true;
}
//逆に一定値より大きい場合、ターゲッティングをオフにします
else {
m_isRockOn = false;
}
락 온했을 때의 카메라의 거동입니다만, 카메라의 주시점을 적의 좌표에, 카메라 자체의 좌표는 플레이어보다 적으로부터 떨어진 좌표로 설정합니다.
Camera.cpp
Vector3 m_position; //カメラの座標
Vector3 m_target; //カメラの注視点
Vector3 m_playerPosition; //プレイヤーの座標
Vector3 m_enemyPosition; //ロックオンするエネミーの座標
//注視点はエネミーの座標にします。
m_target = m_enemyPosition;
//エネミーからプレイヤーに伸びるベクトルを求めます。
Vector3 pos = m_playerPosition - m_enemyPosition;
//カメラの高さは一定にしたいので、y成分を0にします。
pos.y = 0.0f;
//ベクトルを正規化します。
pos.Normalize();
//スカラーを掛けます
pos *= 50.0f;
//カメラがどれだけプレイヤーの座標より高いかを設定します。
pos.y = 50.0f;
//プレイヤーの座標に求めたベクトルを足して、カメラの座標とします。
m_position = m_playerPosition + pos;
Reference
이 문제에 관하여(적을 잠그는 기능 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/akurobit/items/4a221bc8bc892dd2f12f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)