どうも。 traP Advent Calendar 2016 初日担当、のんさこです。
今回は "PICO-8" のこととか、それを用いて実際にゲームを作った体験とかを書きます(おもにプログラミングあたり)。
"PICO-8" ってなんぞや
"PICO-8" ($14.99) とは、Lexaloffle Gamesが開発した「空想上のゲームコンソール」です。と言ってもピンとこないでしょうし実際の写真を見たほうが良さそうですね。デモのゲーム "The Adventures of Jelpi" の画面を見てみましょう。
かわいい。超かわいい。
正方形の画面、荒いドット、少ない色数…。ゲームボーイカラーを思い出す人もいるのではないでしょうか。あるいはBASICコンソール。写真だけではわかりませんが、音源もPSGっぽい。ぐっと来ます。
そんなPICO-8ですが、ゲーム制作について非常に大きな利点があります。それは、 制作がとっっても楽 なところ。プログラムやグラフィック、マップ、サウンドのエディタもついています。プログラムは "Lua" という既存の言語を用います。保存されるファイルはテキストファイルとして読み込めるため、画面が狭くてコードが書きづらい、という場合には外部のテキストエディタも使えます。Windows、Mac、Linux、Raspberry Piにも対応しており、HTML5に出力可能。「作る」と「共有する」に特化したゲーム機です。
日本語のマニュアル、チュートリアル、リファレンスなんかもあります。入門あたりは以下が詳しいのでぜひ。
- kitao/pico8-jp: Japanese version of the PICO-8 official manual (pico8.txt)
- PICO–8って何? – PICO–8ゲーム開発入門(1) | AUTOMATON
とりあえずなんか作ってみた
そんなPICO-8に試験期間が迫る中出会い、一目惚れしたのんさこは、数日迷った末に買ってしまいました。試しに何かしら作ろうと思い、自分が好きなゲーム "Flappy Bird" のクローンを作りました。名前はシンプルに "Flapchick" です。背景とかの絵ごころのなさはゆるしてください。
当たり前ですがPICO-8でゲームを作るのは今回が初めてでした。それどころかLuaも1年近く前に ComputerCraft (MinecraftのMOD) でタートルを動かして以来まともに書いてません。なので先述のPICO-8のマニュアルやLuaのリファレンスを見ながらの亀ペース制作を覚悟しての制作となりました。
最初はLuaのテーブルをただの変数置き場にしか使っていませんでした。関数は全てグローバルにおいていたため、非常にBASIC感あるプログラムになってました(それはそれで趣がある)。しばらくして関数がテーブル内に入ると知って、オブジェクト指向プログラミングにより近いプログラムが書けるようになって、制作スピードが上昇。関数が基本型だと知ってからはコールバック関数に似たものを導入したりもするようになりました。
PICO-8そのものについては、できることが限られている分、学習速度がとても速かったです。スプライトの描画が関数一つ呼び出すだけなのはとても楽でした。9-Patchの描画も関数をつくって楽に行うことができました。スプライトのロードとか考えなくても良かったってのも地味に嬉しかったです。
製作時間としては、ブランクはあきつつも現時点で70時間程で、予想よりも短かったです。また、プログラムがアニメーションなども含めて1000行を超えない程度で割と書きやすかったという印象を持ちました。サクサクと書ける上に出来上がる速度が速くて、とても楽しかったです。
今後どう使っていこう
これらを踏まえた上でPICO-8の今後の使い道を考えたところ、かなりいろいろなことに使えそうなことに気が付きました。
楽しく開発できるという面を考えると、小規模であれば、ゲームを作ってリリースしたり、ゲーム制作時のプロトタイピング、ハッカソンやゲームジャムなどがさらに幸せになるのではないかと思います。教育機関向けのライセンスもあり、実際にその場面で使われてることもあり、プログラミング入門者にもおすすめできそうです。ひょっとしたら、スプライトの回転や3DCGなどの実装の学習にもいいかもしれません。
今のところ、僕は今年12/9に行われる "Ludum Dare 37" でPICO-8を使って出せたらいいなー、と思っています。
グダグダでしたが、PICO-8の魅力が伝わったらうれしいです。以上、のんさこでした。ノシ
おまけ
PICO-8でPとAをランダムに出力して"PPAP"の順に出てきたら"PEN-PINEAPPLE-APPLE-PEN"と出力するプログラムを書きました。「ピコ八郎」です。スペルミスは気にしないでください。
res = ""
function do_ppap()
local state = 0
local r = 0
local c = "p"
while state < 4 do
r = rnd(1)
if r<0.5 then
c="p"
else
c="a"
end
if c=="p" then
if state~=2 then
state+=1
end
else
if state~=2 then
state=0
else
state+=1
end
end
res=c
yield()
end
res="pen-pineapple-apple-pen"
end
function _init()
cr = cocreate(do_ppap)
end
function _update()
if costatus(cr)~="dead" then
coresume(cr)
else
res=nil
end
end
function _draw()
if res then
print(res)
end
end