2018年07月16日

VB.NETでDirectX~第2回・画像を表示する方法について学ぼう!

おーちゃん:どうもこんにちは。おーちゃんじゃ、おーちゃんじゃ。

助手:助手です。よろしくお願いします。あれ、博士は?

おーちゃん:博士はお寝坊じゃ。お寝坊じゃ。なので、博士が起きるまで、わしが講義するぞ。

助手:はぁ……。それでおーちゃん。今回は何を?

おーちゃん:うむ、今回は、画像を表示する方法を説明するぞ。説明するぞ。

助手:はい。よろしくお願いします、おーちゃん。

[まずは]

おーちゃん:まずは、前回のプロジェクトを開くのじゃ。

助手:はい、既に開いてあります。

おーちゃん:そしたらあらかじめDebugフォルダの下に、適当な画像をコピーして、名前をchara.bmpに変えておくのだ。

助手:はい、できました。

おーちゃん:そしたら、ここから、画像を表示する処理を描いていくことにするぞ。まずは、

Module Module1

の下に、次の一文を書くのだ、書くのだ。

Dim hChara As Integer

おーちゃん:次に、

SetDrawScreen(DX_SCREEN_BACK)

の下に、次の文を書くのだ。

hChara = LoadGraph("chara.bmp")

助手:はい。

おーちゃん:そして最後に、

ClearDrawScreen()

の下に次の文を書くのだ。これでOKじゃ、OKじゃ。

DrawGraph(50, 50, hChara, 0)

助手:はい、できました、おーちゃん。

おーちゃん:では、実行してみるのじゃ。

助手:おぉ! ちゃんと画像が表示されていますよ!

vbdx1807-01.JPG

おーちゃん:うむ。では、これから、この付け足した部分について説明していくぞ。していくぞ。

[LoadGraphとDrawGraph]

博士:ふわぁ……良く寝たわい。

助手:あ、起きてきたんですか、博士。今月はおーちゃんとするから、まだ寝てていいですよ。

博士:そ、それは困るっ。わしの仕事がっ。

助手:それじゃ、これからは寝坊しないようにしてくださいね、博士。

博士:う、うむ……。さて、まずはLoadGraph関数からじゃ。このLoadGraph文は、画像をメモリに読み込む命令じゃ。その際、その画像を表す番号……ハンドルを返り値として渡すようになっておるのじゃ。

助手:ハンドル、ですか?

博士:うむ。画像を表示する関数を使うときには、このハンドルを使って表示させる画像を指定するのじゃ。

助手:なるほど。

博士:あと、かっこの中には、ダブルコーテーションで囲んで、読み込む画像のパスを指定するのじゃ。

助手:はい、わかりました。

博士:そして次は、DrawGraph関数じゃ。これは、名前の通り、画像を表示するものじゃ。最初の二つの引数は、画像を表示させる位置を指定している。この位置が、画像の左上に当たるように表示されるのじゃ。つまりこの場合だと、画像の左上が(50, 50)に来るように表示するのじゃ。

助手:プログラム中での表記を見るに……3番目は、表示させる画像のハンドルですか?

博士:うむ、その通りじゃ。さて、DrawGraphは一つだけではなく、何度も実行することができる。その場合、後のDrawGraphで、画面を上書きするので、実行する順番には注意が必要じゃ。

助手:ということは、背景をつけたいときは、背景→キャラクターの順番で実行すればいいわけですね? よーし。

--------------------
Dim hChara As Integer
Dim hBack As Integer

Sub Main()
''ウィンドウモードの設定
ChangeWindowMode(1)
''ウィンドウタイトルの設定
SetWindowText("最初のプログラム")

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

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

hBack = LoadGraph("back.bmp")
hChara = LoadGraph("chara.bmp")

''メインループ
Do
''画面クリア
ClearDrawScreen()

DrawGraph(0, 0, hBack, 0)
DrawGraph(50, 50, hChara, 0)

''フリップ
ScreenFlip()

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

If (CheckHitKey(KEY_INPUT_ESCAPE) = 1) Then
Exit Do
End If
Loop
End Sub
--------------------

助手:よし、実行……と。あれ?

vbdx1807-02.JPG

助手:キャラクターの周囲が黒くなってます。なんでなんでしょう?

博士:うむ、その解決法は、この後説明していくぞよ。

[透過フラグについて]

博士:といっても、その解決法は簡単なのじゃ。

DrawGraph(50, 50, hChara, 0)

の行の四番目の引数。0になっているが、これを1にするだけじゃよ。

助手:なるほど、やってみます。

