2018年10月08日

VB.NETでDirectX~第5回・文字を表示して、音を鳴らそう!

博士:ぐぅぐぅ……

助手:あ。博士、また寝ちゃってる。仕方ないなぁ。

博士:すやすや……。

助手:博士、起きてくださーい。起きてくれないと、おーちゃんに……

博士:ぐぅぐぅ……ぜ……

助手:?

博士:すやすや……前回は、確か、色々なサイズのキャラがあるときはどうするか、また、画面のサイズが640x480以外だったらどうすればよいか、だったのう。

助手:寝言で講義してる……。

博士:一つ目の疑問は、前回話したGetGraphSize関数を使って、画像のサイズを変数に格納して、それを使えばよいのじゃ。こんな風にのう……ぐぅぐぅ……。

----------
Dim pad As Integer
''ここから新しく追加した部分です
Dim wid As Integer
Dim hei As Integer
''ここまで

……(中略)……

hChara = LoadGraph("chara.bmp")
''ここから新しく追加した部分です
GetGraphSize(hChara, wid, hei)
''ここまで

……(中略)……
If x < 0 Then
  x = 0
End If

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

If y < 0 Then
  y = 0
End If

If y + hei > 480 Then
  y = 480 - hei
End If
----------

博士:ぐーぐー……原理は前回教えたものと同じじゃ。横座標の入った変数Xに、幅の入った変数widを足したもの。つまり、画像の右端の座標が、画面の端である640を超えていたなら、その640から幅を引いた座標を代入して、位置を補正しているのじゃ……。

助手:なるほど。それで二つ目の疑問は?

博士:うむ、それは簡単。画面の左の位置、画面の上の位置、そして幅と高さを定数にしてもっておき、それを0や640の代わりに使えばよい……。それらを全て入れたプログラムリストはこうなるぞ。すやすや……。

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

Const SCREEN_LEFT = 0
Const SCREEN_TOP = 0
Const SCREEN_WIDTH = 640
Const SCREEN_HEIGHT = 480

Sub Main()
  Dim pad As Integer
  Dim wid, hei As Integer

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

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

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

  hChara = LoadGraph("baroon.bmp")
  GetGraphSize(hChara, wid, hei)

  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

    If x < SCREEN_LEFT Then
      x = SCREEN_LEFT
    End If

    If x + wid > SCREEN_LEFT + SCREEN_WIDTH Then
      x = SCREEN_LEFT + SCREEN_WIDTH - wid
    End If

    If y < SCREEN_TOP Then
      y = SCREEN_TOP
    End If

    If y + hei > SCREEN_TOP + SCREEN_HEIGHT Then
      y = SCREEN_TOP + SCREEN_HEIGHT - hei
    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

  DxLib_End()
End Sub
----------

博士:これを、Module Module1からEnd Moduleの間に書けば動くぞ。そしてもう一つ。おーちゃん、よろしく。すやすや……

おーちゃん:うむ。実は前回のプログラムリスト、最後にDxLib_End()が入っていなかったのじゃ。ごめんなさい、ごめんなさい。

博士:うむ、おーちゃん、ありがとう。すやすや……。

助手:おーちゃんに謝らせてる……。



[DrawString命令じゃ!]

博士:ぐぅぐぅ……さて次は、文字を表示させる命令について教えるとするぞ。DrawString関数じゃ……。

助手:DrawString関数、ですか。

博士:うむ。DrawString関数はこのように使うのじゃ、すやすや……。

----------
DrawString(X座標, Y座標, 表示させる文字列, 色)
----------

助手:なるほど。それで博士。色はどのように指定するのですか?

博士:うむ。それには、GetColor関数を使うのじゃ。これは、引数からその色の数値を導き出して、返してくれるという便利な関数じゃ。ぐぅぐぅ……。

----------
GetColor(赤の明るさ, 緑の明るさ, 青の明るさ)
----------

