門前の小僧、Playdateの開発環境を調べる

投稿者: | 2021年8月1日

はじめに

本記事は「いのべこ 夏休みアドベントカレンダー 2021」の1日目の記事です。記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません(お約束)。

Playdateとは

Playdateは米国オレゴン州ポートランドを拠点とするソフトウェア会社であるPanicが開発中の、オリジナルの携帯型ゲーム機です。ハードウェア、ソフトウェアの両面で尖った特徴を持っています。

Playdate外観
(Media Kitより引用)

ハードウェア

搭載する液晶はシャープの2.7型HR-TFTメモリ液晶。バックライト無し&モノクロ1bit(2階調)400×240ドットと一見チープな液晶ですが、超高反射型液晶のため0.5ルクス程度の明るさでも画面が視認でき、消費電力も電子ペーパー並みに低いです。入力は十字キー・A/Bボタン・キャンセルボタンの他にクランク(回転式ハンドル)がついているのがアクセントになっています。というか、かわいい!!Wi-Fi、Bluetooth、加速度センサーも内蔵しており、携帯型ゲーム機として今どきの機能を持っています。ちなみに開発にはスウェーデンの電子楽器メーカーTeenage Engineeringが参加しており、キッチュなデザインを実現しています。

ソフトウェア

まず、ゲームソフトの流通方法が独特な「シーズン制」となっています。本体価格に「シーズン1」のゲームソフト24本の価格が含まれており、ゲームは週に1回、2本ずつ無料で配信されます。シーズン2以降は未定ですが、計画はあるようです。また、サイドローディングに標準対応していて、個人が開発したゲームをUSBポート経由でインストールすることが可能です。当然、SDKなどの開発環境も公開予定となっています。将来的にはアプリストアの開設もあるみたいですが、このあたりはまだまだ検討中のようです。

オープンな開発環境

で、上に書いた通り、SDKなどの開発環境は、Playdate本体発売後にNDA(秘密保持契約)とか必要なしに誰でもアクセスできるようになる予定です。MacOS/Windows/Linuxのいずれでも開発が可能とのことですが、どうもMacOSが最優先のようで、Windows/Linuxについてはサポートが若干劣るかもしれません。公式サイトによると下記が公開予定になっていますが、今のところは一部の先行開発者にのみ公開されています(実は先行開発者の抽選にエントリーしたのですが、外れました)。

  • Playdate SDK:Lua言語/C言語用のAPI、コードビルダ、Nova-extention(MacOSでの開発はPanic社のコードエディタであるNovaを利用しますが、これはNova上でPlaydate用ゲームをBuild & Runできるようにする拡張ファイル)、サンプルコード、フォントデータなどで構成されます。Lua言語での開発が基本となるはずですが、処理性能を必要とする場合はC言語を選択する必要があるでしょう。
  • Playdate Simulator:本体動作を完全にシミュレートするものの、性能は開発環境のマシンパワーに依存します。つまり1フレーム内の処理能力は実機よりも高いと思われます。よって、実際の操作性やレスポンスの確認には、実機が必須といえます。なお、Playdateのユーザーアカウント画面内にシミュレータの利用申請ボタンがあり、これには実機とのリンクが必要です。つまり、実機を持っていないとシミュレータの利用はできない模様です
  • Inside Playdate:Lua言語/C言語用の開発ドキュメントです。
  • Caps:ビットマップフォントエディタ。Playdateでは一般に利用されているアウトラインフォントは使えず、ビットマップフォントを使います。異なるフォントサイズが必要なら、それぞれフォントを作成する必要があります。また日本語サポートは2022年以降の予定なので、日本語フォントが使いたい場合は自作が必要です。
  • Pulp:ブラウザ上でPlaydate用ゲームを作成可能なツール「Pulp」の開発が進んでいます。今のところサウンドエディタ、キャラクターエディタ、シーンエディタなどの画像が公開されており、自由度がどこまであるかは不明なものの「誰でも自分で開発して、自分のPlaydateで遊べる」というコンセプトを強化する取り組みになっています。
  • Playdate Mirror:Playdate実機の画面をPCに転送して表示するツールです。画面の録画に使えますね。
Playdate PulpやCapsなどの開発ツール
(Playdate公式サイトより引用)

実機の入手方法

つい先日、2021年7月30日の午前2時(日本時間)より、公式サイトでの予約販売が開始されました。が、2021年中に出荷される初期ロットの2万台は20分ほどで完売、現在は2022年に出荷されるロットでの購入が可能です。価格は1台179ドルで、送料・関税・消費税が別にかかります。自分は無事に初期ロットを確保できたようで、今年の秋~冬には手に入りそうです。

購入履歴
(Late 2021が初期ロットの証)

githubで関連プロジェクトを探してみた

