2018年05月03日

緊急特集! VB.NETでDirectXゲームプログラミングを!

~(1) VB.NETでDirectXプログラミングができるぞ!

いきなり、DirectXとは何かについて説明しましょう。
DirectXとは、Wikipediaによれば、

マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合である。オーバーヘッドを少なくしたデバイスの仮想化・抽象化を提供する。

とのことです。簡単に言えば、普通に作るよりも簡単にゲームやマルチメディアソフトを作れ、しかも動作が速くなるようにするためのツールのようなものです。

とはいえ、これ、簡単に見えるのは、ごく一部の人のみで、筆者など、DirectX7のころにはなんとかなったのですが、DirectX9となると、もうお手上げでした。

そこで、DirectXでのプログラミングをより簡単にするために、山田巧氏によってDXライブラリというものが生み出されました。
これによって、DirectXプログラミングの敷居はめちゃめちゃに下がりました。例えるなら、日曜大工初心者の人が、すぐに家を一軒立てられるくらいに。

でも、これでもまだ問題がありました。これ、C++対応なのです。
C++からプログラミングに入った人はその恩恵を一杯授かることができましたが、筆者のようなBASICからVBへと上がってきた人にとっては、なすすべがなかったのでした。

そう、『でした』。

でも、山田氏は神様です、仏様です。DXライブラリが、C#で使えるようになるDLLを開発なされたのです。しかも、このDLLは

VB.NETでも使えるのです!

VB.NETでも使えるのです!

大切なことなので、二回言いました。

これを使えば、VB.NETでも、楽にDirectXを使ったゲームプログラムを作ることができるのです。
本当にありがたいです。

ということで、前置きが長くなりましたが、今回の特集では、このDXライブラリをVB.NETで使う方法について説明していこうと思います。

~(2)DXライブラリを導入してみよう!

ではまずは、ダウンロードしてみましょう。

http://dxlib.o.oo7.jp/dxdload.html

のページに、VisualC# 用パッケージという項目があります。そこのリンクから、VisualC#用パッケージをダウンロードしましょう。

toku1805-01.JPG

DLすると、DxLibDotNet.dll、DxLib.dll、DxLib_x64.dllという三つのDLLが作られます。これが、DXライブラリを使うためのDLLなのです。

では次に、Visual Studioを起動させましょう。持っていない方は、あらかじめダウンロードしておいてくださいね。

起動したら、『新しいプロジェクトの作成』をクリックして、新しいプロジェクトを作ります。

toku1805-02.JPG

プロジェクトの種類についてですが、『Windowsフォームアプリケーション(.NET Framework)』か、『コンソールアプリ(.NET Framework)』のどちらかがいいかと思います。スタートアップ画面やコンフィグ設定のウィンドウを使いたいなら、前者がいいでしょう。筆者は前者を使ってます。
今回は、『コンソールアプリ(.NET Framework)』で作ることにします。

プロジェクトが出来上がって、プログラム入力の画面が表示されたら、今度は『プロジェクト(P)』をクリックしてメニューを開き、『参照の追加』をクリックします。

toku1805-03.JPG

すると、またウィンドウが開きますので、左側にある『参照』をクリックして枠で囲み、さらにウィンドウ下の参照と書かれたボタンを押します。

toku1805-04.JPG

今度はファイルを選ぶウィンドウが開くので、先ほど解凍して出てきた、『DxLibDotNet.dll』を選びます。
ファイルを選ぶウィンドウが閉じたら、あとはOKを押せば、第一段階は完了です。

そして第二段階、こちらはとても簡単です。

プログラムの一番上に、

Imports DxLibDLL.DX

と書くだけです。

これで、DXライブラリを使う準備は完了です!

そうそう。大切なことを忘れてました。
実行させる前に、プロジェクトのbinの下のdebugフォルダとreleaseフォルダの中に、残る二つのDxLib.dll、DxLib_x64.dllの二つのファイルをコピーしておいてください。そうしないと、実行時にエラーが出ます。

~(3) プログラムを組んでみよう!

さて、準備ができたところで、いよいよDXライブラリを使って、プログラムを作ってみましょう。
プログラムと言っても、Hello Worldを表示するなんて、そんなプログラムは作りません。(そんなことしたら、ある師匠に飛び蹴りを喰らいそうですw)
今回は、キャラクターを表示するプログラムを作ってみようと思います。

というわけで、実行前に、こちらの画像をダウンロードし、プロジェクトのbinの下のdebugフォルダとreleaseフォルダの中にコピーしておいてくださいね。

chara.bmp

back.bmp

では、以下がそのプログラムです。これを、Sub Main() と End Subの間に入力してみてください。

----------
''キャラ用ハンドル
Dim hndChara As Integer
''背景用ハンドル
Dim hndBack As Integer

''DXライブラリ初期化
If DxLib_Init() = -1 Then
DxLib_End()
Exit Sub
End If

''ウィンドウモードにする
ChangeWindowMode(1)

''画像のロード
''---まずはキャラクター
hndChara = LoadGraph("chara.bmp")
''---続いて背景
hndBack = LoadGraph("back.bmp")

''ダブルバッファリングの設定
SetDrawScreen(DX_SCREEN_BACK)

