1、テンプレートGameObject 2、行動の使いまわしによるできるだけ少ないコード 3、セルマップによるAStar検索 4、細かなステートの変化 5、剣での戦い
図0110a
「Aボタン」で、プレイヤーはジャンプします「Xボタン」で剣にのようなオブジェクトを振り、敵を攻撃します。
1、プレイヤーと敵の2つのクラス(マネージャ含めると2セットというべきか)を作成する 2、クラスは1セットだが、プレイヤーや敵が、その「HPバーセット」を管理しHP変更の場合は、そのメンバ関数を呼び出す。 3、クラスは1セットで、「HPバーマネージャ」がプレイヤー及び敵の「GetHP()関数」呼び出しを行って、HPを取得する。
//--------------------------------------------------------------------------------------
// HPのマネージャ(テンプレートクラス)
//--------------------------------------------------------------------------------------
template<typename T>
class HPManeger : public GameObject {
weak_ptr<T> m_TargetObj;
weak_ptr<HPSquareBase> m_HPSquareBase;
weak_ptr<HPSquare> m_HPSquare;
Col4 m_Color;
Quat Billboard(const Vec3& Line) {
Vec3 Temp = Line;
Mat4x4 RotMatrix;
Vec3 DefUp(0, 1.0f, 0);
Vec2 TempVec2(Temp.x, Temp.z);
if (TempVec2.length() < 0.1f) {
DefUp = Vec3(0, 0, 1.0f);
}
Temp.normalize();
RotMatrix = XMMatrixLookAtLH(Vec3(0, 0, 0), Temp, DefUp);
RotMatrix.inverse();
Quat Qt;
Qt = RotMatrix.quatInMatrix();
Qt.normalize();
return Qt;
}
void UpdateHPTrans() {
auto ShTarget = m_TargetObj.lock();
auto ShHPSquareBase = m_HPSquareBase.lock();
auto ShHPSquare = m_HPSquare.lock();
if (ShTarget && ShHPSquareBase && ShHPSquare) {
auto HPBaseTrans = ShHPSquareBase->GetComponent<Transform>();
auto HPTrans = ShHPSquare->GetComponent<Transform>();
//スケーリング
float MaxHP = ShTarget->GetMaxHP();
float HP = ShTarget->GetHP();
float Width = HP / MaxHP;
HPBaseTrans->SetScale(0.5f, 0.125f, 0.5);
HPTrans->SetScale(0.46f * Width, 0.1f, 0.46f);
auto TargetTrans = ShTarget->GetComponent<Transform>();
auto Pos = TargetTrans->GetPosition();
Pos.y += 0.75f;
HPBaseTrans->SetPosition(Pos);
Pos = Vec3(0, 0, -0.001f);
Pos.x -= 0.46f * 0.5f;
Pos.x += (0.46f * Width * 0.5f);
HPTrans->SetPosition(Pos);
auto PtrCamera = GetStage()->GetView()->GetTargetCamera();
Quat Qt;
//向きをビルボードにする
Qt = Billboard(PtrCamera->GetAt() - PtrCamera->GetEye());
HPBaseTrans->SetQuaternion(Qt);
}
}
public:
//構築と破棄
HPManeger(const shared_ptr<Stage>& StagePtr,
const shared_ptr<T>& TargetObj,
const Col4& Col):
GameObject(StagePtr),
m_TargetObj(TargetObj),
m_Color(Col)
{}
virtual ~HPManeger() {}
//初期化
virtual void OnCreate() override {
auto HPBase = GetStage()->AddGameObject<HPSquareBase>();
auto HP = GetStage()->AddGameObject<HPSquare>(m_Color);
auto PtrTrans = HP->GetComponent<Transform>();
PtrTrans->SetParent(HPBase);
m_HPSquareBase = HPBase;
m_HPSquare = HP;
UpdateHPTrans();
}
virtual void OnUpdate2() override {
UpdateHPTrans();
}
};
AddGameObject<HPManeger<Player>>(PlayerPtr,Col4(0,1,0,1));
AddGameObject<HPManeger<Enemy>>(EnemyPtr, Col4(1, 0, 0, 1));
float MaxHP = ShTarget->GetMaxHP();
float HP = ShTarget->GetHP();
auto HPBase = GetStage()->AddGameObject<HPSquareBase>();
auto HP = GetStage()->AddGameObject<HPSquare>(m_Color);
template <typename T>
class FightBehavior : public ObjBehavior<T> {
//回転切りの回転角度
float m_RotationShakeRad;
//剣のweak_ptr
weak_ptr<Sword> m_SwordWeak;
//相手の剣に当たったときの変数
//相手の場所
Vec3 m_HitBase;
//ひるむ時間
float m_HitSwordTime;
//倒れた処理用
enum class DieFlag {
Down,
Die,
Up,
};
float m_DieRot;
float m_DieInterval;
DieFlag m_DieFlag;
Vec3 m_PokeStart;
public:
//--------------------------------------------------------------------------------------
/*!
@brief コンストラクタ
*/
//--------------------------------------------------------------------------------------
FightBehavior(const shared_ptr<T>& GameObjectPtr):
ObjBehavior(GameObjectPtr)
{}
//--------------------------------------------------------------------------------------
/*!
@brief デストラクタ
*/
//--------------------------------------------------------------------------------------
virtual ~FightBehavior() {}
//--------------------------------------------------------------------------------------
/*!
@brief 剣を持つ処理
@param[in] SwordKey 剣を特定するキー
@return なし
*/
//--------------------------------------------------------------------------------------
void HaveSword(const wstring& SwordKey) {
//中略
}
//--------------------------------------------------------------------------------------
/*!
@brief 剣を振る処理の開始
@return なし
*/
//--------------------------------------------------------------------------------------
void StartShakeSword() {
//中略
}
//--------------------------------------------------------------------------------------
/*!
@brief 剣を振る(回転)
@return 半周回転したらtrue
*/
//--------------------------------------------------------------------------------------
bool RotationShakeSword() {
//中略
}
//--------------------------------------------------------------------------------------
/*!
@brief 剣を突く処理の開始
@return なし
*/
//--------------------------------------------------------------------------------------
void StartPokeSword() {
//中略
}
//--------------------------------------------------------------------------------------
/*!
@brief 剣を突く
@return 一定距離突いたらtrue
*/
//--------------------------------------------------------------------------------------
bool PokeSword() {
//中略
}
//--------------------------------------------------------------------------------------
/*!
@brief 相手の剣に当たったときの相手の位置の設定
@param[in] pos 位置
@return なし
*/
//--------------------------------------------------------------------------------------
void SetHitBase(const Vec3& pos) {
m_HitBase = pos;
}
//--------------------------------------------------------------------------------------
/*!
@brief 相手の剣に当たった行動
@return なし
*/
//--------------------------------------------------------------------------------------
void HitSwordBehavior() {
//中略
}
//--------------------------------------------------------------------------------------
/*!
@brief 剣に当たってひるむ行動
@return ひるむ時間が終わったらtrue
*/
//--------------------------------------------------------------------------------------
bool HitAfterdBehavior() {
//中略
}
//--------------------------------------------------------------------------------------
/*!
@brief 倒れる開始
@return なし
*/
//--------------------------------------------------------------------------------------
void DieStartBehavior() {
//中略
}
//--------------------------------------------------------------------------------------
/*!
@brief 倒れる行動
@return 一連の動作が終わればtrue
*/
//--------------------------------------------------------------------------------------
bool DieBehavior() {
//中略
}
};