助手:なるほど。この関数を、色のところの引数に当てはめればいいわけですね。

博士:その通りじゃ。すやすや……。例えば、白で、Helloと表示させるには、こうすればよいのじゃ……。

----------
DrawString(100, 100, "Hello", GetColor(255, 255, 255))
----------

博士:なお、このように直接入れるのではなく、変数に関数の値を代入してから、それを使ってもOKじゃ。なお、GetColor関数によって返ってくるのはLong型の値なので気を付けるように……。

----------
Dim col As Long

col = GetColor(255, 255, 255)

DrawString(100, 100, "Hello", col)
----------

博士:なお、このほかにも文字を表示させる関数にはいろいろあるが、それは省略しておくぞ。ぐぅぐぅ……。



[音を鳴らすには、LoadSoundMem関数と、PlaySoundMem関数じゃ!]

博士:うぅ、さすがにもう限界じゃ……おーちゃん、後は頼む……ばたっ。

助手:……。

おーちゃん:うむ、おーちゃんじゃ、おーちゃんじゃ。さて、音を鳴らす方法じゃが、これも画像を表示させるものと同じようなものじゃ。

助手:つまり、メモリに読み込んで、ハンドルを指定して鳴らす、ということですか?

おーちゃん:うむ、その通りじゃ。まず、メモリに読み込む方法じゃが、それにはLoadSoundMem関数を使う。使い方はこうじゃ、こうじゃ。

----------
LoadSoundMem(音声ファイルのパス)

例:LoadSoundMem("sample.mp3")
----------

助手:どの形式の音声でも読み込めるんでしょうか?

おーちゃん:うむ。WAV, MP3, Ogg, Opusの四種類が、読み込み、再生可能じゃ、可能じゃ。さて、再生には、PlaySoundMem関数を使うぞ。

----------
PlaySoundMem(ハンドル, 演奏方法, 最初から鳴らすかどうか)
----------

おーちゃん:まず最初の引数には、鳴らしたい音声のハンドルを指定する。これはわかるな、わかるな?

助手:はい。次の演奏方法は?

おーちゃん:これは、どのように鳴らすかを指定するものじゃ。次の三種類から選べるぞ、選べるぞ。

DX_PLAYTYPE_NORMAL→普通に再生する(再生している間はプログラムの流れが止まる)
DX_PLAYTYPE_BACK→バックグラウンドで再生する(再生していても、プログラムの流れは止まらない)
DX_PLAYTYPE_LOOP→バックグラウンドで再生&ループ再生

おーちゃん:一番目のDX_PLAYTYPE_NORMALは使うと再生が終わるまで、処理が止まってしまう、という難点があるので、たいていは二番目と三番目を使うことが多いじゃろう、多いじゃろう。ゲームを作る場合には特にな。
DX_PLAYTYPE_BACKは効果音を鳴らすときに、DX_PLAYTYPE_LOOPはBGMを演奏するときに使うとよいじゃろう。

助手:はい、わかりました、おーちゃん。

おーちゃん:そして最後の引数じゃが、これに1を指定すると、曲の頭から演奏する。0を指定すると、前回演奏したところから演奏するのじゃ、するのじゃ。

助手:なるほど。

おーちゃん:さて、この講義もここまで。これまで教えた内容をうまく使えば、ゲームを作ることも不可能ではないじゃろう。後はみんなの努力しだいじゃ。さらば!

助手:終わりましたか……でも、これ、どうしようかな……。

博士:ぐぅぐぅ……。

助手:あ、そうだ。

……
………
…………

博士:な、なんで段ボールに入って、海の真ん中に浮かんでおるのじゃ!? 誰か助けてくれーい!!



~完~



※次の更新は、10月11日、『師匠TのチャレンジARSゲーム!』の予定です。お楽しみに!
posted by 裏編 at 17:58| VB.NETでDirectX | 更新情報をチェックする