おまけ - mimi_sdl
mimi_sdl(ミミSDL)とは
SDLにおけるイベント処理などを簡素化するための関数群です。
キー入力待ち関数を用意してありますので、SDL_PollEvent()をループで回すなどの処理を作成する手間が省けます。
画像描画、テキスト描画、音楽・効果音再生の関数も用意してあります。これらは、ファイルを直接指定して表示、再生することができ、SDL_Surfaceなどの構造体ポインタを意識する必要がありません。
もちろん、mimi_sdlで用意していない機能は、本家SDLの関数を使うことが可能です。
機能
- SDL初期化/終了処理
- 音楽再生/停止処理(ファイル名指定による。現在連続再生機能のみ)
- 音量設定
- 効果音再生
- スリープ処理(指定時間、処理を停止する。単位はミリ秒)
- イメージ表示処理(ファイル名指定による。拡大、縮小機能はなし)
- フォント設定処理
- テキスト描画処理(位置、色指定可能)
- イベントループ(現在、キー入力/マウスボタンのみ検知可能。ウインドウが閉じられようとしたときは強制的にプログラムを終了させる)
- ウインドウタイトル設定
- レイヤー機能
言語
- C
必要ライブラリ
バージョンはこれでなくてもいいかも。動作確認済みバージョンということで。
ライセンス
GNU LGPL v3 とします。
バージョン
現在の最新版はプロトタイプ5版です。(2011年10月2日)
リリースノート
プロトタイプ5版
リリース 2011年10月2日
- スクリーンサイズ変更機能搭載。
プロトタイプ4版
リリース 2011年9月25日
- レイヤー機能搭載。
プロトタイプ3版
リリース 2011年9月19日
- サーフェスフラグをSDL_SWSURFACEに変更。
- マウスボタン待ちイベントを追加。
プロトタイプ2版
リリース 2011年9月19日
- 効果音再生のために必要なチャンネル数取得/設定関数を追加。
- 効果音停止関数を追加。
- サウンドデフォルトチャンネル数を8に設定。
初回試作版
リリース 2011年9月18日
ダウンロード
ソースコードにて配布となります。(外部ストレージサービスを利用しています。)
プロトタイプ5版 (最新) 2011年10月2日
--- 過去のもの ---
プロトタイプ4版 (最新) 2011年9月25日
プロトタイプ3版 2011年9月19日
プロトタイプ2版 2011年9月19日
初回試作版 2011年9月18日
makefileはありませんので、下のコンパイル例を参考にコンパイルしてください。
コンパイル例
共有ライブラリとしてのコンパイル例
$ gcc -fPIC -c mimi_sdl.c $ gcc -shared -o libmimi_sdl.so mimi_sdl.o
これで、libmimi_sdl.soが出来上がりますので、パスの通っているディレクトリにコピーしてください。(/usr/libなど)
別のところにパスを通す場合は次のようにします。
$ LD_LIBRARY_PATH=[パス] $ export LD_LIBRARY_PATH
libmimi_sdl.soにリンクを通してコンパイルするには、次のようにします。
$ gcc program.c -lmimi_sdl -lSDL -lSDL_image -lSDL_ttf -lSDL_mixer
スタティックライブラリとしてのコンパイル例
$ gcc --c mimi_sdl.c $ ar rcs libmimi_sdl.a mimi_sdl.o
libmimi_sdl.aが作成されます。
libmimi_sdl.aにリンクを通してコンパイルするには、次のようにします。
$ gcc program.c -L./ -lmimi_sdl -lSDL -lSDL_image -lSDL_ttf -lSDL_mixer
マニュアル
開発ガイドはこちら → mimi_sdl開発ガイド
使い方
- 「コンパイル例」を参考にライブラリをコンパイルします。(試しにやってみるだけなら、スタティックライブラリの方が楽です。)
- mimi_sdl.hをincludeしてプログラムを作ります。
- コンパイル時にライブラリへのリンクを通します。
サンプル
mimi_sdlを使用したサンプル。
数字当てゲーム(無理ゲー)です。
フォントファイルは各自用意してください。サンプルでは梅フォントを使用しています。
#include "mimi_sdl.h"
#include <time.h>
int gamemain(void* pointer);
void opening();
int game();
int sdlk2int(SDLKey key);
#define CENTER_POS_X 200
#define CENTER_POS_Y 200
/************************************************
* NAME: main
* DESC: アプリケーションメイン
* ARGS: argc --- 引数の数
* argv --- 引数
* RETN: 0
************************************************/
int main(int argc, char* argv[]){
/* SDL起動 */
mimi_sdl_init_all();
/* タイトルの設定 */
mimi_sdl_set_title("タイトル");
/* メイン処理を開始する */
/* (イベントループが開始されます) */
mimi_sdl_main(gamemain, NULL);
/* SDL終了 */
mimi_sdl_quit_all();
return 0;
}
/************************************************
* NAME: gamemain
* DESC: ゲームメイン関数
* ARGS: pointer --- ダミー
* RETN: 0
************************************************/
int gamemain(void* pointer){
/* オープニング(ゲームの説明) */
opening();
/* ゲーム */
game();
/* メイン処理を終了する(メイン処理終了時に必ず呼ぶこと) */
mimi_sdl_stop_events();
return 0;
}
/************************************************
* NAME: opening
* DESC: オープニング処理(ゲーム説明)
************************************************/
void opening(){
/* フォントの設定 */
/* 注)フォルダ、フォントファイル名は任意に変更してください。 */
mimi_sdl_open_default_font("resources/ume-tgs5.ttf", 36);
/* テキストの色設定 */
mimi_sdl_set_textcolor(0xFF, 0xFF, 0xFF);
/* テキスト描画開始位置の設定 */
mimi_sdl_locate(10,10);
/* テキスト描画 */
mimi_sdl_println("数字ゲーム");
/* 1行改行 */
mimi_sdl_line_feed(1);
/* テキスト描画 */
mimi_sdl_println("表示された数字を、表示された順に入力");
/* 色指定でテキスト描画 */
mimi_sdl_println_with_rgb(0xFF, 0xFF, 0x00, "何かキーを押すと始まります。");
/* キー入力待ち */
mimi_sdl_wait_key();
/* フォントを一旦閉じる */
mimi_sdl_close_default_font();
}
/************************************************
* NAME: game
* DESC: 数当てゲーム
************************************************/
void game(){
char c[103];
int wrong = 0;
int lv = 1;
char buf = 0;
int loop = 0;
int loop_end = 0;
SDLKey key = 0;
/* フォントの設定 */
/* 注)フォルダ、フォントファイル名は任意に変更してください。 */
mimi_sdl_open_default_font("resources/ume-tgs5.ttf", 48);
/* 乱数の種作成 */
srand(time(NULL));
/* レベルは1(3文字)から100(102文字)までです */
for(;lv < 100; lv++){
/* 画面を黒でクリア */
mimi_sdl_cls(0,0,0);
loop_end = lv + 2;
/* 乱数設定 */
for(loop = 0; loop < loop_end; loop++){
c[loop] = rand() % 9 + 1;
}
/* 答え表示 */
for(loop = 0; loop < loop_end; loop++){
/* 1秒表示 クリアし0.3秒待機 次の数字へ */
mimi_sdl_locate(CENTER_POS_X, CENTER_POS_Y);
mimi_sdl_print("%d", c[loop]);
mimi_sdl_sleep(1000);
mimi_sdl_cls(0,0,0);
mimi_sdl_sleep(300);
}
mimi_sdl_locate(10,10);
mimi_sdl_print("数字入力");
for(loop = 0; loop < loop_end; loop++){
/* 入力待ち */
key = mimi_sdl_wait_key();
/* 入力されたキーを数字に変換 */
buf = sdlk2int(key);
if(buf == c[loop]){
/* 正しく入力できた場合は何もしない(次の入力へ) */
}
else {
/* 間違えた場合は Game Over と表示 */
mimi_sdl_locate(200,400);
mimi_sdl_print("Game Over");
wrong++;
break;
}
}
if(wrong > 0){ /* リトライとか作ろうとしたけど… */
/* 間違えた場合は処理を抜ける */
break;
}
}
if(wrong == 0){
/* ゲーム終了時に間違えがなかった場合は Game Clear と表示 */
mimi_sdl_locate(200,400);
mimi_sdl_print("Game Clear");
}
/* 入力待ち */
mimi_sdl_wait_key();
/* フォントを破棄する */
mimi_sdl_close_default_font();
}
/************************************************
* NAME: sdlk2int
* DESC: キーを数字に変換
* ARGS: key --- キー
* RETN: 変換後の数字
************************************************/
int sdlk2int(SDLKey key){
int ret = 0;
switch(key){
case SDLK_1:
ret = 1;
break;
case SDLK_2:
ret = 2;
break;
case SDLK_3:
ret = 3;
break;
case SDLK_4:
ret = 4;
break;
case SDLK_5:
ret = 5;
break;
case SDLK_6:
ret = 6;
break;
case SDLK_7:
ret = 7;
break;
case SDLK_8:
ret = 8;
break;
case SDLK_9:
ret = 9;
break;
default:
break;
}
return ret;
}
このように、イベントがらみやポインタの難しい処理は全部バックで処理しているので、比較的容易にゲームが作れます。