ウインドウが表示されたのはいいけど、画像なしの黒い画面じゃ面白くないですよね。
とりあえずビットマップファイルを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は画面に表示する画像フォーマットと考えてください。画面に表示するには、
の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;
x座標とy座標、幅、高さを持つ構造体です。
typedef struct SDL_Rect { Sint16 x, y; Uint16 w, h; } SDL_Rect;
画像の配置などで使います。
画像の表示は読み込み、ディスプレイサーフェスへの複写、フリップの3ステップで行います。順に見ていきましょう。
SDL_Surface *SDL_LoadBMP(const char *file);
ビットマップファイルを読み込んで、SDL_Surfaceを作成します。fileはファイル名を指定。ファイルはビットマップファイルでなければなりません。PNGファイルなどを読み込む方法は後述します。
作成したSDL_Surfaceは他のSDL関数で使用します。
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も指定できます。画像を組み合わせて合成したりすることも可能です。
int SDL_Flip(SDL_Surface* screen);
SDL_BlitSurface()でディスプレイサーフェスに描画したものを画面に反映させます。screenにはSDL_GetVideoSurface()の返り値をセットすればいいでしょう。
なお、不要になったSDL_SurfaceはSDL_FreeSurface()で破棄します。
void SDL_FreeSurface(SDL_Surface* surface);
surfaceには破棄したいSDL_Surfaceを指定します。