2018年09月20日

VB.NETでDirectX~第4回・キー入力でキャラを動かそう!

助手:あ、博士、また寝てる。しょうがないなぁ。博士、起きてください。講義の時間ですよ。

博士:すやすや……。

助手:起きないなぁ……あ、そうだ。おーちゃーん。博士寝てるから変わりに……

博士:(がばっ)ま、待ってくれいっ。それはわしが困る。

助手:やっと起きた。おーちゃんに仕事取られたくなかったら、ちゃんと起きて仕事してください博士。

博士:わ、わかっておるわい……。それでは今月は、ジョイパッドやキーボードなどで、キャラクターを動かす方法について説明していくことにするぞい。



[これがプログラムだ!]

博士:ではまずは、第1回と同じように、プロジェクトを作るのじゃ。プロジェクトの種類は、『コンソールアプリ(.Net Framework)』でな。

助手:はい、できました。『参照の追加』の設定や、DLLのコピーもやっておきましたよ。

博士:うむ。わからない読者は、第1回を読み直しておくようにな。さて、ではまず、Module Module1とSub Main()の間に、次のコードを書くのじゃ。

----------
Dim hChara As Integer
Dim x As Integer
Dim y As Integer
----------

博士:そして次は、Sub Main()とEnd Subの間に、次のコードを書くのじゃ。

----------
Dim pad As Integer

''ウィンドウモードの設定
ChangeWindowMode(1)
''ウィンドウタイトルの設定
SetWindowText("キャラクターをジョイパッドで動かすプログラム")

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

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

hChara = LoadGraph("chara.bmp")

x = 100
y = 100

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

pad = GetJoypadInputState(DX_INPUT_KEY_PAD1)

If (pad And PAD_INPUT_UP) <> 0 Then
y = y - 2
End If

If (pad And PAD_INPUT_DOWN) <> 0 Then
y = y + 2
End If

If (pad And PAD_INPUT_LEFT) <> 0 Then
x = x - 2
End If

If (pad And PAD_INPUT_RIGHT) <> 0 Then
x = x + 2
End If

DrawGraph(x, y, hChara, 1)

''フリップ
ScreenFlip()

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

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

博士:そうそう。適当なキャラクターの画像(BMP形式)を、『chara.bmp』の名前でプロジェクトのDebugフォルダに保存しておくようにな。

博士:できたら、実行してみるのじゃ。どうじゃ?

助手:あっ! ジョイパッドやカーソルキーで、キャラを動かせますよ!

博士:うむうむ。それでは、これから、このプログラムのキモについて説明していくぞよ。



[GetJoypadInputState]

博士:このプログラムのキモは、ClearDrawScreen関数の次にある、この文じゃ。

----------
pad = GetJoypadInputState(DX_INPUT_KEY_PAD1)
----------

博士:この関数を使うと、人間が押したジョイパッドやキーボードの情報を返してくれる、というものじゃ。

助手:ふむふむ。この( )の中の引数は?

博士:うむ、これは、これは……。

助手:おや、博士、もしかして?

