おまけ - mimi_sdl

mimi_sdl(ミミSDL)とは

SDLにおけるイベント処理などを簡素化するための関数群です。

キー入力待ち関数を用意してありますので、SDL_PollEvent()をループで回すなどの処理を作成する手間が省けます。

画像描画、テキスト描画、音楽・効果音再生の関数も用意してあります。これらは、ファイルを直接指定して表示、再生することができ、SDL_Surfaceなどの構造体ポインタを意識する必要がありません。

もちろん、mimi_sdlで用意していない機能は、本家SDLの関数を使うことが可能です。

機能

言語

必要ライブラリ

バージョンはこれでなくてもいいかも。動作確認済みバージョンということで。

ライセンス

GNU LGPL v3 とします。

バージョン

現在の最新版はプロトタイプ5版です。(2011年10月2日)

リリースノート

プロトタイプ5版

リリース 2011年10月2日

プロトタイプ4版

リリース 2011年9月25日

プロトタイプ3版

リリース 2011年9月19日

プロトタイプ2版

リリース 2011年9月19日

初回試作版

リリース 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開発ガイド

使い方

  1. 「コンパイル例」を参考にライブラリをコンパイルします。(試しにやってみるだけなら、スタティックライブラリの方が楽です。)
  2. mimi_sdl.hをincludeしてプログラムを作ります。
  3. コンパイル時にライブラリへのリンクを通します。

サンプル

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;
}

このように、イベントがらみやポインタの難しい処理は全部バックで処理しているので、比較的容易にゲームが作れます。