2019年01月14日

ActiveBasicとDXライブラリでゲームプログラミング!~第3回・キー入力、ジョイパッド入力を使ってみよう!

n88_reon.gif
玲音:あけましておめでとうございます! B-Maga編集部の紅一点、玲音です! 今月も、ActiveBasicとDXライブラリを使ったプログラミングを勉強していきましょう!

n88_kaede.gif
楓:玲音先輩に、この講座に引きずり込まれちゃった楓です! あけましておめでとうございます!

n88_reon.gif
だから、引きずり込んだなんて、人聞き悪いなぁ。

n88_kaede.gif
えへへ。それで先輩。今月は何をするんですか?

n88_reon.gif
うん。今月は、IF文を使った移動の制御と、そして、キー入力でキャラクタを動かす方法について説明していくよ。

n88_kaede.gif
はーい!



~こたえあわせ~
n88_reon.gif
さてさて。これが問題のプログラムだったね。

=-=-=-=-=-=-=-=-=-=-
#include "Dxlib.sbp"

Dim haikei As Long
Dim chara As Long
Dim x As Long
Dim y As Long

''初期処理
dxChangeWindowMode(1)
dxDxLib_Init()
dxSetDrawScreen(DX_SCREEN_BACK)

''背景を読み込む
haikei = dxLoadGraph("haikei.bmp")
''ニコニコを読み込む
chara = dxLoadGraph("niko.bmp")

x = 100
y = 70

Do
  ''画面をクリア
  dxClearDrawScreen()

  ''何等かの処理
  dxDrawGraph(0, 0, haikei, 1)
  dxDrawGraph(x, y, chara, 1)

  x = x + 4

  ''画面に反映
  dxScreenFlip()
  ''メッセージ処理
  If dxProcessMessage() = -1 Then
    Exit Do
  End If
Loop

''後処理
dxDxLib_End()
End
=-=-=-=-=-=-=-=-=-=-



n88_kaede.gif
これを実行すると、ニコニコが右に移動していくけど、画面の端にぶつかっても止まらないので、それをどうするか、って話でしたよね。

n88_reon.gif
そうだね。その答えなんだけど、言葉にすると簡単。『画面の端にぶつかったら止まる』ようにすればいいんだよ。

n88_kaede.gif
画面の端にぶつかったら、止まる、ですか……。あ! ここであの命令が出てくるんじゃないですか?

n88_reon.gif
おっ、楓ちゃんもピンときたみたいだね。さぁ、その命令は?

n88_kaede.gif
IF命令ですっ!

n88_reon.gif
正解! その通り。IF文で、画面の端にぶつかったかどうかチェックして、そしてぶつかっていたら動きを止めればいいんだよ。

n88_kaede.gif
なるほどっ。まず、画面の端にぶつかったかどうか、ですけど、それはどうしたらいいんですか?

n88_reon.gif
この場合は、キャラクタが画面の右端を表す640を超えたかどうかでチェックするのがいいと思うよ。かといって、そのまま

=-=-=-=-=-=-=-=-=-=-
X >= 640
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
ってしてもダメだけどね。

n88_kaede.gif
どうしてです?

n88_reon.gif
思い出してみて。座標に使っている変数XとYはキャラクターの左上の位置だったじゃない? だから、上のようにすると、結局キャラは左端を超えちゃうんだよ。

abdx1901-01.jpg

n88_kaede.gif
あっ、なるほどっ。ということは、Xにニコニコの幅を足した値が、640以上かどうかを判定すればいいんですねっ。

n88_reon.gif
うん、その通り。次にニコニコの動きをどう止めるかだけど、これは簡単。640-ニコニコの幅をXに入れればいいだけ。
ということで、それらを入れるとこうなりまーすっ。

=-=-=-=-=-=-=-=-=-=-
#include "Dxlib.sbp"

Dim haikei As Long
Dim chara As Long
Dim x As Long
Dim y As Long

''初期処理
dxChangeWindowMode(1)
dxDxLib_Init()
dxSetDrawScreen(DX_SCREEN_BACK)

''背景を読み込む
haikei = dxLoadGraph("haikei.bmp")
''ニコニコを読み込む
chara = dxLoadGraph("niko.bmp")

x = 100
y = 70

Do
  ''画面をクリア
  dxClearDrawScreen()

  ''何等かの処理
  dxDrawGraph(0, 0, haikei, 1)
  dxDrawGraph(x, y, chara, 1)

  x = x + 4
  If x + 100 > 640 Then
  x = 640 - 100
  End If

  ''画面に反映
  dxScreenFlip()
  ''メッセージ処理
  If dxProcessMessage() = -1 Then
    Exit Do
  End If
Loop

''後処理
dxDxLib_End()
End
=-=-=-=-=-=-=-=-=-=-



n88_kaede.gif
おー! ニコニコが画面の右端で止まりましたよ!

n88_reon.gif
これをちょっといじくるともっと面白いのができるよ。例えば、画面の端についたら、移動量を逆に(+4なら-4というように)するようにして、画面の左右を行ったりきたり、とか。興味があればやってみてね。

n88_kaede.gif
はーい!

n88_reon.gif
さてさて。それでは、ここからが本題だよ!

~キー入力しよう!~
n88_reon.gif
さて、キー入力だけど、それにはある関数を使うんだよ。その名も、dxGetJoypadInputState関数!

n88_kaede.gif
その関数って、どんな命令なんですか?

