/* vim: ts=4 sw=4 sts=4 fenc=utf-8 : * ============================================================================= * SDL sample for C * ============================================================================= */ #include <stdio.h> #include <string.h> #include <SDL.h> #include <SDL_ttf.h> /* エラーメッセージ出力. */ #define ERROR(x) printError(x, __FILE__, __LINE__) #define SDL_ERROR(x) printSDLError(x, __FILE__, __LINE__) /* プロトタイプ宣言 */ int init(void); void quit(void); SDL_Surface* setVideoMode(void); void mainLoop(void); /* プロトタイプ宣言 [フォント表示]. */ void showFont(SDL_Surface* screen, const char* msg); void getFontName(char* fontfile); /* プロトタイプ宣言 [エラー表示用]. */ void printError(const char* msg, const char* file, int line); void printSDLError(const char* msg, const char* file, int line); /** * MAIN. * * @param argc 起動引数の数 * @param argv[] 起動引数 * [1] メディアファイル(省略時は, sample/resource/park.mp3 を使用する) * [2] サンプリングレート * ※日本語ファイル名は対応していません... */ int main(int argc, char* argv[]) { int ret; SDL_Surface* screen; /* SDL初期化. */ ret = init(); if (ret < 0) { return -1; } /* SDL終了処理を終了時に自動実行するよう登録. */ atexit(quit); /* ビデオモード設定. */ screen = setVideoMode(); if (screen == NULL) { return -1; } /* フォント表示 */ showFont(screen, "Sample"); /* メインループ */ mainLoop(); return 0; } /** * SDL初期化. */ int init(void) { /* 初期化 */ int ret = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); if (ret < 0) { /* 初期化エラー */ SDL_ERROR("can't init sdl."); return -1; } /* * SDL_Init 後にまだ初期化していないサブシステムを * 初期化する場合は, 下記関数を使用する. * int SDL_InitSubSystem(Uint32 flags); */ return 0; } /** * SDL終了処理. */ void quit(void) { SDL_Quit(); } /** * ビデオ表示初期化. * @return SDL_Screen */ SDL_Surface* setVideoMode(void) { SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE); if (screen == NULL) { /* ビデオモード設定エラー */ SDL_ERROR("can't set video mode."); return NULL; } return screen; } /** * メディア再生. * * @param screen スクリーン * @param msg メッセージ */ void showFont(SDL_Surface* screen, const char* msg) { int ret; SDL_Surface* txtSurface; TTF_Font* font; SDL_Color color = { 0, 0, 255, 0 }; SDL_Rect dest; char fontfile[1024]; /* TTF 初期化 */ ret = TTF_Init(); if (ret != 0) { SDL_ERROR("can't init ttf"); return; } /* フォントファイルオープン */ getFontName(fontfile); font = TTF_OpenFont(fontfile, 12); if (!font) { SDL_ERROR("can't open font"); return; } /* 文字設定 */ txtSurface = TTF_RenderUTF8_Solid(font, msg, color); dest.x = 0; dest.y = 0; SDL_BlitSurface(txtSurface, NULL, screen, &dest); /* 画面更新 */ SDL_Flip(screen); } /** * イベントループ. * @param music メディア停止用 */ void mainLoop(void) { int quit = 0; SDL_Event event; /* unicode 変換を有効にする. */ SDL_EnableUNICODE(1); while (!quit) { while (SDL_PollEvent(&event)) { switch (event.type) { /* SDL_QUIT イベント (ウィンドウが閉じられた) */ case SDL_QUIT: quit = 1; break; default: break; } } } } /* ============================================================================= * 以下, エラーメッセージ表示や, ユーティリティなど. * 本質ではないので・・・あんま見なくて良いかと. * ============================================================================= */ /** * エラーメッセージ表示. * * @param msg メッセージ * @param file ファイル名 * @param line 行番号 */ void printError(const char* msg, const char* file, int line) { fprintf(stderr, "%s:%d %s\n", file, line, msg); } /** * SDLエラーメッセージを含む, エラーメッセージ表示. * * @param msg メッセージ * @param file ファイル名 * @param line 行番号 */ void printSDLError(const char* msg, const char* file, int line) { char* sdlerr = SDL_GetError(); fprintf(stderr, "%s:%d %s [%s]\n", file, line, msg, sdlerr); } /** * フォントファイル名取得. * @return フォントファイル名 */ void getFontName(char* fontfile) { char* path = getenv("SystemRoot"); sprintf(fontfile, "%s\\Fonts\\arial.ttf", path); }