【VBAでRPGをつくる!4】主人公が画面内を移動する仕組み

  • URLをコピーしました!
目次

【VBAでRPGをつくる!4】主人公が画面内を移動する仕組み

ゲームでは、主人公や街の住人、敵といったさまざまなキャラクターが画面上を動き回ります。動き回る仕組みはとても簡単で、表示するごとに貼り付け先を連続して変えるだけです。

表示位置(座標)を管理する

ポイントは貼り付け先の場所、つまりキャラクターが画面上のどこにいるのかを、横軸(X軸)と縦軸(Y軸)の2つの座標で管理することです。

また座標を管理することで、キャラクター同士の接触を判定したり、キャラクターの可動範囲を管理したりといった、キャラクターの詳細な管理が可能となります。

接触の判定とは
2つの座標の差を利用して、キャラクター同士の接触を判定できます。
可動範囲とは
キャラクターが動く範囲を一定の範囲内におさえることです。画面内(表示範囲内)からはみ出さないようにする

表示位置を変更しながら、キャラクターが動く流れを確認します。

  • 最初にキャラクターを表示する
  • 次にX座標から1を引き、再度キャラクターを表示する
  • キャラクターが1セル分左に表示される
  • これを繰り返せば、どんどん左へ移動する
  • 上下に移動する場合は、Y座標を変更する。

実行速度の調整

高速コピー&ペーストを使うと、ドット絵の貼り付けが一瞬で行われます。そのため、キャラクターを移動する処理を全速力で実行すると、キャラクターが一瞬で画面の右から左へ走り去り、画面内を移動したという感触をつかめません。

そこで、Windows APIの「Sleep」機能を使い、ブログラムをわざと遅く実行させています。

Sleep関数

Sleep関数はVBAの関数ではなく、Windows APIの関数です。処理を止める時間をミリ秒(1秒の1000分の1)単位で指定することができます。以下のサンプルマクロで実際の機能を体感してください。

‘Windows APIのSleep関数を呼び出して使用するには、
マクロのエディターの一番上に以下のように記述する必要があります

Private Declare Sub Sleep Lib “kernel32” (ByVal ms As Long)

Sub Sleep関数の使い方()

 Dim time As Long
 time = 5000
 Sleep time
 MsgBox time & “ミリ秒後に表示しました”

End Sub

1秒は1,000ミリ秒なので、5,000ミリ秒は5秒です。 ミリ秒から秒に変換するときは、1,000で割ればいいです。

Sleep関数を使用して次のようなマクロでキャラクターを動かします。

Private Sub MoveCharacter()

 Dim lX As Long
 Dim lY As Long

 lX = 177
 lY = 81

 Do Until lX <= 17
  ‘X座標の右方向8マス分消去する
  Range(Cells(lY, lX + 8), Cells(lY + 15, lX + 15)).Interior.ColorIndex = xlNone
  lX = lX – 8
  objPattern.Copy Range(Cells(lY, lX), Cells(lY + 15, lX + 15))
  Call Sleep(30) Loop

End Sub

移動後の消去

コピー&ペーストを使ってキャラクターを表示する場合、移動を行うと軌跡(元の絵の一部、絵の残骸)が残ってしまう場合があります。キャラクターの移動は、単に連続して貼り付け先を変えているだけだからです。わざと軌跡を残す場合は問題ありませんが、そうでない限りは軌跡を消去しなくてはなりません。そうしないと、画面上がキャラクターの残骸で埋まってしまいます。

キャラクターの軌跡を消す方法

軌跡を消す方法は二つあります。一つは、、もう一つはです。どちらの方法が優れているということはないため、状況に合わせた消去方法を選択してください。

  • その都度消す方法
    ‘X座標の右方向8マス分消去する
    Range(Cells(lY, lX + 8), Cells(lY + 15, lX + 15)).Interior.ColorIndex = xlNone
  • キャラクターにあらかじめ消去用の部分(余白)を作成しておく方法
    下の図のようなイメージです
ドット絵の余白を利用する方法

次は、移動するキャラクターに動きをだすように、アニメーションさせてみましょう。

よかったらシェアしてね!
  • URLをコピーしました!
目次