※ 注意:以下のサンプルでは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などと読み替えてもらえたら、ほぼこの通り使用できると思います。
