「D言語ゲームライブラリ「dHell2」」の編集履歴(バックアップ)一覧はこちら
D言語ゲームライブラリ「dHell2」 - (2007/02/19 (月) 21:03:32) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
*D言語ゲームライブラリ「dHell2」
**これは何?
D言語で簡単にゲームが作れるようにライブラリ「dHell」の続編です。
OpenGL使っているのに、2Dゲーム専用だったりします。
**謝辞
-このアプリはD言語を使ってます。(version 1.0.0)
-SDL(Simple DirectMedia Layer)を使っています。
-OpenGLを使ってます。
-shinichiro_hさんのD - porting(http://shinh.skr.jp/d/porting.html)のD言語用SDL/OpenGLヘッダファイルを使っています。
-hell.bmpはtaroさんの著作物です(http://www5.atwiki.jp/yaruhara/pages/45.html)
-おめがさんの「RectWinderNTGL」のコードをかなり使わせていただきました。
-フォントにはおめがさんの「font.bmp」を使わせていただきました
----
目次
----
#contents
**ダウンロード
[[ここ>http://www5f.biglobe.ne.jp/~kenmo/dest/d/dhell2.lzh]]からライブラリ一式をダウンロードします。
**dHellであった機能
dHellではこんな感じでした。
-画像読込・描画(BMPのみ)
-BGM読込・再生(WAV/OGGのみ)
-効果音読込・再生(WAVのみ)
-キーイベント(マウス・キーボード・ジョイスティック)のハンドリング
-フォントの描画(asciiのみ)
**dHell2の新機能
こんな機能が追加されました。
-画像の拡大縮小・回転(Hell_drawTexture/Hell_drawTextureEx)
-画像の加算合成(Hell_setAlpha)
-線分/三角形の描画・回転
-円の描画
-それぞれの描画をRGBAを指定して描画できるように
(ようやく、普通のゲームライブラリっぽくなった……?)
**ビルド方法
build.batをテキストファイルで開いて、
D言語コンパイラ・リンカのパスを設定します。
(パスを通してあるのであれば、必要ありません)
で、build.batを実行します。
**使い方
「test.d」を編集していきます。
なんか色々ありますが、最低限必要なコードはこれだけです。
import hell;
void main()
{
try
{
// Hellシステム初期化(キャプション"Hell" 640x480)
Hell_init("Hell", 640, 480);
// ゲームループ開始
while(true)
{
// 描画エリアの消去
Hell_begin();
// 画面更新
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キー:アプリケーションを終了します。
**「dHell2」リファレンス
***Hell_init(char[] caption, int width, int height, bool fullscreen=false)
dHellを初期化します。
-パラメータ
--caption ウィンドウタイトル文字列
--width 画面縦サイズ
--height 画面横サイズ
--fullscreen フルスクリーンフラグ
***Hell_quit()
dHellの終了処理を行います。
***Hell_write(char[] msg)
ログファイル「run.log」にメッセージを書き込みます。
***Hell_write(int msg)
ログファイル「run.log」に数値を書き込みます。
***Hell_write(Exception e)
ログファイル「run.log」に例外情報の書き込みを行います。
***Hell_drawRect(int x=0, int y=0, int dx=0, int dy=0, int width=0, float rot=0, int r=0x00, int g=0x00, int b=0x00, int a=0xff)
矩形を描画します。
-パラメータ
--x X座標
--y Y座標
--dx 幅
--dy 高さ
--width 線の太さ(0で塗りつぶし)
--r R成分
--g G成分
--b B成分
--a A成分
***Hell_drawTriangle(float x, float y, float radius, float rot=0, int width=1, int r=0x00, int g=0x00, int b=0x00, int a=0xff)
三角形を描画します。
-パラメータ
--x X座標(中心)
--y Y座標(中心)
--radius 半径
--rot 回転角度(0~360)
--width 線の太さ(0で塗りつぶし)
--r R成分
--g G成分
--b B成分
--a A成分
***Hell_drawCircle(float cx, float cy, float radius, int width=1, int r=0x00, int g=0x00, int b=0x00, int a=0xff)
円を描画します。
-パラメータ
--cx 中心座標X
--cy 中心座標Y
--radius 半径
--width 線の太さ(0で塗りつぶし)
--r R成分
--g G成分
--b B成分
--a A成分
***Hell_loadTexture(char[] key, char[] filepath, int[3] mask=[-1, 0, 0])
BMPをテクスチャとして読みこみます。
-パラメータ
--key 画像のキー(Hell_drawTextureで使います)
--filepath 画像ファイルのパス
--mask 抜き色(mask[0]に「-1」で抜き色なし。「-2」で座標指定)
***Hell_drawTexture(char[] key, float cx, float cy, int ox=0, int oy=0, int ow=0, int oh=0, float dx=1.0f, float dy=1.0f, float rot=0, int r=255, int g=255, int b=255)
BMPを描画します。
ox,oy,ow,ohにそれぞれ「0」を指定すると、BMP全体を描画します。
-パラメータ
--key キー(Hell_loadTextureで読み込み済みのもの)
--x X座標
--y Y座標
--ox 切り取り開始X座標
--oy 切り取り開始Y座標
--ow 切り取る幅
--oh 切り取る高さ
--dx 拡大サイズ(X)
--dy 拡大サイズ(Y)
--rot 回転角度(0~360。左回り)
--r マスク色(赤)
--g マスク色(緑)
--b マスク色(青)
***Hell_drawTextureEx(char[] key, float cx, float cy, int ox=0, int oy=0, int ow=0, int oh=0, flo
Hell_drawTexture()は左上座標を指定していましたが、これは中心座標を指定して描画する関数です。
***Hell_setAlpha(char[] key, int alpha)
アルファ値を設定します。
-パラメータ
--alpha アルファ値(HELL_ALPHA_DISABLE/HELL_ALPHA_NORMAL/HELL_ALPHA_ADD)
---HELL_ALPHA_DISABLE :αブレンドしない
---HELL_ALPHA_NORMAL :半透明
---HELL_ALPHA_ADD :加算
***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_isPushMouse(HELL_RETURN))
{
printf("push return");
}
if(Hell_isPushMouse(SDLK_z))
{
printf("push z");
}
if(Hell_isPushMouse(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 チャンネル番号(-1であいているチャンネルを自動で使う)
***Hell_stopWAV()
SE(WAVファイル)の再生を全て停止します。
-パラメータ
--channel 停止チャンネル番号(-1で全て停止)
***bool 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");
}
***bool 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");
}
***bool 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");
}
***bool 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_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, float zoom=1.0f, int r=0xff, int g=0xff, int b=0xff, int a=0xff)
フォントの描画(asciiのみです)
-パラメータ
--msg ascii文字列
--x,y 描画開始位置
--zoom 拡大サイズ(1.0fで32x48)
--r R成分
--g G成分
--b B成分
--a A成分
*D言語ゲームライブラリ「dHell2」
**これは何?
D言語で簡単にゲームが作れるようにライブラリ「dHell」の続編です。
OpenGL使っているのに、2Dゲーム専用だったりします。
**謝辞
-このアプリはD言語を使ってます。(version 1.0.0)
-SDL(Simple DirectMedia Layer)を使っています。
-OpenGLを使ってます。
-shinichiro_hさんのD - porting(http://shinh.skr.jp/d/porting.html)のD言語用SDL/OpenGLヘッダファイルを使っています。
-hell.bmpはtaroさんの著作物です(http://www5.atwiki.jp/yaruhara/pages/45.html)
-おめがさんの「RectWinderNTGL」のコードをかなり使わせていただきました。
-フォントにはおめがさんの「font.bmp」を使わせていただきました
----
目次
----
#contents
**ダウンロード
[[ここ>http://www5f.biglobe.ne.jp/~kenmo/dest/d/dhell2.lzh]]からライブラリ一式をダウンロードします。
**更新履歴
-2007.02.19 -- 1.0.2 テクスチャで存在するキーを指定した場合、既存のテクスチャを破棄して読み込むように修正。「F4」キーで全てのテクスチャを読み込みなおす処理を追加。
-2007.02.16 -- 1.0.1 円描画命令「Hell_drawCircle()」の追加
-2007.02.13 -- 1.0.0 公開開始
**dHellであった機能
dHellではこんな感じでした。
-画像読込・描画(BMPのみ)
-BGM読込・再生(WAV/OGGのみ)
-効果音読込・再生(WAVのみ)
-キーイベント(マウス・キーボード・ジョイスティック)のハンドリング
-フォントの描画(asciiのみ)
**dHell2の新機能
こんな機能が追加されました。
-画像の拡大縮小・回転(Hell_drawTexture/Hell_drawTextureEx)
-画像の加算合成(Hell_setAlpha)
-線分/三角形の描画・回転
-円の描画
-それぞれの描画をRGBAを指定して描画できるように
(ようやく、普通のゲームライブラリっぽくなった……?)
**ビルド方法
build.batをテキストファイルで開いて、
D言語コンパイラ・リンカのパスを設定します。
(パスを通してあるのであれば、必要ありません)
で、build.batを実行します。
**使い方
「test.d」を編集していきます。
なんか色々ありますが、最低限必要なコードはこれだけです。
import hell;
void main()
{
try
{
// Hellシステム初期化(キャプション"Hell" 640x480)
Hell_init("Hell", 640, 480);
// ゲームループ開始
while(true)
{
// 描画エリアの消去
Hell_begin();
// 画面更新
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」にエラーが書き込まれるので、
それを参照します。
**特殊なキーの動作
-F4キー:登録しているテクスチャを全て読み込みし直す
-F5キー:ボスが来た! ⇒ウィンドウ最小化
-F9キー:ウィンドウモード・フルスクリーン切替(使用不可)
-F10キー:マウスカーソル表示切替
-F12キー:スクリーンショットをscreenshot.bmpで保存(使用不可)
-ESCキー:アプリケーションを終了します。
**「dHell2」リファレンス
***Hell_init(char[] caption, int width, int height, bool fullscreen=false)
dHellを初期化します。
-パラメータ
--caption ウィンドウタイトル文字列
--width 画面縦サイズ
--height 画面横サイズ
--fullscreen フルスクリーンフラグ
***Hell_quit()
dHellの終了処理を行います。
***Hell_write(char[] msg)
ログファイル「run.log」にメッセージを書き込みます。
***Hell_write(int msg)
ログファイル「run.log」に数値を書き込みます。
***Hell_write(Exception e)
ログファイル「run.log」に例外情報の書き込みを行います。
***Hell_drawRect(int x=0, int y=0, int dx=0, int dy=0, int width=0, float rot=0, int r=0x00, int g=0x00, int b=0x00, int a=0xff)
矩形を描画します。
-パラメータ
--x X座標
--y Y座標
--dx 幅
--dy 高さ
--width 線の太さ(0で塗りつぶし)
--r R成分
--g G成分
--b B成分
--a A成分
***Hell_drawTriangle(float x, float y, float radius, float rot=0, int width=1, int r=0x00, int g=0x00, int b=0x00, int a=0xff)
三角形を描画します。
-パラメータ
--x X座標(中心)
--y Y座標(中心)
--radius 半径
--rot 回転角度(0~360)
--width 線の太さ(0で塗りつぶし)
--r R成分
--g G成分
--b B成分
--a A成分
***Hell_drawCircle(float cx, float cy, float radius, int width=1, int r=0x00, int g=0x00, int b=0x00, int a=0xff)
円を描画します。
-パラメータ
--cx 中心座標X
--cy 中心座標Y
--radius 半径
--width 線の太さ(0で塗りつぶし)
--r R成分
--g G成分
--b B成分
--a A成分
***Hell_loadTexture(char[] key, char[] filepath, int[3] mask=[-1, 0, 0])
BMPをテクスチャとして読みこみます。
-パラメータ
--key 画像のキー(Hell_drawTextureで使います)
--filepath 画像ファイルのパス
--mask 抜き色(mask[0]に「-1」で抜き色なし。「-2」で座標指定)
***Hell_drawTexture(char[] key, float cx, float cy, int ox=0, int oy=0, int ow=0, int oh=0, float dx=1.0f, float dy=1.0f, float rot=0, int r=255, int g=255, int b=255)
BMPを描画します。
ox,oy,ow,ohにそれぞれ「0」を指定すると、BMP全体を描画します。
-パラメータ
--key キー(Hell_loadTextureで読み込み済みのもの)
--x X座標
--y Y座標
--ox 切り取り開始X座標
--oy 切り取り開始Y座標
--ow 切り取る幅
--oh 切り取る高さ
--dx 拡大サイズ(X)
--dy 拡大サイズ(Y)
--rot 回転角度(0~360。左回り)
--r マスク色(赤)
--g マスク色(緑)
--b マスク色(青)
***Hell_drawTextureEx(char[] key, float cx, float cy, int ox=0, int oy=0, int ow=0, int oh=0, flo
Hell_drawTexture()は左上座標を指定していましたが、これは中心座標を指定して描画する関数です。
***Hell_setAlpha(char[] key, int alpha)
アルファ値を設定します。
-パラメータ
--alpha アルファ値(HELL_ALPHA_DISABLE/HELL_ALPHA_NORMAL/HELL_ALPHA_ADD)
---HELL_ALPHA_DISABLE :αブレンドしない
---HELL_ALPHA_NORMAL :半透明
---HELL_ALPHA_ADD :加算
***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_isPushMouse(HELL_RETURN))
{
printf("push return");
}
if(Hell_isPushMouse(SDLK_z))
{
printf("push z");
}
if(Hell_isPushMouse(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 チャンネル番号(-1であいているチャンネルを自動で使う)
***Hell_stopWAV()
SE(WAVファイル)の再生を全て停止します。
-パラメータ
--channel 停止チャンネル番号(-1で全て停止)
***bool 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");
}
***bool 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");
}
***bool 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");
}
***bool 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_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, float zoom=1.0f, int r=0xff, int g=0xff, int b=0xff, int a=0xff)
フォントの描画(asciiのみです)
-パラメータ
--msg ascii文字列
--x,y 描画開始位置
--zoom 拡大サイズ(1.0fで32x48)
--r R成分
--g G成分
--b B成分
--a A成分
表示オプション
横に並べて表示:
変化行の前後のみ表示: