
本BlogはExcelでスマホゲーム「ドラクエウォーク」の最適こころセットをシミュレーションできる「エクドラ!」を公開しているのですが、最近なぜか「ドラクエ エクセル ダウンロード」で検索して来訪される方が増えました。ひょっとして・・・これは心当たりがあります。たかぶんさんがYouTubeで公開されているExcel版ドラクエである「ドラエク」、開発手法などを解説された最新の動画を公開され、瞬く間に再生回数が数万を超えているのですが、ちょうどその時期と重なるのです。おそらく、たかぶんさんの「ドラエク」動画をご覧になった方が、実際にプレイしたい、ダウンロードしたいとお考えになり、同キーワードGoogle検索の1位に表示される当Blogにお越しくださったのではないか。だとしたら、エクセル版ドラクエとは無関係の当Blogに落胆し、意気消沈されてブラウザタグの閉じるボタンを押しておられるのではないか、と、申し訳ない気持ちで居ても立っても居られなくなりました。
Excelでゲーム、それもセルドット方式でドラクエ! かくいう私も、その昔、セルドット方式で作成したインベーダーやパックマンを公開したり、Excelゲーム作成の解説書籍を執筆するなど、Excelゲーム作成は嫌いではありません。いや大好きです。というか愛しています。このまま当ブログに来訪下さった方を手ぶらで帰してしまうのは忍びません。
ということで、ドラクエ4をモチーフにExcelワークブックを作成しましたので公開します。実装しているのは、移動、当たり判定、BGM、一部の効果音、コマンドウインドウの開閉のみ、バトランド城を歩き回るだけという、まったくゲームになっていなくて、すみませんっ。ライアンを操作いただき、王宮を歩き回る姿とソースコードをご覧いただくことで、こうやって動くんだという実感いただければ幸甚です。
例によってセルの背景色書き換えで全てを表現しているのですが、特長としては、スクロールがキャラ単位ではなく、半キャラ(8ドット)単位であること、キャラクターと背景を疑似スプライト機能により重ね合わせ処理していることくらいでしょうか。せめて会話ぐらいできるようにしたいと考えていたのものの、いつになるかわからないので、こんな中途半端なワークブックで申し訳ないのですが、ダウンロードいただけるようにした次第です。
メインプロシージャは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
Sub Main() 'Mapパターン取得 Dim arrMap, arrMove Sheets("MapPtn").Select arrMap = Range(Cells(1, 1), Cells(50, 47)) arrMove = Range(Cells(1, 48), Cells(7, 48)) Sheets("Top").Select Dim SoundPath As String SoundPath = ThisWorkbook.Path & "\sound\" Call PlayBGM(SoundPath & "shiro.mp3") Dim TC As Long Dim X As Long, Y As Long X = 24 Y = 28 'スプライト取得 Dim r As Long, c As Long, n As Long, i As Long Dim ArrColor() Dim arrData11, arrData12, arrData21, arrData22 Dim arrData31, arrData32, arrData41, arrData42 With Worksheets("Chara") arrData11 = .Range("Q1:AF16").Offset(0 * 16, 0) arrData12 = .Range("Q1:AF16").Offset(1 * 16, 0) arrData21 = .Range("Q1:AF16").Offset(2 * 16, 0) arrData22 = .Range("Q1:AF16").Offset(3 * 16, 0) arrData31 = .Range("Q1:AF16").Offset(4 * 16, 0) arrData32 = .Range("Q1:AF16").Offset(5 * 16, 0) arrData41 = .Range("Q1:AF16").Offset(6 * 16, 0) arrData42 = .Range("Q1:AF16").Offset(7 * 16, 0) End With Dim Muki As Long, Ptn As Long Set GamenRange = Worksheets("BG").Range("I9:IV232").Offset((Y - 8) * 16, (X - 9) * 16) Dim RngCmd As Range Set RngCmd = Worksheets("Window").Range("A1:CR16") '最初の描画 Set GamenRange = GamenRange GamenRange.Copy Destination:=Worksheets("BGBuf").Range("I1:IV224") Sheets("BGBuf").Range("DY101:EN116") = arrData42 Worksheets("BGBuf").Range("I1:IV224").Copy Destination:=Worksheets("Top").Range("I1:IV224") Dim KeyUD As Long, KeyLR As Long Dim MoveF As Boolean Dim RngMe As Range Set RngMe = Sheets("BGBuf").Range("DY101:EN116") Do 'キー入力の取得 If GetAsyncKeyState(VK_LEFT) <> 0 Then '左 KeyUD = 0: KeyLR = -1: Muki = 2 ElseIf GetAsyncKeyState(VK_RIGHT) <> 0 Then '右 KeyUD = 0: KeyLR = 1: Muki = 3 ElseIf GetAsyncKeyState(VK_UP) <> 0 Then '上 KeyUD = -1: KeyLR = 0: Muki = 4 ElseIf GetAsyncKeyState(VK_DOWN) <> 0 Then '下 KeyUD = 1: KeyLR = 0: Muki = 1 Else KeyUD = 0: KeyLR = 0: Muki = 0 End If If KeyUD <> 0 Or KeyLR <> 0 Then TC = TC + 1 'Call Scroll(KeyUD, KeyLR) If Ptn = 1 Then Ptn = 2 Else Ptn = 1 End If '移動先判定 MoveF = False For i = 1 To UBound(arrMove, 1) If arrMap(Y + KeyUD, X + KeyLR) = arrMove(i, 1) Then MoveF = True Exit For End If Next i '8ドット単位スクロール For i = 1 To 2 If MoveF Then If i = 1 Then Y = Y + KeyUD X = X + KeyLR End If Set GamenRange = GamenRange.Offset(KeyUD * 8, KeyLR * 8) GamenRange.Copy Destination:=Worksheets("BGBuf").Range("I1:IV224") Else If i = 1 Then Call mciSendString("play " & SoundPath & "kabe.mp3", "", 0, 0) End If End If Select Case Muki Case 1 If Ptn = 1 Then RngMe = arrData11 Else RngMe = arrData12 End If Case 2 If Ptn = 1 Then RngMe = arrData21 Else RngMe = arrData22 End If Case 3 If Ptn = 1 Then RngMe = arrData31 Else RngMe = arrData32 End If Case 4 If Ptn = 1 Then RngMe = arrData41 Else RngMe = arrData42 End If End Select Worksheets("BGBuf").Range("I1:IV224").Copy Destination:=Worksheets("Top").Range("I1:IV224") Next i End If 'Window判定 If GetAsyncKeyState(VK_X) <> 0 Then 'X Call mciSendString("play " & SoundPath & "pi.mp3", "", 0, 0) For i = 0 To 4 RngCmd.Offset(i * 16, 0).Copy Destination:=Worksheets("Top").Range("AG9:DX24").Offset(i * 16, 0) Next i 'Windowモード突入 Do If GetAsyncKeyState(VK_Z) <> 0 Then 'Z For i = 4 To 0 Step -1 Worksheets("BGbuf").Range("AG9:DX24").Offset(i * 16, 0).Copy Destination:=Worksheets("Top").Range("AG9:DX24").Offset(i * 16, 0) Next i 'DoEvents Exit Do End If Sleep 1 Loop End If 'DoEvents Loop End Sub |
初期設定
- 地図パターンと移動可能範囲を
MapPtn
シートから取得し、配列に格納します。 - 背景音楽を再生するための準備をし、
shiro.mp3
を再生します。 - キャラクターの初期位置を設定します。
スプライト取得
Chara
シートからキャラクターのスプライトに関するデータを取得し、複数の配列に格納します。これらのデータはキャラクターの向きやアニメーションパターンに対応しています。
ゲーム画面の準備
BG
シートの特定範囲を基にゲーム画面の範囲を設定し、その範囲をBGBuf
シートにコピーします。これにより、バッファとして機能する背景を準備します。- キャラクターの初期スプライトを
BGBuf
に配置し、その後Top
シートにコピーして、ユーザーに見えるゲーム画面を更新します。
キー入力と移動の処理
Do
ループを使用して、キー入力を無限に監視します。特定のキーが押された場合、キャラクターの向き(Muki
)と移動する方向を決定します。- キャラクターの移動可否を判定し、移動が可能な場合はキャラクターの位置を更新します。
- キャラクターの新しい位置に基づいて
BGBuf
シートの背景表示を更新します。さらに、二次元配列に格納されたキャラクターの色情報を、条件付き書式が設定されたキャラクター範囲に入力します。これにより、キャラクターのグラフィックが背景上に重ね合わせられ、「疑似スプライト」として表示されます。それをTop
シートにコピーして画面をリフレッシュします。 - 移動が不可能な場合(壁などに衝突した場合)、衝突音
kabe.mp3
を再生します。
コマンドウィンドウモードの処理
X
キーを押すことで、コマンドウィンドウモードに入ります。このモードでは、Window
シートからコマンドウィンドウを表示し、Z
キーでウィンドウモードを終了します。
さて、この先、ゲームとして成立するよう開発を続けるなら、
・キャラクターとの会話
・マップの移動(階段、屋外)
・各コマンドに対応した処理
を実装して、次は城下町、さらにはフィールド、そして戦闘やイベント処理・・・・果てしなく長い道のりになりそうで気が遠くなります。実際にプレイでできる、ドラクエ1、ドラクエ2のExcel版を完成させた、たかぶんさん、その苦労たるやいかほどか、いやはや尊敬します!(たかぶんさんの「ドラエク」YouTube動画はこちら ぜひご覧ください)
この動画で利用している株式会社スクウェア・エニックスを代表とする共同著作者が権利を所有する著作物及びスギヤマ工房有限会社が権利を所有する楽曲の転載・配布は禁止いたします。
© 1990 ARMOR PROJECT/BIRD STUDIO/SPIKE CHUNSOFT/SQUARE ENIX All Rights Reserved.
© SUGIYAMA KOBO
コメント
[…] 【期間限定リンク】Excelで動作するドラクエ4(王宮散歩)ワークブックのダウンロードはこちらからどうぞ […]