はじめに
特に理由はありません。
なんとなく
「Excelでスロット作れそうじゃない?」
と思ってしまい、
気付いたら作っていました。
業務で使う予定はありません。
役にも立ちません。
でも、作っていて めちゃくちゃ楽しかった です。
できたもの
Excel VBA製の3リールスロット
●スタートボタン
●リールごとのストップボタン
●フォルダ内の画像をそのまま絵柄に使用
●スロットの台(フレーム)は常に最前面
●リールはその裏で回転
「それっぽく見える」ことを最優先にしています。
なぜExcelで?
別にExcelじゃなくてもいいです。
ゲームエンジンの方が正直ラクです。
でも、
●どのPCにもある
●図形と画像が使える
●VBAでループ・タイミング制御ができる
この条件が揃っていると、
変なことをしたくなるんですよね。
仕組み①:リールは実は画像2枚だけ
1リールにつき、動かしている画像は 2枚だけ です。
●表示中の画像
●上(または下)に待機している画像
下に流れ切ったら、
その画像を上に戻して 別の絵柄に差し替える。
If ReelY(r, 1) >= WIN_SIZE Then
ReelY(r, 1) = ReelY(r, 2) - WIN_SIZE
PicIndex(r, 1) = NextIdx(PicIndex(r, 2))
ResetReelPicture ws, r, 1, PicIndex(r, 1)
End If
これで、
●画像が何枚あっても
●軽く
●永遠に回り続ける
という、スロットっぽい挙動になります。
仕組み②:ストップは「跨いだ瞬間」に止める
ストップボタンを押した瞬間に止めると、
どうしても不自然になります。
なので、
●ストップ要求フラグを立てる
●表示ライン(Y=0)を 跨いだ瞬間 にピタッと止める
If StopReq(r) Then
If oldY1 < 0 And ReelY(r, 1) >= 0 Then
SnapStop ws, r
End If
End If
これだけで、
一気に「スロット感」が出ました。
仕組み③:一番大変だったのはZOrder
今回、いちばん苦労したのはここです。
●背景
●リール画像
●スロットの台(フレーム)
●ボタン
Excelは、
●画像を作り直す
●差し替える
だけで、前後関係(ZOrder)が簡単に壊れます。
なので、
どのマクロを実行しても必ず直す 方式にしました。
Private Sub FixZOrder(ByVal ws As Worksheet)
ws.Shapes("SlotPart_BG").ZOrder msoSendToBack
Dim s As Shape
For Each s In ws.Shapes
If Left$(s.Name, 13) = "SlotPart_Reel" Then
s.ZOrder msoBringToFront
End If
Next s
ws.Shapes("グループ 2627").ZOrder msoBringToFront
End Sub
●背景は常に最背面
●リールはその前
●スロット台は 常に最前面
毎フレームでも呼びます。
力技ですが、これが一番安定しました。
Excelでゲームっぽいものを作るなら、
ZOrder制御は避けて通れない地雷だと思います。
絵柄はフォルダの中身そのまま
/images フォルダに入っている
●png
●jpg
●jpeg
をすべて読み込んで使っています。
For Each f In fld.Files
Select Case LCase(fso.GetExtensionName(f.Name))
Case "png", "jpg", "jpeg"
ImageCount = ImageCount + 1
ImagePaths(ImageCount) = f.Path
End Select
Next f
画像を差し替えるだけで、
全く別のスロットになります。
作ってみて思ったこと
●Excel、意外と動く
●VBA、思ったより自由
●何より 作っていて楽しい
業務改善とか効率化とか関係なく、
「これ作ったら面白そう」
で手を動かすのは、
やっぱり大事だなと思いました。
おわりに
役に立つかどうかは分かりませんが、
自分はかなり楽しめました。
Excel、まだまだ遊べます。
実装全体のコードは GitHub に置いています。
VBA コードをそのまま置います。
