今回は前回の予告通り、カーソルではなく自キャラを「@」に変更して移動させる事に挑戦します。
そんな大した事はしないです。指定したセルに文字を書き込んでやるだけです。
それでは行ってみましょう!
プレーヤーシンボルの「@」を表示する
プレーヤーを表示するということでまずはプレーヤークラスを作成します。
プロジェクトにクラスオブジェクトを追加します。
メンバー変数にPlayerの位置を示す「X」「Y」を宣言します。メンバー変数にクラス外部から勝手にアクセス出来ないようにPrivate変数にしておきます。
メンバー変数にアクセスするためにPropertyを用意します。
値を取得する
メンバー変数に値を設定する(値型)
メンバー変数に値を設定する(オブジェクト)
クラスはNEWされたタイミング(インスタンス作成時)は初期化メソッドClass_Initialize()が自動で呼ばれます。ここでメンバー変数の初期化などを行っておきます。今回は座標の初期値(1,1)を設定しています。
Option Explicit '' Playerクラス Private x As Integer '' 主人公の座標 X Private y As Integer '' 主人公の座標 Y '' プロパティ X Public Property Get posX() As Integer posX = x End Property Public Property Let posX(argX As Integer) x = argX End Property '' プロパティ Y Public Property Get posY() As Integer posY = y End Property Public Property Let posY(argY As Integer) y = argY End Property '' クラスの初期化 Private Sub Class_Initialize() '' 主人公の位置を初期化 posX = 1 posY = 1 End Sub
ゲーム開始ボタンを作って、そのクリックイベントに初期化をするようにします。これで下準備は完了です。
このボタンのクリックイベントでPlayaerクラスをNEWします。
いよいよPlayaerを表示します。
指定された行列にあるセルの情報を返却する(Rangeオブジェクト)
Rangeオブジェクトのプロパティ。Rangeが示すセルの値
このプロパティを組み合わせればセルに値を表示できます。
前回移動のクリックイベントを記載した、今回のマクロの核になるmodRogueに記載します。
Option Explicit '' プレーヤー Private myPlayer As Player '' =========== 移動のクリックイベントは省略 ''------------ '' ゲーム開始 ''------------ Sub Start_Click() '' 主人公の作成 Set myPlayer = New Player '' 主人公の表示 DisplayPlayer End Sub '' プレーヤーを表示する Sub DisplayPlayer() '' プレーヤーをPlayerクラスが保持する座標のセルに表示する Cells(myPlayer.posY, myPlayer.posX).Value = "@" End Sub
これで完成です。
動作を確認してみましょう。
無事、A1のセルに”@”が表示されました!
Playerを移動させよう!
無事表示されたので次は移動です。
基本的な処理の流れは次の通りになります。
- 今の位置から”@”を消す
- Playerを移動させる(ボタンに応じた移動量)
- 移動した場所に”@”を表示
この3つの処理になります。
前回はアクティブセルを移動する処理を記述しました。今回はそちらを改良します。すでに領域外に出ないような判定が入っているので、それを活かしながら改造します。
削除用のメソッドを作成する
今いるところからPlayerを削除するには、セルに空白を設定すればOKです。削除用のメソッドを用意しておきます。
Playerの移動はPlayerクラスに任せる
Playerの移動はPlayerクラスに任せます。具体的には移動用のメソッドをPlayerクラスに実装して、そのメソッドを呼び出すだけにします。
8方向+位置をステイさせる9の移動用メソッドを今回用意します。
- MoveUP()
- MoveUR()
- MoveRT()
- MoveDR()
- MoveDN()
- MoveDL()
- MoveLT()
- MoveUL()
- MoveST()
移動量などはPlayerの属性に応じてになるので、移動量も外部からしてしません(今回は1固定で作ります)。
これらを実装する事で”@”が縦横無尽に移動するようになりました!!
まとめの実装
最後に今回の実装を記述しておきます。
modRogue(標準モジュール)
Option Explicit '' プレーヤー Private myPlayer As Player ''------------ '' 上に移動 ''------------ Sub U_Click() If 1 < myPlayer.posY Then UnDisplayPlayer myPlayer.MoveUP DisplayPlayer End If End Sub ''------------ '' 右上に移動 ''------------ Sub UR_Click() If 1 < myPlayer.posY And myPlayer.posX < 10 Then UnDisplayPlayer myPlayer.MoveUR DisplayPlayer End If End Sub ''------------ '' 右に移動 ''------------ Sub R_Click() If myPlayer.posX < 10 Then UnDisplayPlayer myPlayer.MoveRT DisplayPlayer End If End Sub ''------------ '' 右下に移動 ''------------ Sub DR_Click() If myPlayer.posY < 10 And myPlayer.posX < 10 Then UnDisplayPlayer myPlayer.MoveDR DisplayPlayer End If End Sub ''------------ '' 下に移動 ''------------ Sub D_Click() If myPlayer.posY < 10 Then UnDisplayPlayer myPlayer.MoveDN DisplayPlayer End If End Sub ''------------ '' 左下に移動 ''------------ Sub LD_Click() If myPlayer.posY < 10 And 1 < myPlayer.posX Then UnDisplayPlayer myPlayer.MoveDL DisplayPlayer End If End Sub ''------------ '' 左に移動 ''------------ Sub L_Click() If 1 < myPlayer.posX Then UnDisplayPlayer myPlayer.MoveLT DisplayPlayer End If End Sub ''------------ '' 左上に移動 ''------------ Sub UL_Click() If 1 < myPlayer.posY And 1 < myPlayer.posX Then UnDisplayPlayer myPlayer.MoveUL DisplayPlayer End If End Sub ''------------ '' ゲーム開始 ''------------ Sub Start_Click() '' 主人公の作成 Set myPlayer = New Player '' 主人公の表示 DisplayPlayer End Sub ''---------------------- '' プレーヤーを表示する ''---------------------- Sub DisplayPlayer() Cells(myPlayer.posY, myPlayer.posX).Value = "@" End Sub ''---------------------- '' プレーヤーを消す ''---------------------- Sub UnDisplayPlayer() Cells(myPlayer.posY, myPlayer.posX).Value = "" End Sub
Player(クラス)
Option Explicit '' 主人公クラス Private x As Integer '' 主人公の座標 X Private y As Integer '' 主人公の座標 Y Private moveDist As Integer '' 移動量 '' プロパティ X Public Property Get posX() As Integer posX = x End Property Public Property Let posX(argX As Integer) x = argX End Property '' プロパティ Y Public Property Get posY() As Integer posY = y End Property Public Property Let posY(argY As Integer) y = argY End Property '' クラスの初期化 Private Sub Class_Initialize() '' 主人公の位置を初期化 posX = 1 posY = 1 '' 移動量を初期化 moveDist = 1 End Sub '' 上に移動 Public Sub MoveUP() posX = posX posY = posY - moveDist End Sub '' 右上 Public Sub MoveUR() posX = posX + moveDist posY = posY - moveDist End Sub '' 右 Public Sub MoveRT() posX = posX + moveDist posY = posY End Sub '' 右下 Public Sub MoveDR() posX = posX + moveDist posY = posY + moveDist End Sub '' 下 Public Sub MoveDN() posX = posX posY = posY + moveDist End Sub '' 左下 Public Sub MoveDL() posX = posX - moveDist posY = posY + moveDist End Sub '' 左 Public Sub MoveLT() posX = posX - moveDist posY = posY End Sub '' 左上 Public Sub MoveUL() posX = posX - moveDist posY = posY - moveDist End Sub '' ステイ Public Sub MoveST() posX = posX posY = posY End Sub
次回は敵キャラを表示して動かしてみたいと思います!
コメント