n88_reon.gif
うん。この関数は、ジョイパッドやカーソルキーなどを押すと、押したキーに対応した情報を返してくるんだよ。返ってきた情報から、あるキーが押されたかどうかをチェックするには、こうすればいいの。

=-=-=-=-=-=-=-=-=-=-
dxGetJoypadInputStateの戻り値 And キーの値
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
戻り値を変数に代入して、それを使うといいと思うよ。こんな風にね。

=-=-=-=-=-=-=-=-=-=-
k = dxGetJoypadInputState(DX_INPUT_KEY_PAD1)
If (k & @@@) <> 0 Then

End If
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
上の例にある通り、Andを取った結果が0でなければ押されたことになるの。

n88_kaede.gif
なるほど。それで先輩っ。例の中にある、DX_INPUT_KEY_PAD1ってなんなんですか?

n88_reon.gif
あぁ、それはどのジョイパッドをチェックするかを表したものだよ。DX_INPUT_KEY_PAD1なら、キーボードとジョイパッドの1番をチェックするの。ちなみにジョイパッドの2番なら、DX_INPUT_PAD2だよ。

n88_kaede.gif
なるほどー。

n88_reon.gif
それで、キーに対応した値だけど、代表的なものでは次の通り。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
DX_PAD_INPUT_DOWN……下、テンキーの2
DX_PAD_INPUT_LEFT……左、テンキーの4
DX_PAD_INPUT_RIGHT……右、テンキーの6
DX_PAD_INPUT_UP……上、テンキーの8
DX_PAD_INPUT_1……ボタン1、Zキー
DX_PAD_INPUT_2……ボタン2、Xキー
DX_PAD_INPUT_3……ボタン3、Cキー
DX_PAD_INPUT_9……ボタン9、ESCキー
DX_PAD_INPUT_10……ボタン10、スペースキー
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
これだけ覚えておけば、ゲーム作りで困ることはまずないと思うよ。後は、リファレンスを読んでね。

n88_kaede.gif
はーい。ということは、Xキーが押されたかどうかチェックするなら、

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
k = dxGetJoypadInputState(DX_INPUT_KEY_PAD1)

If (k And DX_PAD_INPUT_1) <> 0 Then

End If
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

n88_kaede.gif
とすれば、いいわけですねっ。

n88_reon.gif
うん、その通り。ではさっそく、これを使って、ニコニコを動かしてみよう!

n88_kaede.gif
はーい!

~ニコニコを動かそう!~
n88_reon.gif
さてさて、キー入力でニコニコを動かす考え方だけど、基本的な考えは次の通り。
・上が押されたら、上に動かす
・下が押されたら、下に動かす
・右が押されたら、右に動かす
・左が押されたら、左に動かす
これをプログラムにすればいいんだよ。

n88_kaede.gif
動かすには、位置を表す変数の値を変えてやればいいんですよね。

n88_reon.gif
画面の上や左の端についたかどうかもチェックする必要があるよね。画面の上端は0、左端も0、そして下端は480だよ。

abdx1901-02.jpg

n88_reon.gif
なお、上端や左端を超えたかどうかをチェックするさいには、普通に変数の値を比べればいいよ。

abdx1901-03.jpg

n88_reon.gif
それらを踏まえて、最初のプログラムを改造すると、こうなります。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#include "Dxlib.sbp"

Dim haikei As Long
Dim chara As Long
Dim x As Long
Dim y As Long
Dim k As Long

''初期処理
dxChangeWindowMode(1)
dxDxLib_Init()
dxSetDrawScreen(DX_SCREEN_BACK)

''背景を読み込む
haikei = dxLoadGraph("haikei.bmp")
''ニコニコを読み込む
chara = dxLoadGraph("niko.bmp")

x = 100
y = 70

Do
  ''画面をクリア
  dxClearDrawScreen()

  ''何等かの処理
  dxDrawGraph(0, 0, haikei, 1)
  dxDrawGraph(x, y, chara, 1)

  ''キー入力
  k = dxGetJoypadInputState(DX_INPUT_KEY_PAD1)

  If (k And DX_PAD_INPUT_UP) <> 0 Then
    ''上に動かす
    y = y - 4
  End If

  If (k And DX_PAD_INPUT_DOWN) <> 0 Then
    ''下に動かす
    y = y + 4
  End If

  If (k And DX_PAD_INPUT_LEFT) <> 0 Then
    ''左に動かす
    x = x - 4
  End If

  If (k And DX_PAD_INPUT_RIGHT) <> 0 Then
    ''右に動かす
    x = x + 4
  End If

  ''画面の端に出たかチェック
  ''上端
  If y < 0 Then
    y = 0
  End If

  ''下端
  If y + 100 > 480 Then
    y = 480 - 100
  End If

  ''左端
  If x < 0 Then
    x = 0
  End If

  ''右端
  If x + 100 > 640 Then
    x = 640 - 100
  End If

  ''画面に反映
  dxScreenFlip()
  ''メッセージ処理
  If dxProcessMessage() = -1 Then
    Exit Do
  End If
Loop

''後処理
dxDxLib_End()
End

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

n88_kaede.gif
おー! ニコニコがカーソルキーで動くようになりましたよ!

n88_reon.gif
これでゲームの基本部分は完成。来月からは、いよいよゲーム作りに進むよ。
次回はまず、ゲームを作るための骨組みの考え方について説明していきます。お楽しみに!



=-=-=-=-=-=-=-=-=-=-
※次の更新は、1月17日、『師匠TのチャレンジARSゲーム!』の予定です。お楽しみに!