gooブログはじめました!

写真付きで日記や趣味を書くならgooブログ

timeEventの拡張

2010-02-07 14:52:37 | timeEvent

timeEventを継承して別の用途に使用する。具体的にはDrawBoxのx座標を1秒間ごとにデクリメントする。

CTimeEvent.h

CTimeEvent.cpp

CTimeEventDrawBox.h

main..cpp


<form>

CTimeEvent.h

<textarea readonly="readonly" cols="75" rows="8">#ifndef _CTIMEEVNET_H_ #define _CTIMEEVNET_H_ #define COUNTUP 0 #define COUNTDOWN 1 class CTimeEvent { public: //! CTimeEvent constructor /*! */ CTimeEvent(); //! CTimeEvent desstructor /*! */ ~CTimeEvent(); //! timeSetEvnetのインターバル設定 /*!   \param iMillsec timeSetEvnetのインターバル設定(何も設定しなければ1秒を設定)   \return void */ void SetTimeInterval( int iMillsec = 1000 ); //! timeSetEvnetのコールバック関数でカウントアップやカウントダウンされる値の設定 /*!   \param iFinishCount コールバックの終了タイムを設定   \param imode imode=COUNTDOWNならiFinishCountの値を0にするまでtimeEvnet発生,imode=COUNTUPだったらiFinishCountまでカウントアップ   \return void */ void SetCounter( int iFinishCount,int imode = COUNTDOWN ); //! m_iFinishCountのgetter /*!   \return int */ int  GetCounter(); //! timeEvnetが実行中かを表すフラグ /*!   \return int  1:timeEvent実行中   0:timeEventは実行されていない */ int IsRunning(); //! timeEvnet実行中フラグのセット、StartTimeEvnetに成功した場合 /*!   \return void */ void SetRunningFlag( int iRun ); //! timeEvnetのスタート(コールバック関数はCTimeEvent.cppで定義、カウントダウン、カウントアップのみ) //! 継承したクラスでは使用する用途に合わせる。 /*!   \return int  0:失敗  0以外:timeKillEvnetに使用するTimerID */ virtual int StartTimeEvent(); //! timeSetEvnetでm_iCountMode=0だったらカウントアップ,m_iCountMode=1だったらカウントダウン //! 継承したクラスでは使用する用途に合わせる。 /*!   \return void */ virtual void Count(); //! メンバ変数の初期化 (timeKillEvnetを実行した後は必ずこいつを呼ぶ) //! 継承したクラスではこのクラスのメンバ変数および継承したクラスのメンバ変数を初期化する /*!   \return void */ virtual void ResetValue(); // protected: //! メンバ変数の表示(ouputDebugPrint) file保存する場合はフラグを変更 /*!   \return void */ virtual void DisplayMemberValue(); protected: //! timeSetEvnetのインターバル設定 int m_iInterval; //! timeSetEvnetのcallbackでの終わり判定用変数(カウントダウン用) int m_iFinishCount; //! timeSetEvnetのcallbackでの現在値保持よう変数カウントアップ用) int m_iNowCount; //! timeSetEvnetのcallbackでのカウントアップかカウントアップ判定用変数 int m_iCountMode; ////! timeSetEvnetの実行中フラグ int m_iRunning; ////! timeSetEvnetの戻り値格納 unsigned int m_uiTimerID; }; #endif //_CTIMEEVNET_H_ </textarea>

</form>
<form>

CTimeEvent.cpp