vbdx1807-03.JPG

助手:お、今度はうまくいきました! もしかしてこの四番目の引数は、背景を透明にするかどうかのフラグなのでは?

博士?:うむ、そのとおりじゃ。これを1にすると、黒になっている部分を透明にしてくれるんじゃよ。

助手:それでは、他の色を透明にしたい場合はどうすれば?

博士?:その方法もちゃんとあるぞよ。LoadGraph関数の前に、この関数を実行すればいいのじゃ、いいのじゃ。

SetTransColor(●, ●, ●)

助手:SetTransColor関数、ですか。

博士?:うむ。三つの引数は、それぞれ、赤、緑、青の色の濃さを表している。そして、これによって設定された色の部分を透明にしてくれるのじゃ。詳しくは、DXライブラリのサイトを見るのじゃ、見るのじゃ。

助手:わかりました。……あれ?

おーちゃん:今日も疲れたわい、疲れたわい。

助手:あ、あれ? おーちゃん? 博士は?

おーちゃん:博士なら、そこに倒れておる。倒れておる。

助手:……。

おーちゃん:次回は、DrawGraph関数のバリエーションを紹介するぞ、紹介するぞ。

※次の更新は、7月19日。レトロゲーレビューの予定です。お楽しみに!
posted by 裏編 at 07:32| Comment(0) | VB.NETでDirectX | このブログの読者になる | 更新情報をチェックする

2018年06月21日

VB.NETでDirectX~第1回・基本的な関数について学ぼう!

博士:おっほん。わしが、この『VB.NETでDirectX』を担当する博士じゃ。

助手:助手です。よろしくお願いします。

博士:この講座は、DXライブラリというものを使った、VB.NETによるDirectXプログラミングについて講座、ということじゃ。

助手:『ということじゃ』ってなんですか博士……何はともあれ、よろしくお願いします。

[さっそく導入してみよう!]

博士:さて、導入についてじゃが、これは先々月のB-Magaに載っているから省略するとして……。

助手:ちょ、ちょっと博士! それじゃ不親切すぎますよ! 第一、今日からB-Magaを読み始めた人はどうするんですか?

博士:しかたないのう。では、おーちゃん、よろしく頼む。

助手:おーちゃん?

おーちゃん:おーちゃんじゃ、おーちゃんじゃ!

助手:お、オウム!?

おーちゃん:ここからは、わしが博士に変わって説明するぞ。まずは、ここから、DXライブラリのC#用パッケージをダウンロードするのじゃ。

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

おーちゃん:ここの、『VisualC#用パッケージ』という項目に、ダウンロードするためのリンクがあるぞ。ダウンロードしたら、解凍しておくようにな。

助手:はい、できました。それでは……おーちゃん、次はどうすれば?

おーちゃん:うむ。Visual Studio2017を立ち上げるのじゃ、立ち上げるのじゃ。そしたら、『新しいプロジェクト』をクリックして、プロジェクトの種類は、Visual Basicの、『コンソールアプリ(.Net Framework)』か、『Windowsフォームアプリケーション』を選ぶのじゃ。今回は、『コンソールアプリ(.Net Framework)』を選ぶとしよう。

助手:プログラミング画面が出てきましたね。

おーちゃん:そしたら次は、プロジェクトメニューから、『参照の追加』を選ぶのじゃ。

助手:何やらウィンドウが出ましたね。

おーちゃん:うむ、そしたら『参照』ボタンを押して、開いたファイル選択のウィンドウから、先ほど解凍した中に入っている、DxLibDotNet.DLLを選択するのじゃ。これで準備は完了じゃぞ!

助手:次はいよいよプログラミングですね!

おーちゃん:おっと、その前に一つ注意すべき点がある。プロジェクトを作ると、そのフォルダの中に、Debugフォルダができると思うが、先ほど解凍した中にある、DxLib.DLLとDxLib_x64.DLLを入れておくこと。
そうしないと、実行したときにエラーとなるから気を付けるように。

助手:はい、わかりました。

[まずは簡単なプログラミング]

助手:これなら、もう博士はいらないなぁ。それでおーちゃん、次は……。

博士:わー、待ってくれい。それではわしの仕事がなくなってしまうっ。

助手:あ、起きてきた。そう思うんでしたら、ちゃんと仕事してください、博士。

博士:わ、わかったわい……。ではいよいよプログラミングに移ろうか。まず、ソースファイルの頭にこれを追加するのじゃ。

Imports DxLibDLL.DX

博士:これは簡単に言うと、DXライブラリの命令を、プロジェクトに組み込んで使えるようにするおまじないじゃ。

