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


3 画像を表示させる

ウインドウが表示されたのはいいけど、画像なしの黒い画面じゃ面白くないですよね。

とりあえずビットマップファイルを1つ用意して、「sample.bmp」に改名してください。

あとはこのプログラムを実行させます。

#include <SDL/SDL.h>

int main(int argc, char* argv[]){
	SDL_Surface* image;
	SDL_Rect rect, scr_rect;

	SDL_Init(SDL_INIT_EVERYTHING);

	SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);

	/* 画像読み込み */
	image = SDL_LoadBMP("sample.bmp");

	/* 画像の矩形情報設定 */
	rect.x = 0;
	rect.y = 0;
	rect.w = image->w;
	rect.h = image->h;

	/* 画像配置位置情報の設定 */
	scr_rect.x = 0;
	scr_rect.y = 0;

	/* サーフェスの複写 */
	SDL_BlitSurface(image, &rect, SDL_GetVideoSurface(), &scr_rect);

	/* サーフェスフリップ */
	SDL_Flip(SDL_GetVideoSurface());

	SDL_Delay(3000);

	SDL_FreeSurface(image);

	SDL_Quit();

	return 0;
}

実際には、読み込めたかどうか確認する(= imageがNULLでないことを確認する)必要がありますが、割愛します。


SDL_Surface

SDL_Surfaceは画面に表示する画像フォーマットと考えてください。画面に表示するには、

  1. 画像からSDL_Surfaceを作成する。
  2. 画像から作成したサーフェスをビデオサーフェスに複写する。
  3. フリップする。

の3段階のステップを踏みます。SDL_Surfaceは構造体ですので、上のプログラムではその中から幅と高さの情報を見ています。構造体の中身はSDL_video.hから見ることができます。各項目の詳細はWikiなどで確認できます。

typedef struct SDL_Surface {
	Uint32 flags;				/* Read-only */
	SDL_PixelFormat *format;		/* Read-only */
	int w, h;				/* Read-only */
	Uint16 pitch;				/* Read-only */
	void *pixels;				/* Read-write */
	int offset;				/* Private */

	/* Hardware-specific surface info */
	struct private_hwdata *hwdata;

	/* clipping information */
	SDL_Rect clip_rect;			/* Read-only */
	Uint32 unused1;				/* for binary compatibility */

	/* Allow recursive locks */
	Uint32 locked;				/* Private */

	/* info for fast blit mapping to other surfaces */
	struct SDL_BlitMap *map;		/* Private */

	/* format version, bumped at every change to invalidate blit maps */
	unsigned int format_version;		/* Private */

	/* Reference count -- used when freeing surface */
	int refcount;				/* Read-mostly */
} SDL_Surface;

SDL_Rect

x座標とy座標、幅、高さを持つ構造体です。

typedef struct SDL_Rect {
        Sint16 x, y;
        Uint16 w, h;
} SDL_Rect;

画像の配置などで使います。


画像の表示は読み込み、ディスプレイサーフェスへの複写、フリップの3ステップで行います。順に見ていきましょう。


SDL_LoadBMP()

SDL_Surface *SDL_LoadBMP(const char *file);

ビットマップファイルを読み込んで、SDL_Surfaceを作成します。fileはファイル名を指定。ファイルはビットマップファイルでなければなりません。PNGファイルなどを読み込む方法は後述します。

作成したSDL_Surfaceは他のSDL関数で使用します。


SDL_BlitSurface()

int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);

SDL_Surfaceの複写をします。srcは複写元のサーフェス、dstは複写先のサーフェスで、dstにsrcを描くというイメージです。

srcrectは複写元のサーフェスサイズのSDL_Rect構造体で、srcのサイズと同じサイズにすれば、全体がdstに描かれます。一部を指定した場合、例えば、xとyを0にしてwとhを画像全体の縦、横のサイズの半分にすれば、画像の左上1/4が描かれることになります。右下1/4を描きたい場合は・・・。大丈夫ですね。

dstrectは複写先の位置、つまり、どこに描くかということを指定します。SDL_Rect構造体はx,y,w,hの4つのメンバーをもっているので、srcrectのwやhよりdstrectのwやhが大きい場合は、拡大表示される・・・と思いきや、SDL_BlitSurfaceに拡大縮小機能はないので、別の関数を使う必要があります。これには別のライブラリが必要になりますので、ここでは省略します。

上のプログラムでは、dstにSDL_GetVideoSurface()の結果、つまりビデオサーフェスを指定していますが、ビデオサーフェスではない、SDL_Surfaceも指定できます。画像を組み合わせて合成したりすることも可能です。


SDL_Flip()

int SDL_Flip(SDL_Surface* screen);

SDL_BlitSurface()でディスプレイサーフェスに描画したものを画面に反映させます。screenにはSDL_GetVideoSurface()の返り値をセットすればいいでしょう。


なお、不要になったSDL_SurfaceはSDL_FreeSurface()で破棄します。

void SDL_FreeSurface(SDL_Surface* surface);

surfaceには破棄したいSDL_Surfaceを指定します。


/

indexに戻る