<textarea readonly="readonly" cols="75" rows="8">#include "CTimeEvent.h" #include "common.h" //userParamに独自クラスを登録する場合、コールバック関数はそれぞれ受け取るクラスがちがうので別々に定義する必要が //がある。 void CALLBACK TimeCallBack(unsigned int timerID, unsigned int msg, unsigned int usrParam, unsigned int dw1, unsigned int dw2) { ((CTimeEvent*)usrParam)->Count(); if( ((CTimeEvent*)usrParam)->IsRunning() == 0 ) { //timeEventの終了 timeKillEvent( timerID ); //再利用のためメンバ変数を初期化(すべて0にする) ((CTimeEvent*)usrParam)->ResetValue(); } } CTimeEvent::CTimeEvent() : m_iInterval(0),m_iFinishCount(0),m_iNowCount(0),m_iCountMode(0),m_iRunning(0),m_uiTimerID(0) { } CTimeEvent::~CTimeEvent() { } void CTimeEvent::SetTimeInterval( int iMillsec ) { //timeSetEvnetのインターバル m_iInterval = iMillsec; } void CTimeEvent::SetCounter( int iFinishCount,int imode ) { if( iFinishCount > 0 ) { m_iFinishCount = iFinishCount; } switch( imode ) { case COUNTUP: m_iCountMode = COUNTUP; break; case COUNTDOWN: m_iCountMode = COUNTDOWN; break; default: break; } } void CTimeEvent::Count() { bool bEnd = false; //モードによってカウントアップ、カウントダウンを行う。 switch( m_iCountMode ) { case COUNTUP: if( m_iFinishCount <= m_iNowCount ) { bEnd = true; } if( m_iFinishCount > m_iNowCount ) { m_iNowCount++; } break; case COUNTDOWN: if( m_iFinishCount < 0 ) { bEnd = true; } else if( m_iFinishCount > 0 ) { m_iFinishCount--; PUT_LOG(LOG_WARN,"m_iFinishCount %d\n",m_iFinishCount); } break; default: break; } //countup,countdownのtimeEvnet終了したらメンバ変数を初期しておく if( bEnd == true ) { m_iRunning = 0; } } int CTimeEvent::GetCounter() { int iret = -9999; switch( m_iCountMode ) { case COUNTUP: //カウントアップしているときは現在の数値を iret = m_iNowCount; break; case COUNTDOWN: //カウントダウンしているときは残りの数値 iret = m_iFinishCount; break; default: break; } return iret; } int CTimeEvent::IsRunning() { return m_iRunning; } int CTimeEvent::StartTimeEvent() { //timeSetEventの準備ができているかチェックする if( m_iRunning == 1 ) { //このクラスでtimeEventを実行しているならなにもしない return NG; } if( m_iInterval == 0 ) { //timeSetEventのインターバルが設定されていなければ何もしない return NG; } //timeSetEvnetのTimeCallBack関数に自分のクラスを登録 m_uiTimerID = timeSetEvent( m_iInterval,1,(LPTIMECALLBACK)TimeCallBack,(DWORD)this, TIME_PERIODIC ); if( m_uiTimerID == 0 ) { return NG; } //timesetEvent実行中フラグをセット SetRunningFlag( 1 ); return m_uiTimerID; } void CTimeEvent::SetRunningFlag( int iRun ) { //1なら実行中 0ならtimeEventは実行されていない m_iRunning = iRun; } void CTimeEvent::ResetValue( ) { //すべてのメンバを0にする。サブクラスでこの関数を呼ぶ場合、親クラスのと子クラスで定義したResetVlue()をよぶ //! timeSetEvnetのインターバル設定 int m_iInterval = 0; //! timeSetEvnetのcallbackでの終わり判定用変数(カウントダウン用) int m_iFinishCount = 0; //! timeSetEvnetのcallbackでの終わり判定用変数(カウントアップ用) int m_iNowCount = 0; //! timeSetEvnetのcallbackでのカウントアップかカウントアップ判定用変数 int m_iCountMode = 0; ////! timeSetEvnetの実行中フラグ int m_iRunning = 0; ////! timeSetEvnetの戻り値格納 unsigned int m_uiTimerID = 0; } void CTimeEvent::DisplayMemberValue() { PUT_LOG(LOG_WARN,"m_iInterval %d\n",m_iInterval); PUT_LOG(LOG_WARN,"m_iFinishCount %d\n",m_iFinishCount); PUT_LOG(LOG_WARN,"m_iNowCount %d\n",m_iNowCount); PUT_LOG(LOG_WARN,"m_iCountMode %d\n",m_iCountMode); PUT_LOG(LOG_WARN,"m_iRunning %d\n",m_iRunning); PUT_LOG(LOG_WARN,"m_uiTimerID %d\n",m_uiTimerID); } </textarea>

</form>
<form>

CTimeEventDrawBox.h

<textarea readonly="readonly" cols="75" rows="8">#ifndef _CTIMEEVENTDRAWBOX_h_ #define _CTIMEEVENTDRAWBOX_h_ #include "CTimeEvent.h" class CTimeEventDrawBox : public CTimeEvent { public: CTimeEventDrawBox(); CTimeEventDrawBox( int ix1, int iy1 , int ix2 , int iy2 , int icolor , int ifillflag ); ~CTimeEventDrawBox(); //! timeSetEvnetでm_iCountMode=0だったらカウントアップ, /*!   \param ix1 DxLibのDrawBoxのパラメターと同じ x1   \param iy1 DxLibのDrawBoxのパラメターと同じ y1   \param ix2 DxLibのDrawBoxのパラメターと同じ x2   \param iy2 DxLibのDrawBoxのパラメターと同じ y2   \param icolor DxLibのDrawBoxのパラメターと同じ color   \param ifillflag DxLibのDrawBoxのパラメターと同じ fillflag   \return void */ void SetBoxParameter( int ix1, int iy1 , int ix2 , int iy2 , int icolor , int ifillflag ); //! m_x2の値をインターバルごとカウントダウン /*!   \return void */ void Count(); //! メンバ変数の値でテストようTestBoxを描画 /*!   \return void */ void DrawTestBox(); //! timeEvnetのスタート(コールバック関数はそれぞれ使用する場所で定義する) /*!   \return int  0:失敗  0以外:timeKillEvnetに使用するTimerID */ int StartTimeEvent( ); //! メンバ変数の初期化 (timeKillEvnetを実行した後は必ずこいつを呼ぶ) /*!   \return void */ void ResetValue(); protected: //! メンバ変数の表示(ouputDebugPrint) file保存する場合はフラグを変更 /*!   \return void */ void DisplayMemberValue(); private: //! DrawBoxのx1 int m_x1; //! DrawBoxのy1 int m_y1; //! DrawBoxのx1 int m_x2; //! DrawBoxのx2 int m_y2; //! DrawBoxのycolor int m_icolor; //! DrawBoxのfill int m_ifillflag; }; #endif //_CTIMEEVENTDRAWBOX_h_ </textarea>