''ここからプログラムループ本体
Do
''画面を一度消す
ClearDrawScreen()

''背景を描く
DrawGraph(0, 0, hndBack, 0)

''キャラクターを描く
DrawGraph(100, 100, hndChara, 1)

''描画画面の内容を、実画面に表示
ScreenFlip()

''メッセージ処理でエラーがあれば抜ける
If ProcessMessage() = -1 Then
Exit Do
End If

''ESCキーが押されたら抜ける
If CheckHitKey(KEY_INPUT_ESCAPE) = 1 Then
Exit Do
End If
Loop

''DXライブラリを終了させる
DxLib_End()
----------

どうでしょうか? 星空の左上に、鳥のようなキャラクターが表示されたら成功です。
それでは、次の項目では、このプログラムについて簡単に説明していきます。

~(4)プログラムについて知ろう!

まずは、これからです。

If DxLib_Init() = -1 Then
DxLib_End()
Exit Sub
End If

DxLib_Initは、DXライブラリを使う準備をする関数、DxLib_EndはDXライブラリの後始末をするための関数です。
このDxLIb_Initは、準備で異常が発生すると、-1を返します。DXライブラリのリファレンスでは、そのようなことがあったら、ただちにプログラムを終了させてください、と書かれています。そこで、-1が返ってきたら、すぐにDXライブラリの後始末をして、プログラムを終了させるようにしてあるのです。

ChangeWindowMode(1)

これは、ウィンドウモードにするためのおまじないのようなものです。これを省くか、1を0に変えると、フルスクリーンになります。

hndChara = LoadGraph("chara.bmp")
hndBack = LoadGraph("back.bmp")

次はこれです。LoadGraphは、指定された画像を読み込み、メモリに格納する関数です。このとき、LoadGraphは、その画像データに番号をつけて、それを返してくるのですが、DXライブラリでは、絵を表示したり、音を鳴らしたりするときは、その絵や音を、この番号(ハンドルと言います)で指定します。

そして、次はこちらです。

SetDrawScreen(DX_SCREEN_BACK)

これは、ダブルバッファリングというものを行うためのおまじないのようなものです。
ダブルバッファリングとは何かと言いますと、仮想の画面に絵を描き、全て描き終わったところで、それを実際の画面に反映する手法のことです。
Windowsプログラムでの描画は基本的に、画面を消してからいちいち描きなおすを繰り返してやっています。なので、ダブルバッファリングを行わずにすると、画面がちかちかしてしまうのです。

なので、DXライブラリで画像を扱うときは、事前にこの命令で、ダブルバッファリングの準備をしておきましょう。

では次です。

ClearDrawScreen()

この関数で画面をクリアします。

DrawGraph(0, 0, hndBack, 0)
DrawGraph(100, 100, hndChara, 1)

DrawGraphは、LoadGraphで読み込んだ画像を表示する関数です。DrawGraph関数を使うさいには、表示する画像のハンドルを指定します。

ScreenFlip()

この関数は、仮想の画面に書かれた内容を、実際の画面に反映するものです。一通り描画した後には、この関数を実行して、その内容を反映する必要があります。

If ProcessMessage() = -1 Then
Exit Do
End If

If CheckHitKey(KEY_INPUT_ESCAPE) = 1 Then
Exit Do
End If

これはそれほど難しくありません。異常が発生したときや、ESCキーが押された時に、プログラムを終了させるために繰り返しから抜ける、というだけのことです。

そしてラスト。

DxLib_End()

先ほど説明しましたね。この命令でDXライブラリの後始末を行います。
DXライブラリを使ったプログラムを終了させるさいは、この命令で後始末を行わなければなりません。

いかがでしょうか? このように、DXライブラリを使ったプログラムでは、

(1) DXライブラリの準備(DxLib_Init)
 ↓
(2) 画像の読み込み(LoadGraph)
 ↓
(3) ダブルバッファリングのおまじない(SetDrawScreen)
 ↓
(4) ウィンドウモードの設定(ChangeWindowMode) ※必要なときのみ
 ↓
(5) 画面をクリア(ClearScreen)
 ↓
(6) 画像を描画(DrawGraph)
 ↓
(7) 描画を反映(ScreenFlip)
 ↓
(8) 終了させるなら(9)へ。続けるなら(5)へ戻る。
 ↓
(9) DXライブラリの後始末(DxLib_End)

※(2)(3)(4)は順不同。

という流れで処理を行わせます。これを踏まえれば、ゲーム作りにぐっと近づくことができるでしょう。

~(5)最後に
ここまで説明してきましたが、いかがでしょうか?
DXライブラリを使えば、あまり多くない関数(命令)で、しかもプログラムの構造も難しくなく、あたかもひと昔前のBASICでプログラムを作るような感覚でプログラムが作れることがわかったかと思います。

B-Magaでは、将来、このDXライブラリを使ったVB.NETでのゲームプログラミングの講座を掲載する予定です。

もちろん、DXライブラリを使ったゲームの投稿もお待ちしていますよ!

ではでは!

※次の更新は、5月7日、『機動電脳伝Gパソレク』の予定です。お楽しみに!
posted by 裏編 at 14:02| Comment(0) | 特集 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください