ウインドウが表示されたのはいいけど、画像なしの黒い画面じゃ面白くないですよね。
とりあえずビットマップファイルを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を指定します。