第一章「SDLの基本的な使い方」第十二話


アニメーションを作る前に、一つ紹介を。

SDL_FreeSurface()

これは、SDL_Surfaceで作り出した構造体の中身を消去するものです。
小規模なプログラムではそこまで意味はありませんが、
大規模になったとき、これがあるかないかで、メモリの消費量もかわってきます。

SDL_FreeSurface(screen);

このように、引数には、消したいSDL_Suraface型を入れます。


それでは、アニメーションを作ってみましょう。

アニメーションの原理は、パラパラアニメと一緒だというのはご存知ですね?
今回は、そのパラパラアニメの、2コマだけを使って、アニメを作ります。


必要なものは、画像二枚と、それぞれを設定するSDL_Suraface型。
そして、二枚の画像を交互に切り替えるための処理です。
以下のソースでは、

Anime();

という関数を作って、そこでiをカウンタとして、切り替えています。

実際にソースを眺めながら、プログラムが、どういう順序で流れているかたどってみましょう。

#include <stdio.h> #include "SDL/SDL.h" #include "SDL/SDL_image.h" #pragma comment(lib, "SDL.lib") #pragma comment(lib, "SDLmain.lib") #pragma comment(lib, "SDL_image.lib") bool Init(void); //初期処理 bool Event(void); //イベント処理 void End(void); //終了処理 void Anime(void); //アニメ処理用 SDL_Surface *screen; SDL_Surface *img1; SDL_Surface *img2; //画像は二枚使う。 int main(int argc, char* argv[]) { if(!Init()) //初期化&確認 { printf("初期化に失敗しました"); return 0; } img1 = IMG_Load("sample1.png"); img2 = IMG_Load("sample2.png"); while(1) //メインループ { Anime(); //アニメ処理へ SDL_Flip(screen); if(!Event()) break; //イベント確認 SDL_Delay(100); //休憩。(アニメの動作が遅ければ、ここの数字を減らす) } SDL_FreeSurface(screen); //SDL_Surface型変数の中身を消去する。 SDL_FreeSurface(img1); SDL_FreeSurface(img2); End(); //終了処理へ return 0; } void Anime() { SDL_Rect rect; rect.x=0;rect.y=0; rect.w=640;rect.h=480; static int i = 0; //カウンタを作り、この数字によって使う画像を決める。 i++; if(i == 10) i = 0; //iが10なら、カウンタを0に戻す。 if(i < 5) { SDL_BlitSurface(img1,NULL,screen,&rect); //iが5未満ならimg1をscreenに転送 }else if(i < 10) { SDL_BlitSurface(img2,NULL,screen,&rect); //iが10未満ならimg2をscreenに転送 } } ・・・以下省略・・・



最初のメインのループで、Anime()へ処理が移り、iのカウンタが始まる。一回目はi++を読むのでi=1
i=1なので、ifの分岐で、img1の処理が行われます。

そして、処理がメインにもどり、画面の更新→イベント確認→休憩→となり、二回目のAnimeへ・・・

そして、そのループが五回目になったとき、iは5となるので、ifの分岐が(i < 10)の処理に移って、
使われる画像がimg2に切り替わります。

そうして、iが10になったとき、iは0にリセットされ、
画像はimg1へと戻るのです。


どうでしょうか、流れは見えましたか?
動きが遅いと感じたならば、SDL_Delay(100);の引数を減らせば、処理が早くなります。
全体の速度は、ここの数字を変えるだけで済むように調整するようにしましょう。

アニメーションができたところで、画像関係はとりあえず終わります。
次回からは、入力関係に移りたいと思います。


〜〜第十三話へ〜〜