これまで色々なマイコンでLVGLを動かしてきて、高機能なのに動作が軽くメモリ使用率も高くないのでゲーム作成に使えるんじゃないかと思うようになりました。LVGLのウィジェットはイベントドリブンなのでアクションゲームよりはシミュレーションやテーブルゲームといった分野に使うと良さそうです。そこで宝石を消していくパズルゲームを作ってみました。
隣り合う2つの宝石を入れ替えて、縦か横に同じ色の宝石を3つ以上並べて消していくおなじみのパズルです。タッチパネルで遊ぶのに適したゲームですね。
ゲーム作成対象のマイコンはM5Core2・M5StampS3・ESP32-WROOM-32E・Raspberry Pi 2・Raspberry Pi 3で、マイコンを持っていなくても動作確認できるようにWindows64ビット版も作成しました。LVGL利用の恩恵でゲームのメイン部分はぼぼ変更することなく全機種共通で使うことが出来ました。
LVGLとは関係ありませんがM5StampS3以外は効果音付きです。
開発環境がPlatformIOやVisual Studio 2022やGNU Toolchainで、OSもWindowsやUbuntuと様々なのでバイナリのみ提供します。
ダウンロードはこちらから。pixivの無料アカウントがあれば「無料ダウンロード」ボタンを押すとすぐにダウンロードが始まります。
ダウンロードしたファイルを解凍すると各機種向けのフォルダにバイナリが入っています。それぞれの使い方は以下のようになります。
●M5Core2
解凍したファイルの中のCore2フォルダにバイナリが入っています。このバイナリの書き込みにはesptoolが必要です。下記のespressifのサイトからダウンロードしてください。
https://github.com/espressif/esptool/releases
以下はWindows環境での手順です。それ以外のOSの場合は適宜読み替えて作業してください。
M5Core2をPCにUSB接続します。Core2フォルダにあるWriteFlash.batをテキストエディタで開き、com0 の記述を実際にM5Core2がつながっているcomポートの番号に変更してセーブします。
espressifのサイトからダウンロードしたexptool.exeをCore2フォルダにコピーします。WriteFlash.batをマウスでダブルクリックして実行するとバイナリファイルが書き込まれゲーム画面が表示されます。画面の「スタート」ボタンを押すとゲーム開始です。
Core2はタッチパネルが小さく操作しにくいのですが、指先で軽く触れる感じてタッチすると反応が良い気がします。
●M5StampS3
ゲームで遊ぶにはILI9341タッチパネル付きTFT液晶が必要です。配線は以下のようにしてください。
解凍したファイルの中のStampS3フォルダにバイナリが入っています。このバイナリの書き込みにはesptoolが必要です。下記のespressifのサイトからダウンロードしてください。
https://github.com/espressif/esptool/releases
以下はWindows環境での手順です。それ以外のOSの場合は適宜読み替えて作業してください。
M5StampS3をPCにUSB接続します。StampS3フォルダにあるWriteFlash.batをテキストエディタで開き、com0 の記述を実際にM5StampS3がつながっているcomポートの番号に変更してセーブします。
espressifのサイトからダウンロードしたexptool.exeをStampS3フォルダにコピーします。WriteFlash.batをマウスでダブルクリックして実行するとバイナリファイルが書き込まれタッチパネルのキャリブレーション画面になります。
画面の指示に従ってキャリブレーションを行った後にゲーム画面が表示されます。画面の「スタート」ボタンを押すとゲーム開始です。
●ESP32-WROOM-32E
ゲームで遊ぶにはILI9341タッチパネル付きTFT液晶が必要です。配線は以下のようにしてください。
25ピンにスピーカーをつなぐとサウンドが出力されます。
ただし、ESP32内蔵のDACは無音の時にピーという周期性のノイズが出力されるという現象が発生します。ピー音をごまかすために一定のデータを出力し続けてホワイトノイズにする手法もあるようですが、結局ノイズは消えないのでそのままにしています。気になる場合スピーカーは外してください。
解凍したファイルの中のESP32-WROOM-32Eフォルダにバイナリが入っています。このバイナリの書き込みにはesptoolが必要です。下記のespressifのサイトからダウンロードしてください。
https://github.com/espressif/esptool/releases
以下はWindows環境での手順です。それ以外のOSの場合は適宜読み替えて作業してください。
WROOM-32EをPCにUSB接続します。ESP32-WROOM-32EフォルダにあるWriteFlash.batをテキストエディタで開き、com0 の記述を実際にWROOM-32Eがつながっているcomポートの番号に変更してセーブします。
espressifのサイトからダウンロードしたexptool.exeをESP32-WROOM-32Eフォルダにコピーします。
WROOM-32Eのボタンを操作して書き込み可能な状態にしてから、WriteFlash.batをマウスでダブルクリックして実行するとバイナリファイルが書き込まれます。書き込み終了後、WROOM-32Eのリセットボタンを押すとタッチパネルのキャリブレーション画面になります。
画面の指示に従ってキャリブレーションを行った後にゲーム画面が表示されます。画面の「スタート」ボタンを押すとゲーム開始です。
●RaspberryPi2
Raspberry Pi ではタッチパネルではなくマウスで操作します。解凍したファイルの中のRaspberry Pi 2 Model Bフォルダにバイナリが入っています。3つファイルがありますが、これらすべてをFAT32フォーマットされたSDカードに書き込みます。Raspberry Pi にこのSDカードを差し込み、マウスとHDMIモニターをつないで電源を入れればゲーム画面が表示されます。
最初の画面ではプログラムの都合上、「スタート」ボタンを押さなくてもマウスを左クリックするだけでゲームが開始されます。
マウスが無線マウスの場合、起動時に認識されず使えないことがあります。画面中央にマウスカーソルが表示されていないときは認識できていません。この場合、再度電源を入れなおすか別のマウスをつなげてみてください。幾つかのマウスで試してみたところ認識できる無線マウスと出来ない無線マウスがありました。
●RaspberryPi3
Raspberry Pi ではタッチパネルではなくマウスで操作します。解凍したファイルの中のRaspberry Pi 3 Model Bフォルダにバイナリが入っています。3つファイルがありますが、これらすべてをFAT32フォーマットされたSDカードに書き込みます。
Raspberry Pi にこのSDカードを差し込み、マウスとHDMIモニターをつないで電源を入れればゲームが起動します。
最初の画面ではプログラムの都合上、「スタート」ボタンを押さなくてもマウスを左クリックするだけでゲーム画面が表示されます。
マウスが無線マウスの場合、起動時に認識されず使えないことがあります。画面中央にマウスカーソルが表示されていないときは認識できていません。この場合、再度電源を入れなおすか別のマウスをつなげてみてください。幾つかのマウスで試してみたところ認識できる無線マウスと出来ない無線マウスがありました。
●Windows
解凍したファイルの中のWindows x64フォルダにバイナリが入っています。houseki.exeをダブルクリックしてゲームを起動してください。
ゲームのルールについて説明します。
ゲーム開始時には画面が宝石で埋め尽くされています。この宝石を縦・横おなじ色3つ以上並べると消すことが出来ます。そのために隣り合った2つの宝石を入れ替えて3つ以上の宝石の並びを作っていきます。どれか宝石をタッチすると白い枠が表示されますので、その宝石と縦か横に隣り合っている宝石をタッチして入れ替えます。
ただし、入れ替えて消せる宝石が無ければ宝石はもとの位置のままで動きません。選択は解除され白い枠が消えます。また隣り合っていない宝石を選んでも選択が解除されます。
宝石を消すと上から新しい宝石が落ちてきます。このとき偶然3つ以上の宝石が並んだら連鎖的に消えていきます。
ゲームには9つのレベルがあり、ゲーム内で設定されている数(秘密です)の一定パーセントの宝石を消すとレベルクリアです。レベルが上がると宝石の種類も増え消していくのがより難しくなります。各レベルのクリア条件は以下のようになっています。
レベル1 宝石5種類 70%消去でクリア
レベル2 宝石5種類 80%消去でクリア
レベル3 宝石5種類 90%消去でクリア
レベル4 宝石6種類 70%消去でクリア
レベル5 宝石6種類 80%消去でクリア
レベル6 宝石6種類 90%消去でクリア
レベル7 宝石7種類 70%消去でクリア
レベル8 宝石7種類 80%消去でクリア
レベル9 宝石7種類 90%消去でクリア
ゲーム開始時にクリアに必要なパーセントが表示されます。また、クリアに近づくと現在消去した宝石のパーセントが表示されます。
消せる宝石がなくなった時点でゲームオーバーです。レベル1からゲームが再開されます。ゲームを終了するときはいきなり電源を切ってしまってかまいません。
今回ILI9341の表示とタッチパネルXPT2046の操作にはLovyanGFXを使いました。以前はISP-IDFでLVGLを使用しましたが、この時使用したドライバは少し古いバージョンのLVGLで動作する物だったので最新のLVGLでは修正が必要でした。どうせ修正するならISP-IDFではなくお手軽なArduinoフレームワークで使えるようにしようと思いLovyanGFXを利用しました。
LVGL+LovyanGFXについては、またあとで紹介したいと思います。
※コメント投稿者のブログIDはブログ作成者のみに通知されます