※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

これは何?

D言語で簡単にゲームが作れるようにライブラリを作ってみました。
ただし、プリミティブな機能しかありません。が。
D言語のお試しとして、使ってみるのもいいかもしれません。



目次



ダウンロード

http://www5f.biglobe.ne.jp/~kenmo/dest/d/dhell.zipからライブラリ一式をダウンロードします。

関連陸


変更履歴

  • 2007.10.8 - 中心座標を指定して描画、描画オフセット座標の指定、キー入力のユーティリティ、SEのワンショット再生、数学関連などの機能を追加
  • 2007.10.7 - フォント読み込み処理を追加(※コンパイルスイッチに「-version=use_ttf」を指定する必要があります)
  • 2007.8.5 - 垂直の線分描画がおかしかったのを修正(指摘ありがとうございます>meiteiさん)。SDL_Delay(1)にしてCPU使用率を減らしてみた。
  • 2007.7.18 - 点/線分描画、三角関数、乱数取得処理を追加
  • 2007.6.25 - DMD 2.000に対応。(※コンソール消すおまじないコードを消しただけ(´∀`;
  • 2007.1.23 - DMD 1.00に対応。makefileを添付。
  • 2007.12.1 - おめがさんのFPS安定処理を取り込む
  • 2007.11.1 - とりあえず公開してみる

機能

今のところこんな感じです。
  • 画像読込・描画(BMPのみ)
  • BGM読込・再生(OGGのみ)
  • 効果音読込・再生(WAV/OGG)
  • キーイベント(マウス・キーボード・ジョイスティック)のハンドリング
  • フォントの描画(標準はasciiのみ。Hell_openFontでフォントファイルを指定)

まー、最低限の機能しかありませねー。

ビルド方法

build.batをテキストファイルで開いて、
D言語コンパイラ・リンカのパスを設定します。
(パスを通してあるのであれば、必要ありません)

で、build.batを実行します。

フォントの補足

フォントを読み込む場合、コンパイルスイッチに「-version=use_ttf」を指定する必要があります。
フォントを読み込まない場合(ascii文字のみで充分な場合)、「SDL_ttf.lib」と「SDL_ttf.dll」は不要となります。

使い方

「test.d」を編集していきます。
なんか色々ありますが、最低限必要なコードはこれだけです。

import hell;

void main()
{
	try
	{
		// Hellシステム初期化(キャプション"Hell" 640x480)
		Hell_init("Hell", 640, 480);
		// ゲームループ開始
		while(true)
		{
			// 画面更新
			Hell_update();
			// 33ms待つ
			Hell_wait(33);
		}
	}
	catch(Exception e)
	{
		// 例外をログに書き込み
		Hell_write(e);
	}
	finally
	{
		// Hellシステム終了
		Hell_quit();
	}
}

注意が必要なのは、「try~catch~finally」です。
ウィンドウが閉じられたときには、Hell_wait()が例外を返します。
その場合、catchして、ログの出力をし、Hell_quit()で終了します。

画像ファイルが存在しなかった場合など、「run.log」にエラーが書き込まれるので、
それを参照します。

特殊なキーの動作

  • F5キー:ボスが来た! ⇒ウィンドウ最小化
  • F9キー:ウィンドウモード・フルスクリーン切替
  • F10キー:マウスカーソル表示切替
  • F12キー:スクリーンショットをscreenshot.bmpで保存
  • ESCキー:アプリケーションを終了します。

サンプルゲーム

  • 散歩ゲー2---あの散歩ゲー2がパワーアップして帰ってきた!!

「dHell」リファレンス


Hell_init(char[] caption, int width, int height, bool fullscreen=false)

dHellを初期化します。
  • パラメータ
    • caption ウィンドウタイトル文字列
    • width 画面縦サイズ
    • height 画面横サイズ
    • fullscreen フルスクリーンフラグ

Hell_quit()

dHellの終了処理を行います。

Hell_write(...)

ログファイル「run.log」に書式文字を書き込みます。

Hell_write(Exception e)

ログファイル「run.log」に例外情報の書き込みを行います。

Hell_update()

画面を更新します。
この関数を呼ばないと描画内容は更新されません。

Hell_wait(int ms)

プログラムの実行を停止します。このタイミングでキー入力が更新されます
  • パラメータ
    • 停止時間(1/1000秒)

Hell_setCaption(...)

キャプション設定(※日本語不可)
  • パラメータ
    • 書式文字列

Hell_setOffset(int x, int y)

描画オフセットを設定します。
  • パラメータ
    • x オフセット座標(X)
    • y オフセット座標(Y)

Hell_drawPoint(int x, int y, int r=0x00, int g=0x00, int b=0x00)

点の描画
  • パラメータ
    • x,y 座標
    • r,g,b 色

Hell_drawLine(int x1, int y1, int x2, int y2, int r=0x00, int g=0x00, int b=0x00)

線分描画
  • パラメータ
    • x1,y1 開始座標
    • x2,y2 終了座標
    • r,g,b 色

Hell_fillRect(int x=0, int y=0, int w=0, int h=0, int r=0x00, int g=0x00, int b=0x00)

矩形を描画します。
  • パラメータ
    • x,y 左上座標
    • w,h 幅・高さ
    • r,g,b 描画色

Hell_fillRectEx(int cx=0, int cy=0, int w=0, int h=0, int r=0x00, int g=0x00, int b=0x00)

中心座標を指定して矩形を描画します。
  • パラメータ
    • cx,cy 中心座標
    • w,h 中心からの幅・中心からの高さ
    • r,g,b 描画色

Hell_loadBMP(char[] key, char[] filepath, int r=-2, int g=0, int b=0)

BMPを読みこみます。
  • パラメータ
    • key 画像のキー(Hell_drawで使います)
    • filepath 画像ファイルのパス
    • r,g,b カラーキー(r=-2のとき抜き色なし。r=-1のとき左上(0, 0)を抜き色にする

Hell_draw(char[] key, int px, int py, int ox=0, int oy=0, int ow=0, int oh=0)

BMPを描画します。
ox,oy,ow,ohを省略すると、BMP全体を描画します。
  • パラメータ
    • key 画像のキー(Hell_loadBMPで指定したkey)
    • px,py 左上座標
    • ox,oy 切り取り開始座標(左上)※省略可
    • ow,oh 切り取りする幅・高さ※省略可

Hell_drawEx(char[] key, int cx, int cy, int ox=0, int oy=0, int ow=0, int oh=0)

中心座標を指定してBMPを描画します
  • パラメータ
    • key 画像のキー(Hell_loadBMPで指定したkey)
    • cx,cy 中心座標
    • ox,oy 切り取り開始座標(左上)※省略可
    • ow,oh 切り取りする幅・高さ※省略可

Hell_setAlpha(char[] key, int alpha)

画像にアルファ値を設定します
  • パラメータ
    • key 画像のキー(Hell_loadBMPで指定したkey)
    • alpha アルファ値

Hell_getMouseX

マウスのX座標を取得します。
  • 戻り値 --- マウス座標X

Hell_getMouseY

マウスのY座標を取得します。
  • 戻り値 --- マウス座標Y

Hell_isPressMouse

マウスを押し続けているかどうかを判定するフラグを取得します。
  • 戻り値 --- マウスを押し続けているかどうかのフラグ
●使い方
if(Hell_isPressMouse() & HELL_BUTTON_LEFT)
{
	printf("press left");
}
if(Hell_isPressMouse() & HELL_BUTTON_MIDDLE)
{
	printf("press middle");
}
if(Hell_isPressMouse() & HELL_BUTTON_RIGHT)
{
	printf("press right");
}

Hell_isPushMouse

マウスをそのフレームに押したかどうかを判定するフラグを取得します。
  • 戻り値 --- マウスをそのフレームに押したかどうかのフラグ
●使い方
if(Hell_isPushMouse() & HELL_BUTTON_LEFT)
{
	printf("push left");
}
if(Hell_isPushMouse() & HELL_BUTTON_MIDDLE)
{
	printf("push middle");
}
if(Hell_isPushMouse() & HELL_BUTTON_RIGHT)
{
	printf("push right");
}

Hell_isPressKey

キーを押し続けているかどうかを判定するフラグを取得します。
  • 戻り値 --- キーを押し続けているかどうかのフラグ
●使い方
if(Hell_isPressMouse(HELL_DOWN))
{
	printf("press down");
}
if(Hell_isPressMouse(HELL_RIGHT))
{
	printf("press right");
}
if(Hell_isPressMouse(HELL_LEFT))
{
	printf("press left");
}

Hell_isPushKey

キーをそのフレームに押したかどうかを判定するフラグを取得します。
  • 戻り値 --- キーをそのフレームに押したかどうかのフラグ
●使い方
if(Hell_isPushKey(HELL_RETURN))
{
	printf("push return");
}
if(Hell_isPushKey(SDLK_z))
{
	printf("push z");
}
if(Hell_isPushKey(HELL_UP))
{
	printf("push up");
}

Hell_loadWAV(char[] key, char[] path)

SE(WAVファイル)を読み込みます
  • パラメータ
    • key キー(Hell_playWAVで使います)
    • path サウンドファイルのパス

Hell_playWAV(char[] key, int loops=0, int channel=-1)

SE(WAVファイル)を再生します
  • パラメータ
    • key キー
    • loops ループ回数。0で1回再生。(-1で無限ループ)
    • channel チャンネル(0~7番までを使うことができます。-1で自動割当)

Hell_playWAVEx(char[] key, int channel)

SEをワンショットで鳴らします。
特定のチャンネルを割り当てることで、重複して再生されないようにします。
  • パラメータ
    • key キー
    • channel 使用するチャンネル

Hell_stopWAV(int channel=-1)

SE(WAVファイル)を停止します。
  • パラメータ
    • channel 停止するチャンネル番号(-1で全て停止)

Hell_isPressJKey(int id)

ジョイスティックの十字キーを押しているかどうかを調べます。
  • 戻り値---ジョイスティックの十字キーを押しているかどうか
●使い方
if(Hell_isPressJKey(HELL_J_UP))
{
	printf("press up");
}
if(Hell_isPressJKey(HELL_J_DOWN))
{
	printf("press down");
}
if(Hell_isPressJKey(HELL_J_LEFT))
{
	printf("press left");
}
if(Hell_isPressJKey(HELL_J_RIGHT))
{
	printf("press right");
}

Hell_isPushJKey(int id)

ジョイスティックの十字キーを押したかどうかを調べます。
  • 戻り値---ジョイスティックの十字キーを押したかどうか
●使い方
if(Hell_isPushJKey(HELL_J_UP))
{
	printf("push up");
}
if(Hell_isPushJKey(HELL_J_DOWN))
{
	printf("push down");
}
if(Hell_isPushJKey(HELL_J_LEFT))
{
	printf("push left");
}
if(Hell_isPushJKey(HELL_J_RIGHT))
{
	printf("push right");
}

Hell_isPressJButton(int id)

ジョイスティックのボタンを押しているかどうかを調べます。
  • 戻り値---ジョイスティックのボタンを押しているかどうか
●使い方
if(Hell_isPressJButton(0))
{
	printf("press 1button");
}
if(Hell_isPressJButton(1))
{
	printf("press 2button");
}
if(Hell_isPressJButton(2))
{
	printf("press 3button");
}
if(Hell_isPressJButton(3))
{
	printf("press 4button");
}

Hell_isPushJKey(int id)

ジョイスティックのボタンを押したかどうかを調べます。
  • 戻り値---ジョイスティックのボタンを押したかどうか
●使い方
if(Hell_isPushJButton(0))
{
	printf("push 1button");
}
if(Hell_isPushJButton(1))
{
	printf("push 2button");
}
if(Hell_isPushJButton(2))
{
	printf("push 3button");
}
if(Hell_isPushJButton(3))
{
	printf("push 4button");
}

入力ユーティリティ

Hell_isPressEnter / Hell_isPushEnter

  • キーボードの「Z」「Return」「Space」
  • ジョイスティックの「0」ボタン
  • マウスの左ボタン

Hell_isPressCancel / Hell_isPushCancel

  • キーボードの「X」
  • ジョイスティックの「1」ボタン
  • マウスの右ボタン
のいずれかが押されたかどうか

Hell_isPressMenu / Hell_isPushMenu

  • キーボードの「C」
  • ジョイスティックの「2」ボタン
  • マウスの真ん中ボタン
のいずれかが押されたかどうか

Hell_getBgmVolume()

BGM音量の取得
  • 戻り値
    • 音量(0~128)

Hell_setBgmVolume(int volume=128)

BGM音量を設定
※Windows2000の場合、BGM音量設定直後にHell_playBgmを呼ぶとフリーズする可能性があります
回避するには、Hell_setBgmVolumeの後に、Hell_wait(100)を入れてからBGMの再生を行うようにします
  • パラメータ
    • 音量(0~128)

Hell_playBgm(char[] path, int loops=-1, int ms=0)

BGMを再生します
  • パラメータ
    • path ファイルパス
    • loops ループ回数(-1で無限ループ)
    • フェードイン時間(ms)

Hell_stopBgm(int ms=0)

BGMを停止します
  • パラメータ
    • フェードアウト時間(ms)

Hell_drawFont(char[] msg, int x, int y, int alpha=0xff)

フォントの描画(標準はasciiのみ。Hell_openFontすると日本語もイケます)
  • パラメータ
    • msg 文字列
    • x,y 描画開始位置

Hell_drawFontEx(int x, int y, int alpha, ...)

フォーマットを指定して描画

Hell_openFont(char[] key="MSGOTHIC18", int size=18, char[] path="msgothic.ttc")

指定したフォントを開きます。
フォントは、まずカレントディレクトリを探し、存在しなければシステムフォントのディレクトリを探しに行きます。
フォントを開くと標準フォント(たれフォント)は使えなくなります。
  • パラメータ
    • key キー
    • size フォントのサイズ
    • path フォントのパス

Hell_setFont(char[] key)

使用するフォントを変更します
  • パラメータ
    • key フォントのキー Hell_openFontで指定したもの

Hell_setFontColor(int r, int g, int b)

描画するフォントの色を変えます(標準フォントの場合は無効)
  • パラメータ
    • r 赤成分
    • g 緑成分
    • b 青成分

Hell_getFPS()

現在のFPSを取得します

Hell_drawFPS(int x=-1, int y=-1)

FPSを描画します
  • パラメータ
    • x 描画座標(X)
    • y 描画座標(Y)

Hell_sin(float rad)

サインを求めます。パラメータはラジアンです。

Hell_cos(float rad)

コサインを求めます。パラメータはラジアンです。

Hell_atan2(float y, float x)

アークタンジェントを求めます。戻り値はラジアンです。

Hell_sinEx(float rad)

サインを求めます。パラメータは度を指定します。

Hell_cosEx(float rad)

サインを求めます。パラメータは度を指定します。

Hell_atan2Ex(float y, float x)

アークタンジェントを求めます。戻り値は度になります。

Hell_deg2rad(float deg)

度をラジアンに変換します。

Hell_rad2deg(float rad)

ラジアンを度に変換します。

Hell_abs(float a)

Hell_abs(int a)

絶対値を求めます。

Hell_log10(float a)

常用対数を計算します。

Hell_distance(float dx, float dy)

距離を求めます。-> sqrt(dx*dx + dy*dy)

Hell_randseed(uint seed, uint index)

乱数を初期化します。
わざわざ呼ばなくてもプログラム開始時に乱数は初期化されます。
再現性のある乱数を生成したい場合にコールします。
  • パラメータ
    • seed 種
    • index 次の乱数インデックスへの増分

Hell_rand(int range)

0~rangeの範囲で乱数を生成します。

Hell_randint(int begin, int end)

begin <= x < endの範囲で乱数を生成します。
  • パラメータ
    • begin 開始値
    • end 終了値

Hell_choice(int[] array)

配列からランダムで値を取り出します

Hell_shuffle(int[] array)

配列の値をランダムに入れ替えます