/*---------------------------------------------------------------------------* Project: NintendoWare File: anim_AnimFrameController.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 24183 $ *---------------------------------------------------------------------------*/ #ifndef NW_ANIM_ANIMFRAMECONTROLLER_H_ #define NW_ANIM_ANIMFRAMECONTROLLER_H_ #include namespace nw { namespace anim { //--------------------------------------------------------------------------- //! @brief アニメーションフレームのクラスです。 //--------------------------------------------------------------------------- class AnimFrame { public: //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! コンストラクタです。 AnimFrame() { ResetFrame(0.0f); } //! @brief コンストラクタです。 //! //! @param[in] frame フレームです。 //! AnimFrame(f32 frame) { ResetFrame(frame); } //! @brief コンストラクタです。 //! //! @param[in] frame フレームです。 //! @param[in] lastFrame 前回のフレームです。 //! AnimFrame(f32 frame, f32 lastFrame) { Set(frame, lastFrame); } //! @brief コンストラクタです。 //! //! @param[in] animFrame アニメーションフレームです。 //! AnimFrame(const AnimFrame& animFrame) { Set(animFrame); } //! デストラクタです。 virtual ~AnimFrame() {} //@} //---------------------------------------- //! @name 取得/設定 //@{ //! フレームを取得します。 f32 GetFrame() const { return m_Frame; } //! @brief フレームを設定します。 //! //! @param[in] frame 設定するフレームです。 //! void SetFrame(f32 frame) { m_LastFrame = m_Frame; m_Frame = frame; } //! 前回のフレームを取得します。 f32 GetLastFrame() const { return m_LastFrame; } //! @brief 前回のフレームを設定します。 //! //! @param[in] lastFrame 設定する前回のフレームです。 //! void SetLastFrame(f32 lastFrame) { m_LastFrame = lastFrame; } //! @brief アニメーションフレームを設定します。 //! //! @param[in] animFrame 設定するアニメーションフレームです。 //! void Set(const AnimFrame& animFrame) { m_Frame = animFrame.GetFrame(); m_LastFrame = animFrame.GetLastFrame(); } //! @brief アニメーションフレームを設定します。 //! //! @param[in] frame 設定するフレームです。 //! @param[in] lastFrame 設定する前回のフレームです。 //! void Set(f32 frame, f32 lastFrame) { m_Frame = frame; m_LastFrame = lastFrame; } //! @brief アニメーションフレームをリセットします。 //! //! @param[in] frame 設定するフレームです。 //! void ResetFrame(f32 frame) { m_Frame = m_LastFrame = frame; } //! フレーム間隔を取得します。 f32 GetDelta() const { return m_Frame - m_LastFrame; } //! 順再生かどうかを取得します。 bool IsOrder() const { return m_Frame >= m_LastFrame; } //@} //---------------------------------------- //! @name 比較 //@{ bool operator==(const AnimFrame& rhs) const { return m_Frame == rhs.m_Frame && m_LastFrame == rhs.m_LastFrame; } bool operator!=(const AnimFrame& rhs) const { return m_Frame != rhs.m_Frame || m_LastFrame != rhs.m_LastFrame; } //@} private: f32 m_Frame; f32 m_LastFrame; }; //--------------------------------------------------------------------------- //! @brief 一回再生用のアニメーション再生方法です。 //! //! @param[in] startFrame 開始フレームです。 //! @param[in] endFrame 終了フレームです。 //! @param[in] inputFrame 元のフレームです。 //! @param[in] pUserData ユーザーデータです。 //! //! @return 修正したフレームを返します。 //--------------------------------------------------------------------------- f32 PlayPolicy_Onetime(f32 startFrame, f32 endFrame, f32 inputFrame, void* pUserData); //--------------------------------------------------------------------------- //! @brief ループ再生用のアニメーション再生方法です。 //! //! @param[in] startFrame 開始フレームです。 //! @param[in] endFrame 終了フレームです。 //! @param[in] inputFrame 元のフレームです。 //! @param[in] pUserData ユーザーデータです。 //! //! @return 修正したフレームを返します。 //--------------------------------------------------------------------------- f32 PlayPolicy_Loop(f32 startFrame, f32 endFrame, f32 inputFrame, void* pUserData); //--------------------------------------------------------------------------- //! @brief アニメーションフレームを制御するクラスです。 //--------------------------------------------------------------------------- class AnimFrameController { public: //! アニメーション再生方法の型です。 typedef f32 (*PlayPolicy)(f32 startFrame, f32 endFrame, f32 inputFrame, void* pUserData); //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! @brief コンストラクタです。 //! //! @param[in] startFrame 開始フレームです。 //! @param[in] endFrame 終了フレームです。 //! @param[in] playPolicy アニメーション再生方法です。 //! @param[in] userData ユーザーデータです。 //! AnimFrameController( f32 startFrame = 0.0f, f32 endFrame = 1.0f, PlayPolicy playPolicy = PlayPolicy_Onetime, void* userData = NULL) : m_AnimFrame(startFrame), m_StepFrame(1.0f), m_StartFrame(startFrame), m_EndFrame(endFrame), m_PlayPolicy(playPolicy), m_UserData(userData) {} //! デストラクタです。 virtual ~AnimFrameController() {} //@} //---------------------------------------- //! @name 取得/設定 //@{ //! アニメーションフレームを取得します。 const AnimFrame& GetAnimFrame() const { return m_AnimFrame; } //! アニメーションフレームを取得します。 AnimFrame& GetAnimFrame() { return m_AnimFrame; } //! アニメーションフレームを設定します。 void SetAnimFrame(const AnimFrame& animFrame) { m_AnimFrame = animFrame; } //! フレームを取得します。 f32 GetFrame() const { return m_AnimFrame.GetFrame(); } //! @brief フレームを設定します。 //! //! @param[in] frame 設定するフレームです。 //! void SetFrame(f32 frame) { m_AnimFrame.SetFrame(m_PlayPolicy(m_StartFrame, m_EndFrame, frame, m_UserData)); } //! 更新フレームを取得します。 f32 GetStepFrame() const { return m_StepFrame; } //! @brief 更新フレームを設定します。 //! //! @param[in] stepFrame 設定する更新フレームです。 //! void SetStepFrame(f32 stepFrame) { m_StepFrame = stepFrame; } //! 開始フレームを取得します。 f32 GetStartFrame() const { return m_StartFrame; } //! @brief 開始フレームを設定します。 //! //! @param[in] startFrame 設定する開始フレームです。 //! void SetStartFrame(f32 startFrame) { m_StartFrame = startFrame; } //! 終了フレームを取得します。 f32 GetEndFrame() const { return m_EndFrame; } //! @brief 終了フレームを設定します。 //! //! @param[in] endFrame 設定する終了フレームです。 //! void SetEndFrame(f32 endFrame) { m_EndFrame = endFrame; } //! アニメーション再生方法を取得します。 PlayPolicy GetPlayPolicy() const { return m_PlayPolicy; } //! @brief アニメーション再生方法を設定します。 //! //! @param[in] playPolicy 設定するアニメーション再生方法です。 //! PlayPolicy_Onetime() と PlayPolicy_Loop() がライブラリで用意されています。 //! void SetPlayPolicy(PlayPolicy playPolicy) { m_PlayPolicy = playPolicy; } //! ユーザーデータを取得します。 const void* GetUserData() const { return m_UserData; } //! ユーザーデータを取得します。 void* GetUserData() { return m_UserData; } //! @brief ユーザーデータを設定します。 //! //! 設定したユーザーデータは、 SetPlayPolicy() で設定した関数に渡されます。 //! ユーザー定義の関数を設定している場合に、関数内からアクセスすることができます。 //! 例えば、アニメーションの再生が終了したらフラグを立てるといった応用があります。 //! //! @param[in] userData 設定するユーザーデータです。 //! void SetUserData(void* userData) { m_UserData = userData; } //@} //---------------------------------------- //! @name 更新 //@{ //! アニメーションフレームを進めます。 void UpdateFrame() { SetFrame(GetFrame() + m_StepFrame); } //@} private: AnimFrame m_AnimFrame; f32 m_StepFrame; f32 m_StartFrame; f32 m_EndFrame; PlayPolicy m_PlayPolicy; void* m_UserData; }; } /* namespace anim */ } /* namespace nw */ #endif /* NW_ANIM_ANIMFRAMECONTROLLER_H_ */