助手:なるほど。

博士:いよいよプログラムじゃが、まずは基本的な骨組みの部分を紹介していくぞ。これじゃ。

----------
''ウィンドウモードの設定
ChangeWindowMode(1)
''ウィンドウタイトルの設定
SetWindowText("最初のプログラム")

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

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

''メインループ
Do
''画面クリア
ClearDrawScreen()

''フリップ
ScreenFlip()

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

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

博士:これを、Sub Main()とEnd Subの間に書くのじゃ。

助手:かたかたかた……できました。実行してみますね。

博士:うむ。

助手:真っ黒なウィンドウが出てきました!

博士:うむ、成功したようじゃな。これが、基本的な骨組み。これに色々追加してゲームを作っていくのじゃ。

助手:なるほど!

博士:さて、次はいよいよ、それぞれの関数について説明していくとするぞよ。

[基本的な関数]

博士:まずは、ChangeWindowModeじゃが、これはウィンドウモードで実行するか、それとも全画面で実行するかを設定するものじゃ。1と入れるとウィンドウモードになり、0にすると全画面になる。

助手:なるほど。次のSetWindowTextはもしかして、ウィンドウのタイトルを設定するものですか?

博士:うむ。その通り。そしてこれじゃ。

DxLib_Init

助手:DxLib_Initですか。

博士:うむ。これは簡単に言うと、DXライブラリを使う準備を行う関数じゃ。
この関数は、準備に失敗を返すと-1を返す。DXライブラリのリファレンスでは、-1の場合、ただちにプログラムを終了させるようにと言われておる。

助手:それで、IF文で、この関数が-1のときはExit Subを実行しているってわけですね。

博士:その通りじゃ。それで、次はSetDrawScreenじゃが……じゃが……。

助手:???

博士:おーちゃん、後は頼む……ばた。

助手:………。

おーちゃん:さて、また登場、おーちゃんじゃ。次は、SetDrawScreenじゃが、これはグラフィックを描く対象を、表画面にするか、裏画面にするかを設定する関数じゃ。

助手:表画面? 裏画面?

おーちゃん:表画面は、ディスプレイに表示されている画面にそのまま書く。他方、裏画面はメモリの中に展開されている、画面に表示されていない画面に書くのじゃ。その場合、適当なところで、後述するScreenFlip関数で、書かれた内容を画面に反映させる必要がある。

助手:どうしてそのようなことを?

おーちゃん:基本的に、Windowsでのゲームプログラムでは、後でも説明するが、画面を消しては描きなおす、という手順を使う。なので、表画面にそのまま書いた場合、画面がちらついてしまうのじゃ。

助手:なるほど。

おーちゃん:そこで、裏画面に書いておき、完成したところでそれを表画面に反映させるという手法をとるわけじゃ。ちなみにこれを、専門用語で『ダブル・バッファリング』というぞ。

助手:なるほど。それで次のClearDrawScreenですが、これはもしかしたら、画面をクリアする関数なのでは?

おーちゃん:うむ、その通り。そして、ScreenFlip関数は、さっきも話したの。裏画面に描画した内容を、画面に反映させる命令じゃ。これを実行させると、裏画面の内容が、画面に表示される。

助手:ふむふむ。次のProcessMessageは?

おーちゃん:これは、Windowsのシステムからのメッセージを処理する関数じゃ。
とはいっても、さほど難しく考えることはない。覚えることは二つ。
『定期的に実行する必要がある』ことと、『そのメッセージの処理でエラーが発生したり、ゲームのウィンドウが閉じられたときに-1』を返す、ということだけじゃ。

助手:ということは、ProcessMessageの入っているIF文は、ウィンドウが閉じられたら、ループを抜けるという意味なのですね?

おーちゃん:うむ、そういうことじゃ。そして最後。DxLib_End。これも難しいことはない。DXライブラリの後始末をする関数じゃ。DXライブラリを使ったプログラムを終了させるときは、必ずこの関数を実行しなければならぬ。

助手:なるほど、わかりました。

おーちゃん:うむ、では今日の講義はここまで。さらばぢゃ。

助手:はい、おつかれさまでした。あ、次の講座は、キャラクターを表示させる方法だそうですよ。それじゃ。

……一時間後。

博士:ふわぁ、良く寝たわい。あれ? 助手、おーちゃん、どこじゃ?



※次の更新は、6月25日。『みくみく音楽館』の予定です。お楽しみに!
posted by 裏編 at 07:12| Comment(0) | VB.NETでDirectX | このブログの読者になる | 更新情報をチェックする