PICO-8 勉強メモ
購入
私はPaypalで買った。クレカ決済やAmazonアカウント(日本アマゾンに対応してるかは不明)での購入も可能
実際の決済・ダウンロードはHumble Bundleサイトを利用しているので、ここのアカウントを作る必要がある。でもPCゲーマーならほぼ持ってるよね! インストール
Humble Bundleからダウンロードしたpico-8_<バージョン番号>_setup.exeを実行。ただし実行前に右クリックしてプロパティを表示し、全般タブ下の「セキュリティ」項目を「許可」する必要がある。
実行
実行すると、コマンドプロンプトが表示される。
コマンドの例
HELP … コマンド一覧を表示。
CLS(あるいはCtrl+L) … 画面をクリア
LS(あるいはDIR) … カレントディレクトリのファイル一覧を表示
CD <ディレクトリ名> … ディレクトリを移動。
..や/も使用可能。CDのみを入力するとカレントディレクトリ名を表示。
LOAD <ファイル名> … カートリッジ(プログラム)ファイルをロード
RUN (あるいはCtrl+R) … ロード済のプログラムを実行。ファイル名指定はできない。
SAVE <ファイル名> … ロード済のプログラムを保存。ファイル名を指定しないと上書き保存、あるいはUNTITLED.P8というファイル名になる。
REBOOT … すべてを初期化してリセットする。
KEYCONFIG -- GUI画面でキーコンフィグを実行。
FOLDER -- カレントフォルダをシステム(Windowsならエクスプローラー)で開く。
最初に試すコマンド
INSTALL_DEMO … DEMOフォルダにサンプルプログラムがインストールされる。
SPLORE … ファイラーを起動。カーソル操作でカートリッジを選択したり実行したりできる。
ローカルファイルを実行するほかにも、他のユーザーが作った人気のゲームやゲームジャム応募作品など、ネット上のカートリッジをダウンロードしてきて実行することもできる(各タブのUPDATEを実行する)
キー操作
コンソール/実行中共通
ALT+ENTER … 全画面/ウィンドウ表示の切り替え
ALT+F4 … PICO-8自体を強制終了する。
Mac, LinuxではCtrl+Q
Ctrl+M -- サウンドのミュート
コンソール/エディット中
(コンソールで)ESC … エディタに入る
Ctrl+R -- ロード中のカートリッジを実行
Ctrl+S -- カートリッジの内容を即座に保存
SAVEコマンドで名前をつけていない場合はUNTITLED.P8で保存される
実行中のみ
ESC … メニューの表示。
初期キーアサインではPキー、ENTERキーでも表示。
ゲームの終了、キーアサイン、音量バランス、フルスクリーン切り替えなどもここから行える。
Ctrl+R -- 実行中のカートリッジの再起動
CTRL+6 -- スクリーンショットの保存(デスクトップ)
CTRL+8 -- ビデオ録画開始点のセット
CTRL+9 -- ビデオをGIF保存(デスクトップ)
標準では8秒。CONFIG設定で最大120秒
画面はつねに録画されており、CTRL+9を押した時点で8秒遡って保存される。CTRL+8はそのキャッシュをクリアする。
アプリの作業フォルダ
C:/Users/<ユーザー名>/AppData/Roaming/pico-8/
プログラム制作開始
PICO-8の初期化を行う。
REBOOT
プロジェクトファイル名を決める。
SAVE SAMPLE
これでSAMPLE.P8が保存される。以降、SAVEするたびこのファイル名に上書きされる。
ESCでエディタに入る。
以下のコードを入力
code:lua
PRINT("HELLO WORLD")
注:PICO-8ではアルファベットは基本的にすべて大文字になる。SHIFTキーなどを使って入力しようとすると特殊な文字が表示される。日本語も使えなくはないが特殊な文字コードなためコピペなどしようとすると文字化けする。
CTRL+Sで保存。
CTRL+Rで実行。
HELLO WORLDと表示されれば成功。
外部エディタで開発する
アプリの作業フォルダC:/Users/<ユーザー名>/AppData/Roaming/pico-8/を開く。
carts内に先ほど保存したSAMPLE.P8があるのでVSCodeなどのエディタで開く。
ざっくり
pico-8 cartridge ...という固定のヘッダ
__???__で区切られたセクション
PICO-8エディタ内で大文字だったアルファベットはすべて小文字になっている
という作りになっていることがわかり、プログラムソースは__lua__セクション内をいじればいいんだなということが予想つく。
外部エディタで編集してもPICO-8内のエディタの内容はリアルタイムには変わらないが、CTRL+Rを押して実行するタイミングで最新の内容にリロードされていることがわかる。
PICO-8の言語は基本的にLuaだが、書式も含めかなり仕様が違うので、VSCodeで開発する場合は pico8-ls 拡張を入れるといい感じ(いまのところ) 外部エディタでの日本語は「全角ひらがな」と「全角カタカナ」のみ使え、濁音、半濁音は使えない。ハ゜とかタ゛のように濁点・半濁点を別文字として入力する必要がある。読点・句読点、!などの全角記号も使えない。
アルファベットは大文字、小文字が逆転している。
画面仕様
色コード
0 black 1 dark_blue 2 dark_purple 3 dark_green
4 brown 5 dark_gray 6 light_gray 7 white
8 red 9 orange 10 yellow 11 green
12 blue 13 indigo 14 pink 15 peach
プログラム仕様
コードトークンは8192まで
文字数ではない。変数名、関数名、演算子などがトークンとしてカウントされる。カンマ、ピリオド、END、コメントはカウントされない。
関数
システム
_INIT() -- 初期化。実行ごとに1回のみ呼ばれる。
_UPDATE() -- 1/30秒ごとに呼び出される
_DRAW() -- 画面描画のタイミングで呼び出される。
一定間隔とは限らない。処理落ち(処理が1/30秒以内に収まらない)が発生するとスキップされることがある。
STOP( <MESSAGE>) - カートリッジの実行を停止しコンソールに戻る。コンソールにMESSAGEを表示する。
コマンド:RESUME -- STOPで停止したカートリッジを再開する
コマンド:. - 1フレームだけ再開して直ちにSTOPする(ステップ実行モード)
ASSERT( CONDITION, <MESSAGE>) -- CONDITIONの式が成り立つ時、実行を停止しコンソールに戻りMESSAGEを表示する。主にデバッグ用。
IF CONDITION THEN STOP(MESSAGE)とほぼ同じ。
PRINTH( STR, <FILENAME>, <OVERWRITE>, <SAVE_TO_DESKTOP>) -- 実行しているOSのコンソールにSTRを出力する。
コマンドラインから実行していないと(コンソールが表示されていないので)意味がない。
Web上で動いているときはブラウザのコンソールに出てくるのかも?
FILENAME, OVERERITE, SAVE_TO_DESKTOPはファイルに出力する場合のオプション。
FILENAMEに"@clip"を指定するとクリップボードに出力する。
TIME() あるいは T()
カートリッジが実行開始してからの秒数を返す。フレーム数から計算しているのでリアル時間とはずれる可能性がある。30FPSで動かしても60FPSで動かしても結果は同じ。
reset() -- カートリッジを再起動する。
入力
BTN(<B>, <PL>) … 番号Bに対応するボタンが押されていればtrueを返す。PLはプレイヤー番号(0-1)。
キーマップが初期設定の場合、0 = ← , 1 = → , 2 = ↑ , 3 = ↓ , 4 = z , 5 = x
BTNP(B, <PL>) -- B番号のボタンが「押された瞬間」trueを返す。押しっぱなしには反応しない。(ただし押しっぱなしでキーリピートが働くことがある)
描画
CLS( COL ) -- 画面をクリア。COLは塗りつぶす色。
RECTFILL(X1, Y1, X2, Y2, COL) … colの色で長方形を描画。x1,y1は左上の座標、x2,y2は右下の座標
RECT(X1, Y1, X2,Y2, COL) -- 長方形外周のみ描画
CIRCFILL(X, Y, SIZE, COL) -- x,yを中心とする円を描画
CIRC(X,Y) -- 円弧のみ描画
LINE(X0,Y0, <X1, Y1, COL>) -- X0,Y0からX1,Y1まで線を引く。
X1,Y1を省略した場合最後に使った座標から線が引かれる。
CURSOR(X, Y, <COL>) -- 現在位置(および描画色)を変更する。これを実行して以降、座標をしていない描画コマンドはこの位置(と色)で描画される
COLOR( <COL>) -- 描画色を変更する
PRINT(STR, <X,Y,> <COL>) -- 画面に文字列(あるいは変数の内容)を描画。
X,Yは、先頭の文字の左下の座標(単位:ピクセル)。省略した場合は「現在位置」
現在位置はCURSOR()で変更する
?でも同じ。?"HELLO"
STRの中に以下のエスケープシーケンスを仕込める。(一度指定したら再指定するまで継続する)
\F? -- ?は前景色(16進0-F)。"\F2HELLO"で紫文字のHELLO。
\#? -- ?は背景色(16進0-F)。"\#3HELLO"で緑背景のHELLO。
\^I -- 前景色と背景色を反転する。
\^W -- 横2倍角(WIDE MODE)。\^-Wでもとに戻す。
\^T -- 縦2倍角(TALL MODE)。\^-Tでもとに戻す。
?"\^W\^THELLO WORLDで縦横2倍のデカ文字が表示できる
\^P -- 縦横2倍角にして点線で描画する(PINBALL MODE)
\A -- BEEP音を鳴らす。あるいは簡易的なPLAY文。
Aに続いてCDE…など音階名を入力すると(短い音だが)その音が鳴る。Hなど音階以外の音はド(C)扱いになるっぽい。スペース が来るまでつづく。
C0,C1のようにオクターブ指定ができる。オクターブ指定するとそれ以降の音階名がそのオクターブになる。
\AC0DEFGABC1DEFGAB で駆け上がるBEEP。
CAMERA(<X,Y>) -- スクリーンオフセットを-X、-Yだけずらす。
SPR(number,x,y, <w,h> <flipX, flipy>) -- 画面上にスプライトを描画。
x,y 位置がスプライトの左上。
w,hはスプライトのサイズ(単位はコマ。つまり8ピクセル単位。通常は1,1)
flipX,YがtrueのときXYそれぞれを反転させる。
CLIP( X,Y, W,H, <CLIP_PREVIOUS>) -- これ以降のすべての描画を指定の矩形の範囲でクリップ(切り抜き)する。
実行前の描画には影響を与えない。
CLIP()が実行されるか、_DRAW()の終わりまで続く?
PSET( X,Y, <COL> ) -- 画面の指定座標に点を打つ。COLを指定しなければカレントカラー。
PGET( X,Y ) -- 画面の指定座標のカラーコードを取得する。XYが範囲外なら0を返す。
FILLP(P) -- 塗りつぶしパターンの定義
これ以降の塗りつぶし(RECTFILLなど)パターンを決める。
例としてFILLP(0b0011001111001100)は 00110011 - 11001100 となり
code:txt
_■_■
■_■_
という感じの格子状になる。
マップ
MAP( TILE_X, TILE_Y, <SX,SY>, <TILE_W, TILE_H>, <LAYER>) -- マップを描画する
TILE_X/YはMAPデータのコピー元開始タイル位置(単位:コマ)
SX/Yは画面上の出力位置(単位:ピクセル)
TILE_W/Hは出力範囲(単位:コマ)
LAYERは?
MGET(X,Y) -- 座標X,Yのマップ番号を取得
キャラクター
CHR( VAL0, <VAL1, VAL2> ... ) -- VAL0,1...の数値をキャラクターコードに変換し文字列を返す。
?CHR(104, 101, 108, 108, 111)
HELLO
計算
MAX(X,Y)/MIN(X,Y)/MID(X,Y,Z) -- 最大値、最小値、中央値
FLR(X) -- 小数点以下切り下げ。
CEIL(X) -- 小数点以下切り上げ。
どちらもマイナス値の場合に注意(FLR(-2.3)→-3)
サウンド
sfx( <SFX番号>, <チャンネル>, <オフセット>, <長さ> ) -- SFX番号の音を鳴らす。チャンネル(0-3)をずらすと、重なったときに音が途切れない。オフセットは再生開始位置?長さは長さ?
チャンネルに-1を指定すると使われていないチャンネルに自動的に割り当てて再生する。
チャンネルに-2を指定するとすべてのチャンネルで再生中の指定SFX番号の音を止める。(別のSFXは止まらない)
music(<番号>) -- 番号のBGMを鳴らす。-1を指定すれば止まる。
SFX(サウンド)エディタ
「◀」ボタンでサウンドエディタに入る。
サウンドエディタは2つのモードがある。(TABキーで切り替え)
グラフモード
左上のIiIiみたいなボタンがハイライトされていることを確認。
上のパネルの棒が音素のピッチの変化、下のパネルの棒が音素の音量の変化を表している。
下パネルの棒をゼロ(一番下)に持っていけば上のパネルの音素も消える
シーケンサーモード
9つの横線みたいなボタンがハイライトされていることを確認。
1つめの白文字:音程(C, D, E…= ド、レ、ミ…)
2つめの白文字:全音(空白)もしくは半音(#)
3つめの灰文字:オクターブ
0-4まで。
4つ目の赤数字:音色番号
0: 疑似正弦波
1: 傾いた三角波?
2: 三角波
3: 矩形波
4: 位相矩形波(ファミコン風)
5: 倍正弦波?疑似正弦波より高く聞こえる(0番の1オク上よりは低く聞こえる)
6: ノイズ
オクターブで周波数が変わる
7: 二重正弦波?疑似正弦波より厚みがある
5つ目の青数字:音量
0にすると非表示になる(休符扱い)
6つ目の灰数字:エフェクト番号
0: なし
1: スライド
2: ビブラート
3: ドロップ
4: フェード・イン
5: フェード・アウト
6: 速いアルペジオ
7: 遅いアルペジオ
メモ
C 2043でキック風
C 5623でスネア風
ハットの再現は難しい
サウンド番号は上の◀00▶で選択する。
SPACEキーで再生
各音素間の再生スピード(ウェイト値)はSPDで変更。数値が小さいほど速く再生される。
SPDはマウス左クリックで増加、右クリックで減少する。マウスドラッグで上下もできる。
各音素の波形も混在して選べる(選んだあとにマウスで描画)が、SPDが十分大きくないと違いが感じられない(ノイズ以外は)。
サウンドの内容もプログラムも一つのファイルに保存されているため、外部エディタを使っている場合は競合に注意。
BGMエディタ
♪ボタンでBGMエディタへ
BGMエディタはSFXエディタで作ったパターンを重ねる、および並べることで曲を作る。
4トラックあるのでそれぞれにSFXで作ったメロディを指定して重ねる
テンポは共通ではないので注意。それぞれのSPD値が同じ値でないとズレます
BGMエディタ内でもSFXの編集ができる(SFXに反映される)し、ペンマークをクリックしてSFXページに飛ぶこともできる
パターンを切り替えてSFXを配置し、長さを作る
パターンは番号通りに順に再生される。
例としてMUSIC(0)を指定すればパターン0から1,2,3…と再生する
↩か■がなければ次のパターンを再生する。
最後までいくか、■を設定したパターンまでいくと音楽が止まる。
↩があるパターンまで来ると、↱を設定したパターンまでもどる。↱がなければ先頭(パターン0)まで戻る。
例としてパターン3で↩を設定したうえでMUSIC(0)を実行すると、パターン0→1→2→3のループ曲となる
新たにパターン4に↱を設定、7に↩を設定し、MUSIC(4)を実行すればで4→5→6→7という別の曲が流せる(パターン4に↱がないとパターン0まで戻ってしまう)
当然MUSIC(1)やMUSIC(5)などとして曲の途中から再生も可能。
スプライトエディタ
ムジュラの仮面みたいなキャラクターのボタンでスプライトエディタに入る。
右のパレットから色を選択し、左クリックで色を置く。右クリックでスポイト。
パターン0はあらかじめ✕マークが登録されている。
パターンは8x8,16x16,32x32の大きさを選べる(ZOOMスライダーで設定)
ブラシサイズも選べる(BRUSH SIZEスライダー)
8x8であれば64パターンx4枚で合計256パターンまで作れる。
FLAGで衝突判定の有無を設定できる?