1始まり (1-based indexing)
1始まり (1-based indexing) とは、配列(テーブル)の要素にアクセスする際、最初の要素のインデックス(添字)が「0」ではなく「1」からスタートする仕様のことです。
多くの現代的なプログラミング言語(C, Python, JavaScriptなど)は0始まり(0-based)ですが、Luaは歴史的な経緯や数学的な直感性を重視し、1始まりを採用しています。
概要
Playdateの開発において「1始まり(1-based indexing)」を理解することは非常に重要です。これは、Playdateのメイン言語であるLuaが、配列やリストの添え字を1からカウントする仕様であることに由来します。
C言語、Python、JavaScriptなどの「0始まり」の言語に慣れている開発者にとっては、最も間違いやすいポイントの一つです。
1. Luaにおける「1始まり」の基本
Luaのテーブル(配列)は、最初の要素にインデックス1でアクセスします。
local fruits = {"apple", "orange", "banana"}
print(fruits) -- "apple" (0ではない!)
print(#fruits) -- 3 (要素数)
- なぜ1始まりなのか?
- Luaはもともと非プログラマー(データ記述を行うエンジニアなど)でも扱いやすいように設計されたため、「1番目、2番目…」という人間の直感的な数え方に合わせられています。
Playdateの各種
APIも、このLuaの仕様に準拠しています。
- タイルマップ (Tilemaps)
- タイルマップの座標指定やタイルのインデックスは1始まりです。
- タイルマップの左上のタイルは x=1, y=1 です
- getTileAt(1, 1) で左上のタイルを取得します
- スプライトのインデックス
- スプライトのリストや、アニメーションのフレーム指定も1から始まります。
- playdate.graphics.getSpriteList() で返されるテーブルの最初のスプライトは です
- imagetable:getImage(1) は最初の画像を取得します
- ループ処理
- 配列を走査する際の標準的な for 文も1から始まります。
for i=1, #myTable do
print(myTable[i])
end
3. C言語(C SDK)との違い
ここが混乱の元ですが、Playdate C SDKを使用する場合は0始まりになります。
| 項目 |
Lua SDK |
C SDK |
| インデックス |
1始まり |
0始まり |
| タイル座標 |
(1, 1) が起点 |
(0, 0) が起点 |
| メモリ管理 |
自動 (GC) |
手動 |
LuaとCを混ぜて使う(LuaからC関数を呼び出す)場合は、インデックスの「+1 / -1」の変換を意識する必要があります。
4. 注意点と「落とし穴」
- JSONとの相互変換
- 前述の通り、JSONは一般的に0始まりの言語で使われることが多いため、外部ツールで作成したJSON配列を読み込む際は注意が必要です。
- Playdateの json.decode を使うと、JSONの配列はLuaの1始まりテーブルに自動で変換されるので、読み込み後は からアクセスすればOKです。
- 0をインデックスに使うと?
- Luaでは myTable に値を代入すること自体は可能(単なるキーとして扱われる)ですが、配列の長さ演算子 # には含まれず、標準的な関数では無視されるため、バグの原因になります。
- 算術計算でのオフセット
- 数学的な計算(剰余 % を使ったループなど)を行う際、0始まりの方が計算が楽な場合があります。その場合は一度0ベースで計算してから最後に +1 するテクニックがよく使われます。
-- 1から4をループさせたい場合
local index = (count % 4) + 1
関連ページ
最終更新:2026年05月01日 09:06