図0103a
//--------------------------------------------------------------------------------------
/// プレイヤー
//--------------------------------------------------------------------------------------
class Player : public GameObject {
//最高速度
float m_MaxSpeed;
//減速率
float m_Decel;
//質量
float m_Mass;
//文字列の表示
void DrawStrings();
public:
//構築と破棄
//--------------------------------------------------------------------------------------
/*!
@brief コンストラクタ
@param[in] StagePtr ステージ
*/
//--------------------------------------------------------------------------------------
Player(const shared_ptr<Stage>& StagePtr);
//--------------------------------------------------------------------------------------
/*!
@brief デストラクタ
*/
//--------------------------------------------------------------------------------------
virtual ~Player() {}
//アクセサ
//--------------------------------------------------------------------------------------
/*!
@brief コントローラから方向ベクトルを得る
@return 方向ベクトル
*/
//--------------------------------------------------------------------------------------
Vec3 GetMoveVector() const;
//--------------------------------------------------------------------------------------
/*!
@brief プレイヤーを移動させる
@return なし
*/
//--------------------------------------------------------------------------------------
void MovePlayer();
//--------------------------------------------------------------------------------------
/*!
@brief 最高速度を得る
@return 最高速度
*/
//--------------------------------------------------------------------------------------
float GetMaxSpeed() const {
return m_MaxSpeed;
}
//--------------------------------------------------------------------------------------
/*!
@brief 減速値を得る
@return 減速値
*/
//--------------------------------------------------------------------------------------
float GetDecel() const {
return m_Decel;
}
//--------------------------------------------------------------------------------------
/*!
@brief 質量を得る
@return 質量
*/
//--------------------------------------------------------------------------------------
float GetMass() const {
return m_Mass;
}
//--------------------------------------------------------------------------------------
/*!
@brief 初期化処理
@return なし
*/
//--------------------------------------------------------------------------------------
virtual void OnCreate() override;
//--------------------------------------------------------------------------------------
/*!
@brief 更新処理
@return なし
*/
//--------------------------------------------------------------------------------------
virtual void OnUpdate() override;
//--------------------------------------------------------------------------------------
/*!
@brief 後更新処理
@return なし
*/
//--------------------------------------------------------------------------------------
virtual void OnUpdate2() override;
};
Player::Player(const shared_ptr<Stage>& StagePtr) :
GameObject(StagePtr),
m_MaxSpeed(10.0f), //最高速度
m_Decel(0.95f), //減速値
m_Mass(0.5f) //質量
{}
//初期化
void Player::OnCreate() {
//初期位置などの設定
auto Ptr = GetComponent<Transform>();
Ptr->SetScale(0.25f, 0.25f, 0.25f); //直径25センチの球体
Ptr->SetRotation(0.0f, 0.0f, 0.0f);
Ptr->SetPosition(0, 0.125f, 0);
//Rigidbodyをつける
auto PtrRedid = AddComponent<Rigidbody>();
//衝突判定をつける
auto PtrCol = AddComponent<CollisionSphere>();
PtrCol->SetIsHitAction(IsHitAction::Auto);
//デバッグ用文字列をつける
auto PtrString = AddComponent<StringSprite>();
PtrString->SetText(L"");
PtrString->SetTextRect(Rect2D<float>(16.0f, 16.0f, 640.0f, 480.0f));
//影をつける(シャドウマップを描画する)
auto ShadowPtr = AddComponent<Shadowmap>();
//影の形(メッシュ)を設定
ShadowPtr->SetMeshResource(L"DEFAULT_SPHERE");
//描画コンポーネントの設定
auto PtrDraw = AddComponent<BcPNTStaticDraw>();
//描画するメッシュを設定
PtrDraw->SetMeshResource(L"DEFAULT_SPHERE");
//描画するテクスチャを設定
PtrDraw->SetTextureResource(L"TRACE_TX");
//透明処理
SetAlphaActive(true);
//カメラを得る
auto PtrCamera = dynamic_pointer_cast<LookAtCamera>(OnGetDrawCamera());
if (PtrCamera) {
//LookAtCameraである
//LookAtCameraに注目するオブジェクト(プレイヤー)の設定
PtrCamera->SetTargetObject(GetThis<GameObject>());
//注目点をオブジェクト位置から少し上方にする
PtrCamera->SetTargetToAt(Vec3(0, 0.25f, 0));
}
}
//カメラを得る
auto PtrCamera = dynamic_pointer_cast<LookAtCamera>(OnGetDrawCamera());
if (PtrCamera) {
//LookAtCameraである
//LookAtCameraに注目するオブジェクト(プレイヤー)の設定
PtrCamera->SetTargetObject(GetThis<GameObject>());
//注目点をオブジェクト位置から少し上方にする
PtrCamera->SetTargetToAt(Vec3(0, 0.25f, 0));
}
void Player::OnUpdate() {
//プレイヤーの移動
MovePlayer();
//重力を加える
auto PtrGrav = GetBehavior<Gravity>();
PtrGrav->Execute();
}
auto PtrGrav = GetBehavior<Gravity>();
void Player::MovePlayer() {
float ElapsedTime = App::GetApp()->GetElapsedTime();
Vec3 Angle = GetMoveVector();
//Rigidbodyを取り出す
auto PtrRedit = GetComponent<Rigidbody>();
auto Velo = PtrRedit->GetVelocity();
if (Angle.length() <= 0.0f && Velo.y == 0.0f) {
//コントローラを離したとき対策
Velo *= GetDecel();
PtrRedit->SetVelocity(Velo);
return;
}
//Transform
auto PtrTransform = GetComponent<Transform>();
//現在の速度を取り出す
//目的地を最高速度を掛けて求める
auto Target = Angle * GetMaxSpeed();
//目的地に向かうために力のかける方向を計算する
//Forceはフォースである
auto Force = Target - Velo;
//yは0にする
Force.y = 0;
//加速度を求める
auto Accel = Force / GetMass();
//ターン時間を掛けたものを速度に加算する
Velo += (Accel * ElapsedTime);
//速度を設定する
PtrRedit->SetVelocity(Velo);
//回転の計算
if (Angle.length() > 0.0f) {
auto UtilPtr = GetBehavior<UtilBehavior>();
UtilPtr->RotToHead(Angle, 1.0f);
}
}
Vec3 Angle = GetMoveVector();
図0103b
そして取得した移動ベクトルをもとに、フォース(力)を作成します。フォースの計算は以下のように算出します。
図0103c
上図は現在の速度と目標地点から、どの方向にフォースをかければいいのかを図解したものです。単純に目標地点に向かってフォースをかけるのではなく、ベクトルの引き算で求めているのがわかります。
void Player::OnUpdate2() {
//文字列の表示
DrawStrings();
}