</form>
<form>

CTimeEventDrawBox.cpp

<textarea readonly="readonly" cols="75" rows="8">#include "CTimeEventDrawBox.h" #include "common.h" void CALLBACK TimeCallBack2(unsigned int timerID, unsigned int msg, unsigned int usrParam, unsigned int dw1, unsigned int dw2) { if( ((CTimeEventDrawBox*)usrParam)->IsRunning() == 0 ) { //timeEventの終了 timeKillEvent( timerID ); //再利用のためメンバ変数を初期化(すべて0にする,親クラスのCTimeEventのメンバも) ((CTimeEventDrawBox*)usrParam)->ResetValue(); } } CTimeEventDrawBox::CTimeEventDrawBox() : m_x1(0) , m_y1(0) , m_x2(0) , m_y2(0) , m_icolor(0) , m_ifillflag(0) { DisplayMemberValue(); } CTimeEventDrawBox::CTimeEventDrawBox( int ix1, int iy1 , int ix2 , int iy2 , int icolor , int ifillflag ) : m_x1(ix1) , m_y1(iy1) , m_x2(ix2) , m_y2(iy2) , m_icolor(icolor) , m_ifillflag(ifillflag) { DisplayMemberValue(); } CTimeEventDrawBox::~CTimeEventDrawBox() { } void CTimeEventDrawBox::DisplayMemberValue() { CTimeEvent::DisplayMemberValue(); PUT_LOG(LOG_WARN,"m_x1 %d\n",m_x1); PUT_LOG(LOG_WARN,"m_y1 %d\n",m_y1); PUT_LOG(LOG_WARN,"m_x2 %d\n",m_x2); PUT_LOG(LOG_WARN,"m_y2 %d\n",m_y2); PUT_LOG(LOG_WARN,"icolor %d\n",m_icolor); PUT_LOG(LOG_WARN,"ifillflag %d\n",m_ifillflag); } void CTimeEventDrawBox::SetBoxParameter( int ix1, int iy1 , int ix2 , int iy2 , int icolor , int ifillflag ) { m_x1 = ix1; m_y1 = ix2; m_x2 = ix2; m_y2 = iy2; m_icolor = 128; m_ifillflag = 1; } void CTimeEventDrawBox::Count() { m_x2--; if( m_x2 == 0 ) { SetRunningFlag( 0 ); } } void CTimeEventDrawBox::DrawTestBox() { DrawBox( m_x1, m_y1, m_x2, m_y2, m_icolor, m_ifillflag ); } void CTimeEventDrawBox::ResetValue() { CTimeEvent::ResetValue(); m_x1 = 0; m_y1 = 0; m_x2 = 0; m_y2 = 0; m_icolor = 0; m_ifillflag = 0; } int CTimeEventDrawBox::StartTimeEvent() { //timeSetEventの準備ができているかチェックする if( m_iRunning == 1 ) { //このクラスでtimeEventを実行しているならなにもしない return NG; } if( m_iInterval == 0 ) { //timeSetEventのインターバルが設定されていなければ何もしない return NG; } //timeSetEvnetのTimeCallBack関数に自分のクラスを登録 m_uiTimerID = timeSetEvent( m_iInterval,1,(LPTIMECALLBACK)TimeCallBack2,(DWORD)this, TIME_PERIODIC ); if( m_uiTimerID == 0 ) { return NG; } //timesetEvent実行中フラグをセット SetRunningFlag( 1 ); return m_uiTimerID; return m_uiTimerID; } </textarea>

</form>
<form>

main.cpp


<textarea rows="8" cols="75" readonly="readonly">//省略 //CTimeEvent time; CTimeEventDrawBox time( 0 , 0 , 400 , 32 , 230 , 1 ); time.SetCounter( 60,0 ); time.SetTimeInterval(); time.StartTimeEvent(); switch( g_gamestatus ) { case GAME_STATUS_INIT: //初期化 time.Count(); time.DrawTestBox(); m_InputController->DrawTestBox(); break; case GAME_STATUS_TITLE: //title break; case GAME_STATUS_SHOOT: //game main break; case GAME_STATUS_MUSIC: //music room break; case GAME_STATUS_END: //end break; default: break; }         ScreenFlip();//裏画面反映 //timeEvnet用のためmainスレッドをsleepさせる Sleep( 10 );     }     DxLib_End();//DXライブラリ終了処理 </textarea>

</form>

コメントを投稿