これは何?
D言語で簡単にゲームが作れるようにライブラリを作ってみました。
ただし、プリミティブな機能しかありません。が。
D言語のお試しとして、使ってみるのもいいかもしれません。
ただし、プリミティブな機能しかありません。が。
D言語のお試しとして、使ってみるのもいいかもしれません。
目次
- これは何?
- ダウンロード
- 関連陸
- 変更履歴
- 機能
- ビルド方法
- 使い方
- 特殊なキーの動作
- サンプルゲーム
- 「dHell」リファレンス
- Hell_init(char[] caption, int width, int height, bool fullscreen=false)
- Hell_quit()
- Hell_write(...)
- Hell_write(Exception e)
- Hell_update()
- Hell_wait(int ms)
- Hell_setCaption(...)
- Hell_setOffset(int x, int y)
- Hell_drawPoint(int x, int y, int r=0x00, int g=0x00, int b=0x00)
- Hell_drawLine(int x1, int y1, int x2, int y2, int r=0x00, int g=0x00, int b=0x00)
- Hell_fillRect(int x=0, int y=0, int w=0, int h=0, int r=0x00, int g=0x00, int b=0x00)
- Hell_fillRectEx(int cx=0, int cy=0, int w=0, int h=0, int r=0x00, int g=0x00, int b=0x00)
- Hell_loadBMP(char[] key, char[] filepath, int r=-2, int g=0, int b=0)
- Hell_draw(char[] key, int px, int py, int ox=0, int oy=0, int ow=0, int oh=0)
- Hell_drawEx(char[] key, int cx, int cy, int ox=0, int oy=0, int ow=0, int oh=0)
- Hell_setAlpha(char[] key, int alpha)
- Hell_getMouseX
- Hell_getMouseY
- Hell_isPressMouse
- Hell_isPushMouse
- Hell_isPressKey
- Hell_isPushKey
- Hell_loadWAV(char[] key, char[] path)
- Hell_playWAV(char[] key, int loops=0, int channel=-1)
- Hell_playWAVEx(char[] key, int channel)
- Hell_stopWAV(int channel=-1)
- Hell_isPressJKey(int id)
- Hell_isPushJKey(int id)
- Hell_isPressJButton(int id)
- Hell_isPushJKey(int id)
- 入力ユーティリティ
- Hell_getBgmVolume()
- Hell_setBgmVolume(int volume=128)
- Hell_playBgm(char[] path, int loops=-1, int ms=0)
- Hell_stopBgm(int ms=0)
- Hell_drawFont(char[] msg, int x, int y, int alpha=0xff)
- Hell_drawFontEx(int x, int y, int alpha, ...)
- Hell_openFont(char[] key="MSGOTHIC18", int size=18, char[] path="msgothic.ttc")
- Hell_setFont(char[] key)
- Hell_setFontColor(int r, int g, int b)
- Hell_getFPS()
- Hell_drawFPS(int x=-1, int y=-1)
- 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)
- Hell_randseed(uint seed, uint index)
- Hell_rand(int range)
- Hell_randint(int begin, int end)
- Hell_choice(int[] array)
- Hell_shuffle(int[] array)
ダウンロード
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言語コンパイラ・リンカのパスを設定します。
(パスを通してあるのであれば、必要ありません)
D言語コンパイラ・リンカのパスを設定します。
(パスを通してあるのであれば、必要ありません)
で、build.batを実行します。
フォントの補足
フォントを読み込む場合、コンパイルスイッチに「-version=use_ttf」を指定する必要があります。
フォントを読み込まない場合(ascii文字のみで充分な場合)、「SDL_ttf.lib」と「SDL_ttf.dll」は不要となります。
フォントを読み込まない場合(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()で終了します。
ウィンドウが閉じられたときには、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全体を描画します。
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)
配列の値をランダムに入れ替えます