※ 注意:以下のサンプルではSDL2を使用しています。
問い合わせがあった内容。前景画像と背景画像があって背景のみ動かしたい、という場合はどうすればいいのか?
背景→前景→フリップ、背景→前景→フリップの順に繰り返せばいいので、単純にはこのようになります。
#include <SDL2/SDL.h> #include <SDL2/SDL_image.h> /* 画像移動のサンプル */ int main(int argc, char* argv[]){ SDL_Window* window; /* ウインドウ */ SDL_Surface* screen; /* ウインドウスクリーン */ SDL_Surface* fore; /* 前景の画像 */ SDL_Surface* back; /* 背景の画像 */ /* 以下、画像の移動で使用する変数 */ SDL_Rect srcrect; /* 移動元矩形 */ SDL_Rect dstrect; /* 移動先矩形 */ int x; /* x座標 */ int y; /* y座標 */ int endx; /* 移動先x座標 */ int endy; /* 移動先y座標 */ /* 初期化 */ SDL_Init(SDL_INIT_EVERYTHING); /* ウインドウを作成する */ window = SDL_CreateWindow( "title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN); /* ウインドウスクリーンを取得する */ screen = SDL_GetWindowSurface(window); /* 画像を読み込む */ fore = IMG_Load("fore.png"); /* 小さい画像を想定 320x240など */ back = IMG_Load("back.png"); /* 画面より大きい画像を想定 1024x768など */ /* 初期ポジション */ /* (画面左上に前景、背景の画像を描画する) */ SDL_BlitSurface(back, NULL, screen, NULL); SDL_BlitSurface(fore, NULL, screen, NULL); SDL_UpdateWindowSurface(window); /* 描画した内容を画面に表示する */ /* ちょっと待機 */ SDL_Delay(1000); /* 前景画像を移動させる */ /* (移動先は画面の真ん中) */ endy = (screen->h - fore->h) / 2; endx = (screen->w - fore->w) / 2; for(y = 0, x = 0; y < endy && x < endx; y += (endy / 30), x+= (endx / 30)){ dstrect.x = x; dstrect.y = y; SDL_BlitSurface(back, NULL, screen, NULL); /* 背景も描画する */ SDL_BlitSurface(fore, NULL, screen, &dstrect); /* 前景の描画 */ SDL_UpdateWindowSurface(window); /* 描画した内容を画面に表示する */ SDL_Delay(20); } /* ちょっと待機 */ SDL_Delay(1000); /* 背景画像を移動させる */ endy = (back->h - screen->h); endx = (back->w - screen->w); for(y = 0, x = 0; y < endy && x < endx; y += (endy / 30), x+= (endx / 30)){ srcrect.x = x; srcrect.y = y; srcrect.w = back->w; srcrect.h = back->h; SDL_BlitSurface(back, &srcrect, screen, NULL); /* 背景の描画 */ SDL_BlitSurface(fore, NULL, screen, &dstrect); /* 前景も描画する */ SDL_UpdateWindowSurface(window); /* 描画した内容を画面に表示する */ SDL_Delay(20); } /* ちょっと待機 */ SDL_Delay(1000); /* 後処理 */ SDL_FreeSurface(back); SDL_FreeSurface(fore); SDL_Quit(); return 0; }
コンパイル方法:gcc [ファイル名] -lSDL2 -lSDL2_image
SDL1.2で書く場合は、SDL_CreateWindow → SDL_SetVideoMode、SDL_GetWindowSurface → SDL_GetVideoSurface、SDL_UpdateWindowSurface → SDL_Flipなどと読み替えてもらえたら、ほぼこの通り使用できると思います。