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| VB.NETでDirectX | 更新情報をチェックする