Home > 技術 > 猫ウィンドウクラスを作る(3)

猫ウィンドウクラスを作る(3)

●アニメーションの登録と選択

CCatWndでは,猫表示のために

  1. 猫アニメーションパターンをいくつか登録する
  2. 現在表示すべきアニメーションパターンを選択する

という手順を踏みます.アニメーション登録の方法は

  • アニメーションフレーム画像を並べた画像(BMP)
  • アニメーションフレーム画像のサイズ
  • アニメーションフレーム数
  • 各アニメーションフレーム毎の情報(どの絵を表示するか,次のフレームまでの時間)
  • アニメーションID値(選択するときの指定に使う)

といったデータを用意して,登録用関数に渡すことにしました.
仕様として,BMPは「同一サイズのアニメーションフレーム画像を隙間なく羅列したもの」を用意することにします.
また,背景部分は白であることとします.
例えば,次の様な画像です.

CatStartB黒猫の着地アニメーション用BMP.フレーム画像サイズ48*54の画像を4枚羅列.

この画像例では,フレーム画像を縦にならべていますが,横にならべても,複数行*複数列に並べてもいいように,各フレームでどの場所のフレーム画像を表示するか,という情報については(x,y)のインデクスで指定する形にしました.

//アニメーションパターン設定用データ
//登録用メソッドには構造体を作って渡す形にした
  //各フレームのデータ
 struct SAnimFrameData
 {
  unsigned int m_XIndex; //X方向パタンインデクス
  unsigned int m_YIndex; //Y方向パタンインデクス
  unsigned int m_AnimTime_ms; //表示時間[ms]

  SAnimFrameData( unsigned int XIndex=0, unsigned int YIndex=0, unsigned int AnimTime=1 ) : m_XIndex(XIndex), m_YIndex(YIndex), m_AnimTime_ms(AnimTime) {}
 };

  //アニメーションデータ
 struct SAnimData
 {
  unsigned int m_UnitWidth;//フレーム画像サイズ
  unsigned int m_UnitHeight;
  std::vector< SAnimFrameData > m_Frames;
  unsigned int m_AnimID; //アニメーションを表す固有の値

  SAnimData() : m_UnitWidth(0), m_UnitHeight(0), m_AnimID(0) {}
 };

//アニメーションの登録関数
//ファイル名指定タイプと,リソースID指定タイプを用意.
bool RegisterAnimation_BMPFILE( const char *ImageName, const SAnimData &rAnimData );
bool RegisterAnimation_RESOURCE( UINT BMP_ID, const SAnimData &rAnimData );

//アニメーションの選択
bool SetCurAnimFrame( unsigned int AnimID, unsigned int FrameIndex );
void GetCurAnimFrame( unsigned int *pAnimID, unsigned int *pFrameIndex ) const;

登録関数内では,指定された画像の読込みに成功したら,アニメーション表示に必要となる情報を,アニメーションIDをキーとしたmapに蓄えています.

std::map< unsigned int, 必要なデータをまとめた型 * > m_AnimMap;//キーはアニメーションID値

アニメーション選択関数では,指定されたIDがm_AnimMapに登録されていれば,そのアニメーションを,指定されたフレームから開始するように設定を行います.
また,ウィンドウのサイズをアニメーションのフレーム画像サイズに合わせます.
このとき,フレーム画像のサイズが前に選択されていたアニメーションと違うと猫の位置がずれてしまったりするのですが,このことへの対処は選択する側に任せることにしています.
(面倒なら,全アニメーションのフレームサイズを統一すればいいか,とか.)

 

 


 

●アニメーションの表示

 

これは単純にタイマで時間毎にフレームを切り替えて表示するだけです.

登録情報に次のフレームまでの時間があるので,アニメーション選択が行われた時点で::SetTimer()でタイマをその時間に合わせ,あとはタイマイベント毎にフレームを次に進めてタイマ時間をセットして::InvalidateRect()で再描画要求を出します.

WM_PAINTに対する描画処理部分で現在のフレーム画像を描画します.

 

 


 

●猫じゃないとダメですよ

 

何やら隣近所から
「これなら絵が猫じゃなくても何ら問題がない→クラス名はCAnimWndとかにすべき」
とかいうまるで理解できない声が聞こえてきたりしています.何なのでしょうか?

CCatWndは「猫ウィンドウ」クラスなのであり,猫でないものを表示するのは「クラス設計者の意図していない間違った使い方」であるので,アニメーション登録関数の注釈にはきちんと

 //アニメーションの登録
 //※ちゃんと「猫」の画像を指定すること.猫でない画像を指定した場合の動作は不定です

と明記して対策しておきます.
(不定なのだから,偶然正しく動作する,ということもあり得る)

猫ウィンドウクラスを作る(4)

Home > 技術 > 猫ウィンドウクラスを作る(3)

Search
Feeds
Authorized
奨学金支援制度
Meta

Return to page top