博士:うっ!!(ばた

助手:あー、やっぱり。おーちゃん、続きを頼みます。

おーちゃん:うむ、おーちゃんじゃ、おーちゃんじゃ。さて、この引数には、どのジョイパッドからの入力を調べるかが入るのじゃ。このDX_INPUT_KEY_PAD1を入れた場合は、キーボードと1番のジョイパッドについての入力の情報が返されるのじゃ。

助手:なるほど。

おーちゃん:ちなみに、DX_INPUT_PAD2を入れると、2番のジョイパッドについての情報から得られるし、DX_INPUT_PAD3とすると、3番のものが得られる。DX_INPUT_KEYだと、キーボードの情報が得られるぞい。

助手:わかりました。それで、この関数の戻り値から、どうやってどのキーが押されたかを調べればいいんでしょう?

おーちゃん:うむ。それは、Andを使えば可能じゃ。この行に注目するのじゃ、するのじゃ。

----------
If (pad And PAD_INPUT_UP) <> 0 Then
----------

おーちゃん:PAD_INPUT_UPとは、上方向を表す定数じゃ。関数の戻り値と、この定数とでAndを取り、その結果が0でなければ押されていることになるのじゃ。

助手:なるほど。そして、下方向をチェックするなら、PAD_INPUT_DOWNと、右方向をチェックするなら、PAD_INPUT_RIGHT、左方向ならPAD_INPUT_LEFTとAndを取ればいいわけですね。十字キー以外のボタンをチェックしたいならどうすればいいのですか?

おーちゃん:うむ。もちろん、それ用の定数もあるぞ。1ボタン(Zキー)ならPAD_INPUT_1、2ボタン(Xキー)ならPAD_INPUT_2を使えばいいのじゃ、いいのじゃ。その他のボタンについては、PAD_INPUT_〇を使えばよいぞ。(〇にはボタンの数字が入る)例えば、ボタン4を調べたければ、PAD_INPUT_4を使えばいいのじゃ。

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

おーちゃん:どうしたのじゃ?

助手:移動させ続けると、画面の端を超えて移動して見えなくなるんですよ。画面の端にいくとそこで止まるようにできないんですか?

おーちゃん:うむ。そこは、DXライブラリの話ではなく、普通のプログラミングの話になるのじゃが……例えば、画面の右端、左端で止まるようにすれば、次のようにすればよいのじゃ、よいのじゃ。

----------
If x < 0 Then
x = 0
End If

If x + 64 > 640 Then
x = 640 - 64
End If
----------

おーちゃん:最初のIf文は簡単じゃな。画面左端のX座標は0なので、キャラクターの左端が0(画面の左端)より小さくなったら、強制的にキャラクターの左端を表す変数Xを0にしているのじゃ。

助手:なるほど。それで、次のIfは?

おーちゃん:うむ。この画像のサイズは64(ピクセル)x64(ピクセル)じゃ。なので、キャラクターの右端はx+64となるのじゃ。それが、画面の右端(640)より大きくなったら、その画面の右端である640から、キャラクターの幅である64を引いた位置に、設定しているというわけじゃ。DrawGraphで指定するのは、画面の左上の座標じゃからな。上下の場合も、これを応用すればよい。

助手:わかりました。でも、これだと色々なサイズのキャラがあるとき困りますよね。それに、シューティングのように、640ピクセルx480ピクセルではない画面サイズの場合もありますよね。そうした時はどうすれば?

おーちゃん:ふむ。じゃが、それについてはちょっと宿題にしておこう、しておこう。宿題のヒントとして、この関数を教えておくぞ、教えておくぞ。

----------
GetGraphSize([ハンドル], [幅を格納する変数], [高さを格納する変数])
----------

おーちゃん:これを実行すると、指定したハンドルのサイズを、これまた指定した変数に格納してくれるのじゃ、くれるのじゃ。例えば

----------
GetGraphSize(hnd, w, h)
----------

おーちゃん:とやると、変数hndに格納されたハンドルの画像の幅が変数w、高さが変数hに格納されるのじゃ。

助手:ふむふむ。

おーちゃん:これをさっきの話の内容と組み合わせて考えてみるのじゃ、みるのじゃ。

助手:わかりました、考えてみます。

おーちゃん:うむ。次回は……

博士:うわー、待ったおーちゃんっ。それ以上わしの仕事取らないでくれいっ。
こほん、次回はいよいよ最終回。この問題の答え合わせと、音声を流す方法、そして、文字列を表示させる方法を説明していくぞ。さらばじゃ!



※次の更新は、9月24日。『URAURA Game Reivew』の予定です。お楽しみに!
posted by 裏編 at 14:21| Comment(2) | VB.NETでDirectX | 更新情報をチェックする
この記事へのコメント
VB.net、DirectXでゲーム開発ができるかさがしていました。
参考にします。cocos2dみたいにゲーム開発できるのかなと思ってます。
Posted by maseda at 2018年11月11日 16:10
コメントありがとうございます!
はい、できますよ!
自分も、VB.NET+DXライブラリでいくつかゲーム作りましたし。

>masedaさん
>
>VB.net、DirectXでゲーム開発ができるかさがしていました。
>参考にします。cocos2dみたいにゲーム開発できるのかなと思ってます。
>
Posted by 裏編 at 2018年11月11日 16:26