トップページに戻る / GCCページに戻る / SDL目次


20 背景画像の移動

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

サンプルデータ一式

スクリーンショット


/

indexに戻る