オブジェクト指向
Playdateのゲーム開発(主にLuaを使用した開発)におけるオブジェクト指向プログラミング(OOP)は、ゲーム内のキャラクター、敵、UI要素などの「エンティティ」を管理するために非常に重要な役割を果たします。
Playdate環境におけるオプジェクト指向プログラミング
Playdate SDKは、本来クラスベースではないLuaに対して、独自にクラスシステムを拡張して提供しています。その特徴と使い方をまとめました。
1. Playdateにおけるクラスの定義
Lua自体は「プロトタイプベース」の言語ですが、Playdate SDKでは playdate.class を使用することで、他の言語(JavaやC#など)に近いクラスベースの継承を実現しています。
-- 基本的なクラスの作成
class('MyEntity').extends()
function MyEntity:init(x, y)
self.x = x
self.y = y
end
- class('Name').extends(): 新しいクラスを定義します。
- init(): コンストラクタ(初期化メソッド)です。インスタンス化されたときに呼ばれます。
2. 継承 (Inheritance)
Playdate開発で最も一般的なのは、SDKが提供する playdate.graphics.sprite クラスを継承することです。これにより、描画や衝突判定の機能を備えた独自のオブジェクトを簡単に作れます。
class('Player').extends(playdate.graphics.sprite)
function Player:init(x, y)
Player.super.init(self) -- 親クラスの初期化を呼び出す
self:moveTo(x, y)
local image = playdate.graphics.image.new("images/player")
self:setImage(image)
self:add() -- [[スプライト]]をシーンに追加
end
- super: 親クラスのメソッドを呼び出す際に使用します。継承時には必須の作法です。
3. Playdate SDKにおけるOOPの構造
Playdateのオブジェクト指向は、以下のような階層構造で設計するのが一般的です。
| 概念 |
Playdateでの役割 |
| クラス (Class) |
オブジェクトの設計図(例:Enemyクラス) |
| インスタンス (Instance) |
設計図から作られた実体(例:画面上の「敵A」「敵B」) |
| 継承 (Inheritance) |
共通機能の使い回し(例:Sprite → Enemy → Boss) |
| カプセル化 |
self 変数を使って、オブジェクトごとの状態(HP、速度など)を保持 |
4. なぜPlaydateでOOPを使うのか?
- 1. コードの整理
- 「プレイヤーの動き」「敵のAI」「弾の軌道」などをそれぞれのクラスに閉じ込めることで、main.lua が肥大化するのを防ぎます。
- 2. スプライトシステムとの親和性
- Playdateの update() ループ内で playdate.graphics.sprite.update() を呼ぶだけで、全てのインスタンス化されたスプライトを一括で更新・描画できます。
- 3. 再利用性
- 一度「ボタン」や「メニュー項目」のクラスを作れば、異なるシーンで何度でも使い回せます。
5. 実装のヒント:self の扱い
LuaのOOPで最も間違いやすいのが :(コロン)と .(ドット)の使い分けです。
- 定義時
- function MyClass:move() と書くと、第一引数に自動で self が渡されます。
- 呼び出し時
- myInstance:move() と呼ぶことで、そのインスタンス自身のデータを操作できます。
- TIP
- Playdateのメモリ制限(16MB)を意識する場合、大量のオブジェクトを生成・破棄するよりも、オブジェクトプール(一度作ったインスタンスを再利用する手法)をOOPと組み合わせて検討するのが上級者への近道です。
関連ページ
最終更新:2026年04月29日 14:53