とりあえず画像の表示
画像表示はゲームの要です。まずはそこから。
画像ファイル"Fighter.bmp"はここにアップしました。
これを
(実行ファイルが生成されるディレクトリ)/Resources/Images/
の中に置いてください。(ディレクトリは作成してください。)
実行ファイルと同じフォルダの中に追加していってしまうとごちゃごちゃになるので、別にディレクトリを作ってそこへ保存することをおすすめします。
次に以下に示すようにmain.cppを編集してみてください。
/* Simple program: Create a blank window, wait for keypress, quit. Please see the SDL documentation for details on using the SDL API: /Developer/Documentation/SDL/docs.html */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "SDL.h" int main(int argc, char *argv[]) { Uint32 initflags = SDL_INIT_VIDEO; /* See documentation for details */ SDL_Surface *screen; Uint8 video_bpp = 0; Uint32 videoflags = SDL_SWSURFACE; int done; SDL_Event event; /* Initialize the SDL library */ if ( SDL_Init(initflags) < 0 ) { fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); exit(1); } /* Set 640x480 video mode */ screen=SDL_SetVideoMode(640,480, video_bpp, videoflags); if (screen == NULL) { fprintf(stderr, "Couldn't set 640x480x%d video mode: %s\n", video_bpp, SDL_GetError()); SDL_Quit(); exit(2); } // // ここから追加 // // 標準エラー出力をテキストファイルに設定。 // こうしておくとコマンドラインから起動しなくても出力内容を見れる。 freopen("stderr.txt", "w", stderr); // 画像ファイルを読み込み。 SDL_Surface* image = SDL_LoadBMP("Resources/Images/Fighter.bmp"); if(image == NULL) { // SDL_GetError()は最新のSDL内エラーの情報を文字列で返す。 fprintf(stderr, "画像の読み込みに失敗しました。:%s\n", SDL_GetError()); return 1; } // 画像ファイルを画面へ転送。 // 任意の位置に表示する方法は後述。 SDL_BlitSurface(image, NULL, screen, NULL); // 画面を更新。画像ファイルを転送した部分だけ。 SDL_UpdateRect(screen, 0, 0, image->w, image->h); // 確保したBMPサーフェスを解放。 SDL_FreeSurface(image); // 標準エラー出力のフラッシュ。 // これをやらないと出力内容がファイルに書き込まれないことがある。 fflush(stderr); // // ここまで追加 // done = 0; while ( !done ) { /* Check for events */ while ( SDL_PollEvent(&event) ) { switch (event.type) { case SDL_MOUSEMOTION: break; case SDL_MOUSEBUTTONDOWN: break; case SDL_KEYDOWN: /* Any keypress quits the app... */ case SDL_QUIT: done = 1; break; default: break; } } } /* Clean up the SDL library */ SDL_Quit(); return(0); }
「ここから追加」と「ここまで追加」の部分を追加しただけです。
実行してみましょう。左上に絵は表示されましたか?
これのどこが戦闘機なのかという問はゲームがまともに動くようになるまで隅に置いておいてください。
SDLの関数についても詳しくは説明しません。
必要ならばドキュメントなどを参照。
ところで、自機の紫色(#ff00ff)の背景が気持ち悪いですね。
紫色の部分を透過させましょう。
SDL_SetColorKey(image, SDL_SRCCOLORKEY | SDL_RLEACCEL, 0x00ff00ff);
を SDL_LoadBMP の後に挿入してください。
カラーキーに指定した色は透過されます。
次に左上以外の位置に表示してみましょう。
// // ここから追加 // // 標準エラー出力をテキストファイルに設定。 // こうしておくとコマンドラインから起動しなくても出力内容を見れる。 freopen("stderr.txt", "w", stderr); // 画像ファイルを読み込み。 SDL_Surface* image = SDL_LoadBMP("Resources/Images/Fighter.bmp"); if(image == NULL) { // SDL_GetError()は最新のSDL内エラーの情報を文字列で返す。 fprintf(stderr, "画像の読み込みに失敗しました。:%s\n", SDL_GetError()); return 1; } // カラーキーに設定された色は透過される。 SDL_SetColorKey(image, SDL_SRCCOLORKEY | SDL_RLEACCEL, 0x00ff00ff); // 画像ファイルを(100, 100)へ転送。 SDL_Rect destination; destination.x = 100; // destinationの destination.y = 100; // 値は destination.w = 0; // xとyしか destination.h = 0; // 使用されない。 SDL_BlitSurface(image, NULL, screen, &destination); // 画面を更新。めんどくさいので画面全体。 SDL_UpdateRect(screen, 0, 0, screen->w, screen->h); // 確保したBMPサーフェスを解放。 SDL_FreeSurface(image); // 標準エラー出力のフラッシュ。 // これをやらないと出力内容がファイルに書き込まれないことがある。 fflush(stderr); // // ここまで追加 //
なんかゲーム作れそうな気がしてきませんか?