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

ゲームでは、主人公や街の住人、敵といったさまざまなキャラクターが画面上を動き回ります。動き回る仕組みはとても簡単で、表示するごとに貼り付け先を連続して変えるだけです。
表示位置(座標)を管理する
ポイントは貼り付け先の場所、つまりキャラクターが画面上のどこにいるのかを、横軸(X軸)と縦軸(Y軸)の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 - キャラクターにあらかじめ消去用の部分(余白)を作成しておく方法
下の図のようなイメージです




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