先行開発者に公開されているSDKについては当然ですがNDAが存在するようで、ネット上に情報が全くありません。唯一の例外は、Panic社公式YouTubeにある開発者向け動画だけ。そこで、githubで「playdate」タグを持つプロジェクトを探してみたところ幾つか見つかったので、ここで紹介することにします。

Lua言語+公式SDKでの開発

NobleRobot/NobleEngine

https://github.com/NobleRobot/NobleEngine

「A li’l game engine for Playdate」とある通り、Playdate用の小型ゲームエンジン。UnityやFlixel、Citrusと同様の、状態/シーンベースのゲームエンジンフレームワークで、拡張APIや新機能を備えています。Lua言語で作成されており、Lua言語版のPlaydate SDKに対応します。主な機能は以下の通りです。

  • シーンライフサイクル管理:シーンとはゲームのタイトル画面→オープニング→ゲーム本体→ゲームオーバーといった画面機能の単位のことで、画面表示に必要なマップやビットマップ、キャラクターデータなどを含みます。シーンごとに初期化ステップ、更新ループ、スプライト(キャラクター描画)、入力処理をプログラムでき、シーンからシーンへの移動もAPIでサポートされます。
  • シーントランジション:シーンをスムーズに切り替える画面効果のことで、例えば画面が一度黒画面にフェードアウトし、次のシーンがフェードインするといったものです。デフォルトで複数の切り替えタイプと呼び出し用APIが用意されています。
  • Settings / SaveGame API:ゲーム中の設定値やセーブデータをファイル管理するためのAPIで、最大1000件までサポートします。
  • スプライトマネージャー:画面上の任意の位置にキャラクターなどの絵を表示する「スプライト」で、複数パターンの絵を使ったアニメーションをサポートします。
  • 画面表示ライブラリ:テキスト表示のテンプレート、クランクの状態インジケーターやフレーム数(FPS)カウンターの表示機能などをサポートします。
  • ドキュメント:メソッド、アーキテクチャのドキュメントはソースコード内に記述され、LDocでドキュメント生成し、提供されます。
  • プロジェクトテンプレート:初心者がPlaydate開発を開始するのに役立つ、サンプルシーンとランチャー画面のAssetを含むサンプルコードです。(https://github.com/NobleRobot/NobleEngine-ProjectTemplate

Whitebrim/VSCode-PlaydateTemplate

https://github.com/Whitebrim/VSCode-PlaydateTemplate

Visual Studio Code(VSCode)上でPlaydate用ゲームの開発をするためのテンプレートや環境設定ファイルです。現在公開されている情報では、公式の開発環境はMacOS用コードエディタNovaを中心に構築されており、Windows/Linuxユーザ向けにはライブラリとコンパイラのみ提供される可能性が高いです。そこで、VSCode上での開発を支援するためテンプレートが公開されています。新しいプロジェクトを開く際に用意すべきmain.lua、pdxinfoといった初期ファイルのテンプレートの他、環境構築用のバッチファイルや設定ファイルも同梱されています。

なお、ドキュメントには一緒にインストールしたいVSCode拡張機能も挙げられているので、それも合わせて紹介します。

  • Lua:Lua言語による開発全般を支援する拡張機能。クラスや関数の宣言場所へのジャンプ、変数や関数の参照数表示、マウスホバーのヒント表示、エラー/ワーニング箇所の波線表示、IntelliSenseっぽい自動補完、関数やメソッドの引数ガイドや一覧表示、文法チェック、構文ハイライト、未定義変数の検出、EmmyLua互換のアノテーションなどを備える。
  • Lua Plus:Visual Studio Codeの標準のLua構文を改善する。変数と関数のスコープを修正、標準構文よりもTextMate言語の文法命名規則に厳密に従う。
  • Playdate:VSCodeでビルドした後に、Playdate Simulatorを起動するための拡張。これでMacOS同様のBuild & Runな環境が構築できそう。

Lua言語+2Dフレームワーク「LÖVE」での開発

オープンソースの2Dゲーム開発用フレームワーク「LÖVE」というものがあるのを、今回調べる中で初めて知りました。Windows/MacOS/Linuxで開発出来て、アプリはAndroidやiOSでも動作可能というもので、市販ゲームにも利用されているようです。Playdateとは直接関係はないものの、開発言語はPlaydateと同じLuaということで、「LÖVE」を使ってPlaydate用アプリの開発を支援するためのツールが公開されています。

cadin/love-playdate-emulation

https://github.com/cadin/love-playdate-emulation

Playdate同様の1bit/400×240ドットの画面(Canvas)をエミュレートする機能を持った、LÖVE用ゲームを開発するためのテンプレート&ライブラリです。画像を1bitカラーに変換するシェーダーを備えており、Playdate実機のような表示を再現できます。ここで開発可能なのはあくまでLÖVE用アプリであり、Playdate実機で動作するアプリを開発できるわけではありません。ですが、開発言語が共通なので、ここで開発したアプリをPlaydate用にコンバートすることは不可能ではないかもしれないですね(公式SDKが公開されないとわからないですが)。

Whitebrim/Game-of-life-love2d-playdate

https://github.com/Whitebrim/Game-of-life-love2d-playdate

上記のlove-playdate-emulationを利用して開発された「ライフゲーム」のサンプルコードです。「ライフゲーム」は画面上のドットが生命体となり、周囲の過密度によって増えたり減ったりするという一種のシミュレーションです。知らない人はGoogleで検索すると検索結果画面で現物が動作するので見てみてください。Lua言語への入門サンプルとして活用できそうです。

CGagnier/six-card-golf

https://gthub.com/CGagnier/six-card-golf

LÖVEフレームワークを使い、Lua開発の入門用に作成されたカードゲームです。Playdateへのコンバートを意識し、グラフィックスは1bitで作成されています。LÖVE用ゲームの開発サンプルとして使えるかと思います。

C言語での開発

McDevon/taxman-engine

https://github.com/McDevon/taxman-engine

Playdate用ゲーム開発にフォーカスして設計された2Dゲームエンジンですが、エンジン自体はプラットフォーム非依存で、自由に利用可能です。開発者の手元に実機やSDKがないため、Playdate向けの最適化も行われていません。C言語で記述されています。ターゲットをリソースが貧弱なPlaydateとしていることから、ゲームエンジンでは一般的なECS(エンティティ・コンポーネント・システム)でなく、単純なEC(エンティティ・コンポーネント)構造とシーン管理を実装しています。主な機能は以下の通りです。

  • カスタムオブジェクト:メモリ管理を容易にするランタイムタイプ情報を含み、デストラクタのような動作が可能
  • メモリ管理スキームをサポートする動的アレイリストやハッシュマップなどのサポート
  • シーントランジション:トランジションパターンのサポート・ディザリング:グレースケール画像の1bit表示に対応
  • ビットマップフォント:現在はモノスペース=等幅フォントのみサポート
  • スプライトアトラス:クロスプラットフォームなゲーム用フレームワークLibGDXの画像データ形式をサポート
  • タイルマップ:8×8ドットのチップを使ったタイルマップ
  • アニメーション:フレームアニメーション(絵を切り替える)、トランスフォームアニメーション(行列変換による変形)、イージング(ベジェ曲線を含む変換)
  • 衝突処理:スイープアンドプルーンアルゴリズムを使用
  • 疑似乱数ジェネレータ
  • 固定小数点演算

McDevon/taxman-wasm

https://github.com/McDevon/taxman-wasm

TaxmanEngineで開発されたゲームをブラウザで実行できる形式に変換するツールです。単なるコードビルダでなく一種のシミュレータとなっており、実機を持っていなくても開発が可能となります。

Rust言語での開発

公式サポート外のRust言語で開発をしようとしている人たちもいます。自由!

rtsuk/crankstart

https://github.com/rtsuk/crankstart

CargoはRust言語のビルドツールおよびパッケージマネージャです。crankstartはPlaydate SDKのCargo用ラッパーです。このラッパーを使用するには、専用のコマンドラインツールもインストールする必要があります。

rtsuk/crankstart-klondike

https://github.com/rtsuk/crankstart-klondike

Rust言語で実装されたトランプカードのソリティアゲームの実装です。Rust言語によるPlaydate用ゲーム開発のサンプルコードとなります。

開発言語に関係なく使える支援ツール

ivansergeev/gfxp

https://github.com/ivansergeev/gfxp

8×8ドットの画像を作成するためのドットエディタ(GFXP Editor)と、117種類のドットパターン集(GFXP lib)から構成されています。GFXP Editorはドットパターンの他、アニメーションの編集も可能です。データはPNG形式でのダウンロードの他、画面にソースコードを表示させて直接コピペすることも可能です。このGFXP Editorはオンライン版も公開されています。

早く開発を始めたい、でも…

シミュレータの利用要件にPlaydate実機が必要となっているため、Playdate SDKを使っての開発は、実機を入手してからになりそうです。となると、今は一番近い環境である「LÖVE」を使ってLuaのゲーム開発に慣れておくのが良さそうですね。せっかく無償で使えるので、挑戦してみたいと思います。

参考文献

メモリ液晶ディスプレイの構成と特徴/業天誠二郎(シャープ技報 第100号, 2010/2, シャープ株式会社)
https://corporate.jp.sharp/rd/35/pdf/100_06_A4.pdf

古典的ゲームループからECSアーキテクチャまで
https://zenn.dev/rita0222/articles/c22a8367e31b4d5f4eeb

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください