Permalink
Find file
784f183 Dec 10, 2016
1926 lines (1356 sloc) 79.7 KB
================================================================================
PICO-8 v0.1.10
http://www.pico-8.com
(c) Copyright 2014-2016 Lexaloffle Games LLP
Author: Joseph White // hey@lexaloffle.com
PICO-8 is built with:
SDL2 http://www.libsdl.org
Lua 5.2 http://www.lua.org // see license.txt
GIFLIB http://giflib.sourceforge.net/
WiringPi http://wiringpi.com/
日本語版マニュアルリポジトリ: https://github.com/kitao/pico8-jp
PICO-8 API 早見表: https://kitao.github.io/pico8-api-jp/
================================================================================
PICO-8へようこそ!
PICO-8は小さなゲームやプログラムを作って、共有したり、プレイするための架空の
ゲーム機です。PICO-8を起動させると、Luaプログラムを直接入力できるコンソールと、
スプライト、マップ、サウンドを作成するためのツールが提供されます。
PICO-8の厳しい制約は、使っていて楽しく、小さいけれど表現力に富んだデザインを奨
励し、それぞれのPICO-8カートリッジが個性的な見た目や操作になるように注意深く選
択されています。
:: キー操作
フルスクリーン切り替え : ALT+ENTER
終了 : ALT+F4 または CMD-Q
カートリッジの再読み込み/実行/再スタート: CTRL+R
クイックセーブ : CTRL+S
消音/消音取り消し : CTRL+M
プレイヤー1 デフォルト操作 : カーソルキー + ZX/NM/CV
プレイヤー2 デフォルト操作 : SDFE + TAB,Q/SHIFT A
ポーズメニュー(実行中) : ENTER または P
// デフォルト操作を変更するにはKEYCONFIGを編集してください。
:: 仕様
表示 : 128x128、16色固定パレット
入力 : 6ボタン
カートリッジサイズ: 32k
サウンド : 4チャンネル、64サウンド
コード : Lua (最大8192トークン)
スプライト : シングルバンク 128 8x8スプライト
(+マップと共有の128スプライト)
マップ : 128x32 8ビットセル (+スプライトと共有の128x32セル)
:: Hello World
PICO-8を起動したら、以下の各コマンドを入力してENTERキーを押してみましょう。
PRINT("HELLO WORLD")
RECTFILL(80,80,120,100,12)
CIRCFILL(70,90,20,14)
FOR I=1,4 DO PRINT(I) END
(注意: PICO-8は大文字と小文字を区別しません
-- CAPSキーを押さずに普通に入力してください!)
このようなコマンドを、コードエディターで_updateや_drawなどの特殊コールバック関
数と組み合わせることで、操作可能なプログラムを作成することができます。例えば、
次のプログラムはカーソルキーで円を動かします。ESCキーでコードエディターに切り
替えて、以下のコードを入力またはコピー&ペーストしてみてください。
X = 64 Y = 64
FUNCTION _UPDATE()
IF (BTN(0)) THEN X=X-1 END
IF (BTN(1)) THEN X=X+1 END
IF (BTN(2)) THEN Y=Y-1 END
IF (BTN(3)) THEN Y=Y+1 END
END
FUNCTION _DRAW()
RECTFILL(0,0,127,127,5)
CIRCFILL(X,Y,7,8)
END
ESCキーを押してコンソールに戻り、RUNと入力して実際に動くところを確認してみてく
ださい。より複雑なプログラムについては、サンプルカートリッジを参照してください。
:: サンプルカートリッジ
PICO-8にはあらかじめ下記のカートリッジが含まれており、次のコマンドでインストー
ルできます。
INSTALL_DEMOS
CD DEMOS
API PICO-8の主要な機能のデモ
JELPI 2プレイヤー対応のプラットフォーム型ゲームデモ
CAST 2.5D レイキャスターデモ
MANDEL マンデルブロー描画
COLLIDE 壁とキャラクターの衝突判定サンプル
BUTTERFLY シェルピンスキーのフラクタル三角形描画
DRIPPY 液体のように滴る曲線の描画
STOMPY 音楽カートリッジ
WOO 音楽カートリッジ
カートリッジを実行するには、PICO-8を起動して以下のように入力します。
LOAD JELPI
RUN
ESCキーでプログラムが停止し、もう一度押すとエディターモードに切り替わります。
:: ファイルシステム
ファイルやディレクトリ(フォルダ)の管理には以下のコマンドを使用します。
DIR 現在のディレクトリの内容一覧を表示します
CD BLAH 現在のディレクトリを指定したディレクトリ(BLAH)に変更します
CD .. 一つ上の階層のディレクトリに移動します
CD / (PICO-8の仮想ドライブの)一番上のディレクトリに移動します
MKDIR BLAH ディレクトリを作成します
FOLDER ホストOSのファイルブラウザで現在のディレクトリを表示します
LOAD BLAH 現在のディレクトリから指定したカートリッジを読み込みます
SAVE BLAH 現在のディレクトリに指定したカートリッジを保存します
ファイルの移動、複製、削除をしたい場合は、FOLDERコマンドを使ってホストOS上で操
作するのが最も簡単な方法です。
PICO-8の仮想ドライブの初期位置は以下になります。
Windows: C:/Users/Yourname/AppData/Roaming/pico-8/carts
OSX : /Users/Yourname/Library/Application Support/pico-8/carts
Linux : ~/.lexaloffle/pico-8/carts
pico-8/config.txtを編集することでドライブ位置やその他の設定を変更することがで
きます。
コツ: もしあなたがDropboxユーザーであれば、ドライブ位置をDropboxの共有フォルダ
に設定することで、他のマシンのPICO-8とドライブを共有することができます。
:: バックアップ
保存せずに終了したり、既存のファイルを上書きした場合、カートリッジのバックアッ
プがpico-8/backupに作成されます。
:: 設定
:: config.txt
config.txtに設定が書かれています。PICO-8が動作していない時に編集してください。
Windows: C:/Users/Yourname/AppData/Roaming/pico-8/config.txt
OSX : /Users/Yourname/Library/Application Support/pico-8/config.txt
Linux : ~/.lexaloffle/pico-8/config.txt
後述する-homeオプションでconfig.txtやその他のデータの参照位置を変更すること
ができます。
:: コマンドライン引数
// 注意: これらのオプションはconfig.txtの設定を上書きします
pico-8 [オプション] [ファイル名.p8]
-width n ウィンドウの幅を指定します
-height n ウィンドウの高さを指定します
-windowed n 0なら全画面モード、1ならウィンドウモードで起動します
-sound n 音量を指定します(0-256)
-music n 音量を指定します(0-256)
-joystick n ジョイスティックの割り当てをプレイヤー番号nから開始しま
す(0-7)
-pixel_perfect n 1ならフィルターなしの整数倍の拡大を行います
(デフォルトは1)
-draw_rect x,y,w,h PICO-8の画面を描画するウィンドウの座標とサイズを指定し
ます
-run filename 起動時にfilename.p8を読み込み実行します
-splore 起動時にSPLOREを実行します
-home path config.txtやユーザーデータの参照フォルダを指定します
-desktop path スクリーンショットとアニメGIFの保存フォルダを指定します
-screenshot_scale n スクリーンショットの拡大率を指定します
(デフォルトは3の368x368ピクセル)
-gif_scale n アニメGIFの拡大率を指定します
(デフォルトは2の256x256ピクセル)
-gif_len n アニメGIFの最大録画時間を秒単位で指定します(1-120)
-gui_theme n 1で高コントラストのエディターカラー設定を使用します
-timeout n ダウンロード開始を待つ最大時間を秒単位で指定します
(デフォルトは30)
:: コントローラー設定
PICO-8はSDL2のコントローラーの設定方法を使用しています。この方法は、起動時に
一般的なコントローラーを認識し、config.txtと同じディレクトリの
sdl_controllers.txtにあるボタン割り当てを探します。sdl_controllers.txtには1
行につき1つのボタン割り当てを記述します。
独自のボタン割り当てを作成するには、SDL2に付属するcontrollermapプログラムか、
http://www.generalarcade.com/gamepadtool/ を使用してください。
キーボードのキーをコントローラーのどのボタンに割り当てるかを設定するには、
KEYCONFIGを使用します。
:: カートリッジの共有 / HTML5出力
カートリッジを共有する方法には3種類あります。
1. .p8または.p8.pngファイルを他のPICO-8ユーザーと共有する
2. カートリッジをLexaloffe BBSに投稿してWebブラウザ版を取得する
http://www.lexaloffle.com/pico-8.php?page=submit
.p8.png版の作成方法はsave関数の説明を参照してください。
(.pngで検索すると見つかります)
3. 単体で動作するHTML5版カートリッジを出力する
EXPORT FOO.HTML
このコマンドはfoo.htmlとfoo.jsの2つのファイルを作成します。
(2ファイルとも必要です!)
作者とその協力者の許可さえあれば、自由に出力されたカートリッジの利用や配布
ができます。
.htmlファイルは必要に応じて修正するためのテンプレートになっています。.html
ファイルには設定変更のボタンと外部のウェブサイトへのリンク(デフォルトは
PICO-8 BBSのカートリッジページ)、プレイ中にWebページがスクロールするのを防
ぐための、キー入力をブロックするJavaScriptが含まれています。
プレイ画面の幅と高さは変更可能ですが、表示されるcanvasのサイズと一致してい
る必要があることに注意してください。(デフォルトのサイズは580x540)
EXPORTに指定することで16カートリッジまでまとめることができます。
EXPORT FOO.HTML DAT1.P8 DAT2.P8 GAME2.P8
実行中、ローカルファイルと同じように追加カートリッジにアクセスすることがで
きます。
RELOAD(0,0,0x2000,"DAT1.P8") -- DAT1.P8からスプライトシートを読み込みます
LOAD("GAME2.P8") -- 別のカートリッジを読み込み実行します
.p8ファイルのみ対応しており、ファイル名には拡張子.p8が含まれている必要があ
ります。
:: スクリーンショット、動画、カートリッジラベル
カートリッジ動作中に以下のコマンドが使用できます。
F6 デスクトップにスクリーンショットを保存する
F7 カートリッジラベル画像をキャプチャする
F8 動画の録画を開始する
F9 デスクトップにアニメGIFを保存する(デフォルトでは最大8秒)
// F6-F9が使えない環境では、F1-F4またはCTRL+6-9を使用してください
SAVEコマンドでp8.pngフォーマットを指定するとカートリッジラベルが保存されます。
(常に録画されているため)いつでも動画を保存することが可能です。8秒以下の動画を
撮影したい場合はF8キーで録画の開始時間をリセットしてください。
アニメGIFの最大長さを変更するには、config.txtのgif_lenで録画時間の秒数を指定し
ます。GIFフォーマットは30fpsちょうどに対応していないため、PICO-8は代わりに最も
近い33.3fpsを使用しています。
:: エクスポーター / インポーター
1. スプライトシートを.pngファイルから読み込んだり出力したりするには以下のコマ
ンドを使用します
import("blah.png") -- 128x128のpngファイルを読み込み、色をPICO-8のパ
レットに合わせます
export("blah.png") -- pngファイルの出力位置の指定にはfolder関数が使用さ
れます
2. 効果音や音楽の出力には以下のコマンドを使用します
export("blah.wav") -- 音楽エディターで選択中の音楽を出力します
export("blah.wav") -- SFXエディターで選択中のSFXを出力します
export("blah%d.wav") -- すべてのSFXをblah0.wav, blah1.wav .. blah63.wavと
して出力します
// コンソールではEXPORT BLAH.WAVのように括弧や引用符を省略できます
:: PICO-8の特殊な点
以下のような特殊な点に注意してください。
- スプライトシートの後半とマップの後半は同じメモリに割り当てられています
// どのように動作するかよくわからない場合は、どちらか片方だけを使用するのが
// よいでしょう
- PICO-8の数値は32767.99までしか扱えません
// 毎フレームカウンターに1を足すと、18分後にはオーバーフローを起こします!
- Luaの配列はデフォルトでは0ではなく1から開始されます。FOREACHはT[0]ではなく
T[1]から始まります
- cosとsinは0からPI*2の代わりに0から1の値を取り、sinの値は反転しています
- sgn(0)は1を返します
- Macでフルスクリーンを切り替えるにはALT-ENTERを使用します
(CMD-Fはテキストの検索に使用されます)
- .pngカートリッジを出力したい場合はEXPORTではなくSAVEを使用します。EXPORTはス
プライトシートだけを保存します!
:: SPLORE
SPLOREはローカルとBBS(オンライン)のカートリッジを閲覧、管理するためのユーティ
リティです。SPLORE[ENTER]と入力するか、-sploreオプションをつけてPICO-8を起動す
ることで利用できます。
SPLOREのすべての操作はジョイスティックで行うことが可能です。
- 左ボタンと右ボタンでカートリッジのリストを切り替えます
- 上ボタンと下ボタンでリストの各アイテムを選択します
- Xボタン、Oボタン、MENUボタンでカートリッジを起動します
カートリッジリストの中でMENUボタンを押すと、カートリッジのお気に入り登録や
SPLOREへの復帰ができます。キーボードの場合は、カートリッジリストでアイテムが選
択されている時にFキーでお気に入りへ登録ができます。
BBSのカートリッジリスト閲覧中は、リストアイテムの先頭の[UPDATE]を選択すると
カートリッジリストの再ダウンロードを行います。オフライン時は、最後にダウンロー
ドされたリストが表示され、ダウンロード済みのカートリッジは引き続きプレイするこ
とができます。
インターネット環境のないマシンにPICO-8をインストールした場合も、INSTALL_GAMES
コマンドで、あらかじめインストールされているいくつかのBBSカートリッジをお気に
入りリストに追加することができます。
================================================================================
エディターモード
================================================================================
コンソールとエディターを切り替えるにはESCキーを押します。
エディターモードーを切り替えるには、右上のエディターモードタブをクリックするか、
ALT+左キー/右キーを押してください。
** 注意: スプライトシートの後半(バンク2と3)とマップの後半はカートリッジの同じ
データ領域を共有しています。そのデータ領域をどう使うかはあなた次第ですが、スプ
ライトシートの後半に書き込むとマップデータが破壊され、その逆も起きますので注意
してください。
:: コードエディター
- シフトキーを押すと(またはマウスでドラッグすると)領域を選択します
- CTRL-X、C、Vで選択領域をカット、コピー、ペーストします
- CTRL-Z、Yで編集の取り消しとやり直しをします
- CTRL-Fでテキストを検索します
- CTRL-Gで最後の検索を繰り返します
- CTRL-UP、DOWNでプログラムの先頭と終端に移動します
- ALT-UP、DOWNで直前と直後の関数に移動します
- CTRL-LEFT、RIGHTで直前と直後の単語に移動します
- CTRL-Dで現在の行を複製します
- TABで選択範囲をインデントします
(シフトキーを押しているとインデントを取り消します)
コードエディターの右下で使用されているトークン数を確認することができます。1つ
のプログラムは最大8192トークンを使用できます。各トークンは単語(変数名等)または
演算子です。左右括弧のペアや文字列は1トークンとしてカウントされます。カンマ、
ピリオド、LOCALキーワード、セミコロン、ENDキーワード、コメントはカウントされま
せん。
ボタン用の特殊文字はSHIFT-L、R、U、D、O、Xを押すか、CTRL-Kでグリフモードに切り
替えることで入力できます。
:: スプライトエディター
スプライトエディターではスプライト単位の編集とピクセル単位の編集の両方が行なえ
ます。画面下部のスプライトナビゲーターでスプライトシートの8x8ピクセル単位での
参照位置の指定が可能です。より大きなサイズや奇数のサイズを扱いたい場合は、自由
形状ツール(パン、選択)を使うこともできます。
描画ツール
- スプライト上でクリックまたはドラッグでピクセルを描画します
- 表示されている範囲に適用されます
- CTRLキーを押していると描画先と同じ色を探してすべて置き換えます
- 現在位置の色を選択するには右マウスボタンを使用します
スタンプツール
- クリックするとコピーした領域をスタンプします
- 左CTRLキーを押していると色番号0(黒色)を透明色としてスタンプします
選択ツール // ショートカット: 左SHIFTまたはSキー
- 選択領域を作成します
- ENTERキーまたはクリックで非選択状態になります
- ピクセル単位の選択でない場合は、ほとんどの操作がスプライト単位の選択領域に適
用されます
- 複数スプライトを選択するにはスプライトナビゲーターでSHIFTドラッグします
パンツール // ショートカット: SPACEキー
- スプライトシートの閲覧範囲を移動させます
塗りつぶしツール
- 現在の色で塗りつぶします
- 現在の選択領域に適用します
- どこも選択されていなければ表示されている範囲に適用されます
その他操作
- CTRL-Zで操作の取り消しをします // 0.2.0では1度だけ有効です
- CTRL-Cで選択領域または選択したスプライトをコピーします
- CTRL-Vで現在のスプライト位置にペーストします
- QキーとWキーで前後のスプライトに切り替えます
- 1キーと2キーで前後の色に切り替えます
- TABキーでフルスクリーン表示を切り替えます
- マウスホイールでズームします(フルクリーン表示では中央中心でズームします)
選択領域または選択したスプライトの操作
- Fキーで左右反転します
- Vキーで上下反転します
- Rキーで回転します(選択領域が正方形である必要があります)
- カーソルキーで移動します(スプライト選択時は循環します)
スプライトフラグ
8色の丸は現在のスプライトのスプライトフラグです。
各フラグはtrue(オン)かfalse(オフ)にでき、fset関数とfget関数でアクセスできま
す。スプライトフラグは0から番号が振られており、左から(0,1,2..7)となります。
詳細はfset関数の説明を参照してください。
:: マップエディター
PICO-8のマップは8ビットの値を持つ128x32(または共有領域を使った128x64の)のブ
ロックです。各値はスプライトへの参照(0-255)として表示されますが、任意の何かを
表すデータとしても使用できます。
ツールはスプライトエディターで使われているものと同じです。スプライトを選択して
クリックまたはドラッグでマップに描画してください。
- 複数のスプライトを描画するには、スプライトナビゲーターでSHIFTドラッグで選択
します
- 値のブロックをコピーするには選択ツールでコピーした後にスタンプツールでペース
トします
- マップを移動するにはパンツールを使うかSPACEキーを押し続けます
- QキーとWキーで前後のスプライトに切り替えます
:: SFXエディター
カートリッジ1つにつきサウンドと音楽で共用する64のSFX(効果音)があります。
SFXは32のノートを持ち、各ノートは以下の要素を持っています。
周波数 (C0-C5)
音色 (0-7)
音量 (0-7)
エフェクト (0-7)
SFXは以下の属性も持っています。
再生速度(SPD): ノートを再生する長さのティック数(フレーム数)
// 1が最も短く3は3倍長くなります
ループ開始位置と終了位置(LOOP): ループで戻ってくる位置と終端のノート番号
// ループは開始位置が終了位置以上だとオフになります
SFXの閲覧や確認をするためにピッチモード(効果音向け)とトラッカーモード(音楽向
け)の2つのモードがあります。左上のボタンかTABキーで切り替えることができます。
1. ピッチモード
ピッチエリアをクリックまたはドラッグすることで現在選択している音色(色で示さ
れます)を使って各ノートの周波数を設定します。
- シフトを押しながらだと選択された音色のみを適用します
- CTRLを押しながらだとノートをCマイナーペンタトニックスケールに自動調整しま
2. トラッカーモード
各ノートは次の要素を表示しています: 音階 オクターブ 音色 音量 エフェクト
- ノートを入力するには、q2w3er5t6y7ui zsxdcvgbhnjm (ピアノ風キー配置)を使い
ます
- 新しいノートには選択されている音色やエフェクトが使用されます
- ノートを削除するには、BACKSPACEキーを押すかボリュームを0に設定してください
- クリックとSHIFTクリックで範囲選択によるコピー(CTRL-C)とペースト(CTRL-V)が
可能です
3. 両モードの操作方法
- -と+キーで現在のSFXを切り替えます
- <と>キーでスピードを増減させます
- SPACEキーで再生/停止をします
- Aキーでサンプルのループ再生を解除します
- 左クリックと右クリックでSPDやLOOPの値を増加/減少させます
// クリック時にSHIFTを押していると4ずつ増加/減少させます
// もう一つの方法として、ドラッグで左右または上下に動かす方法があります
- 音色、エフェクト、音量をSHIFTクリックすることですべてのノートに適用できま
:: エフェクト
0 なし(None)
1 スライド // 次のノートまでスライドさせます
2 ビブラート // 高速に音程を1/4音の範囲で変化させます
3 ドロップ // 高速に周波数を低い値まで減少させます
4 フェードイン // 音量を0から徐々に上げます
5 フェードアウト // 音量を0へ徐々に下げます
6 高速アルペジオ // スピード4で4ノートのグループを繰り返します
7 低速アルペジオ // スピード8で4ノートのグループを繰り返します
もしSFXのスピードが8以下なら、アルペジオのスピードは2や4に半減されます。
:: 音楽エディター
PICO-8の音楽はパターンの連続として作成されます。それぞれのパターンはどのSFXを
そのチャンネルで再生するかを示す4つの数字のリストになります。
:: フローコントロール
再生方法は右上の3つのボタンを使って操作します。
パターンの再生が終わった時、以下に該当しなければ次のパターンを再生します。
- 再生する残りデータがない(音楽は止まります)
- そのパターンにSTOPコマンド(3つ目のボタン)がセットされている
- LOOP BACKコマンド(2つ目のボタン)がセットされている
(この場合、以前のパターンにLOOP START(1番目のボタン)がセットされているなら
そこに、見つからなかった場合はパターン0に戻ります)
パターンが異なるスピードのSFXを使用している場合、パターンはループではない最
も左のチャンネルが再生を終えた時に終了します。これは32で割り切れない変則的な
拍子記号や倍速のドラムビートなどを作成するのに用います。
:: カートリッジ間での音楽のコピー
パターンの範囲選択: パターンナビゲーターの最初のパターンを一度クリックし、最
後のパターンをSHIFTクリックします。選択されたパターンはCTRL-CとCTRL-Vでコ
ピーやペーストできます。他のカートリッジにペーストされるとき、もしそのパター
ンが参照しているSFXが存在しなければ、そのSFXもペーストされます。(異なる番号
になる場合があります)
================================================================================
Lua入門
================================================================================
PICO-8のプログラムはLua言語の文法で記述しますが、Luaの標準ライブラリは使用でき
ません。以下はLuaで必須となる文法の簡単な要約です。
より詳細や正規のLuaについて知りたい場合は、www.lua.orgを参照してください。
:: コメント
-- 行末までを無視させるにはこのように2つのハイフン(-)を使ってください
--[[ 複数行の
コメントです ]]
:: 型と代入
Luaの型には数値、文字列、ブーリアン(真偽値)、テーブルがあります。
NUM = 12/100
S = "THIS IS A STRING"
B = FALSE
T = {1,2,3}
PICO-8の数値はすべて16:16の固定小数です。値の範囲は-32768.0から32767.99になり
ます。
オプションとして小数部を持った16進数表記も使えます。
0x11 -- 17
0x11.4000 -- 17.25
ゼロ除算は最大の数値(0x7fff.ffff)として評価されます。
:: 条件分岐
IF NOT B THEN
PRINT("B IS FALSE") -- BはFALSE(偽)
ELSE
PRINT("B IS NOT FALSE") -- BはFALSEではない
END
-- ELSEIFありの場合
IF X == 0 THEN
PRINT("X IS 0") -- Xは0
ELSEIF X < 0 THEN
PRINT("X IS NEGATIVE") -- Xは負の数
ELSEIF X > 0 THEN
PRINT("X IS POSITIVE") -- Xは正の数
ELSE
PRINT("THIS IS LINE IS NEVER REACHED") -- この行は実行されません
END
IF (4 == 4) THEN PRINT("EQUAL") END -- 等しい
IF (4 ~= 3) THEN PRINT("NOT EQUAL") END -- 等しくない
IF (4 <= 4) THEN PRINT("LESS THAN OR EQUAL") END -- 以下
IF (4 > 3) THEN PRINT("MORE THAN") END -- より大きい
:: ループ
FOR X=1,5 DO
PRINT(X)
END
-- 1,2,3,4,5を出力します
X = 1
WHILE(X <= 5) DO
PRINT(X)
X = X + 1
END
FOR X=1,10,3 DO PRINT(X) END -- 1,4,7,10
FOR X=5,1,-2 DO PRINT(X) END -- 5,3,1
:: 関数とローカル変数
Y=0
FUNCTION PLUSONE(X)
LOCAL Y = X+1
RETURN Y
END
PRINT(PLUSONE(2)) -- 3
PRINT(Y) -- 0
:: テーブル
Luaのテーブルは複数の型が混在可能なキーと値のペアのコレクションです。整数の数
値をキーにすることで配列としても使用できます。
A={} -- 空のテーブルを作成する
A[1] = "BLAH"
A[2] = 42
A["FOO"] = {1,2,3}
-- デフォルトでは常にキーが1から始まる配列になります
A = {11,12,13,14}
PRINT(A[2]) -- 12
-- 1から始まるキーによるテーブル(配列)のサイズ
PRINT(#A) -- 4
-- 文字列のキーであればドット(.)記法を使用できます
PLAYER = {}
PLAYER.X = 2 -- PLAYER["X"]と同じです
PLAYER.Y = 3
-- 後述のAPIリファレンスのテーブルセクションも参照してください
:: PICO-8の省略記法
PICO-8にはいくつかの標準にはない頻出パターンのための略記法があります。
1. 1行のIF THEN END構文はTHENとENDを省略可能です
IF (NOT B) I=1 J=2
-- 次のコードと同じです: IF (NOT B) THEN I=1 J=2 END
-- 条件は常に括弧で括られている必要があることに注意してください
2. 単項演算子
a += 2 -- a = a + 2と同じです
a -= 2 -- a = a - 2と同じです
a *= 2 -- a = a * 2と同じです
a /= 2 -- a = a / 2と同じです
a %= 2 -- a = a % 2と同じです
3. !=演算子
略記法ではありませんが、PICO-8では「等しくない」を表すために~=に加えて!=も使用
できます。
================================================================================
APIリファレンス
================================================================================
PICO-8はLuaスクリプト言語で開発しますが、Lua標準ライブラリは含んでいません。代
わりにPICO-8の最小の仕様と限定された画面サイズを踏まえた少数のAPIを提供してい
ます。主要なAPIを使用している参考のプログラムとしては、/DEMOS/API.P8を参照して
ください。
ここで説明される関数は次の形式で書かれています。
関数名 引数 [オプション引数]
コンソールから使用されるシステム関数は通常の括弧と文字列の引用符を省略できます。
load blah.p8 --> load("blah.p8")
--------------------------------------------------------------------------------
システム
--------------------------------------------------------------------------------
load filename
save filename
カートリッジを読み込み、または保存します。
png形式で保存する場合は".png"を付けてください
-- 指定のない場合はテキスト形式(".p8")が使われます
- 両形式とも".p8"は省略可能で、自動で追加されます
save("blah") --> save("blah.p8")
save("blah.png") --> save("blah.p8.png")
load("blah.png") --> load("blah.p8.png") (blah.pngが存在しない場合)
- 読み込みについても同様です。対象ファイルが見つからない場合、PICO-8は".p8"
を追加して再試行します
- 読み込み時は".png"も省略可能です
load ("blah") --> "blah.p8"が存在しない場合、"blah.p8.png"の後に"blah.png"
を試みます
- 一度カートリッジが読み込みまたは保存されると、CTRL-Sでクイックセーブできる
ようになります
- ファイル名に"@clip"を指定することで、ホストOSのクリップボードに読み込みま
たは保存できます
:: テキストラベルとプレビュー画像つきでの.pngカートリッジの保存
カートリッジと一緒に保存されるプレビュー画像を作成するには、プログラム実行
中にF7を押して画面の表示内容を保存してください。また、'--'で始まる最初の2
行はカートリッジのラベルとして表示されます。
例:
-- OCEAN DIVER LEGENDS
-- BY LOOPY
:: .png形式でのコードサイズ制限
.png形式で保存する際、圧縮されたコードのサイズは15360バイト以下である必要
があります。コードの現在のサイズを知るには、INFOコマンドを使用してください。
圧縮済みサイズ制限は.p8形式で強制されません。ほとんどの場合トークン数制限
(8192)に先に到達するため、圧縮済みサイズを気にする必要はないでしょう。
folder
ホストOS上でカートリッジフォルダーを表示します。
ls
現在のフォルダーのすべてのファイルを表示します。
run
プログラムの先頭から実行します。
プログラムをリセットするためにプログラム内部から呼ぶことが可能です。
resume
既存のカートリッジ状態を維持したまま起動します。(型破りな方法です)
reboot
マシンを再起動します。
新しいプロジェクト開始する際に便利です。
info
以下のカートリッジ情報を表示します。
- コードサイズ、トークン数、圧縮済みサイズ
flip
バックバッファを画面に表示し(30fpsとして)次のフレームを待ちます。
通常は使用しないでください -- _draw関数が代わりに呼びます
プログラムがフレーム時間の終了前にflipコマンドを呼べず、_drawコールバック関
数が実行中でない場合、バックバッファの現在の内容が画面にコピーされます。
printh str [filename] [overwrite]
ホストOSのコンソールにデバッグ用に文字列を出力します。
filenameが指定されていると、文字列をホストOS上のファイルに追記します。
// (現在ディレクトリにあるファイルになります -- FOLDERコマンドで確認できます)
overwriteをtrueにすると、ファイルに追記ではなく上書きします。
ホストOSのクリップボードに書き込む場合は、ファイル名に"@clip"を指定してくだ
さい。
// クリップボードの内容を読み込むにはstat(4)を使用します。ただし、(セキュリ
// ティ上の問題により)クリップボードは実行中にユーザーがCTRL-Vを押した後にし
// か利用できません。
stat x
xの値に応じたシステムの状態を取得します。
0: メモリ使用量
1: 最後の画面更新時のCPU専有率 (1.0で100%使用)
4: クリップボードの内容 (ユーザーがCTRL-Vを押した後に有効)
16-19: チャンネル0-3で再生中のSFX番号
20-23: チャンネル0-3で再生中のノート番号(0-31)
extcmd x
Special system command, only works when running a local cart.
特別なシステム命令で、ローカルカットリッジ実行中のみ機能します。
xは文字列で、以下を指定できます。
"label" カートリッジのラベルを指定します
"screen" スクリーンショットを保存します
"rec" 動画の録画を開始します
"video" アニメGIFを保存します
--------------------------------------------------------------------------------
プログラム構造
--------------------------------------------------------------------------------
ユーザーが定義するとプログラム実行中に自動的に呼ばれる3つの特殊な関数がありま
す。
_update()
30fpsの更新タイミング毎に呼ばれます。
_draw()
画面の表示タイミング毎に呼ばれます。
_init()
プログラム開始時に一度だけ呼ばれます。
_draw関数は通常30fpsで呼ばれますが、間に合わない場合、PICO-8は15fpsでの実行を
試み、埋め合わせに1回の表示ごとに_update関数を2回呼びます。
:: PICO-8の60fpsでの動作
_update関数の代わりに_update60関数が定義されると、PICO-8は60fpsモードで動作
します。
- _update60関数と_draw関数は60fpsで呼ばれます
- 30fpsに落ちなければ、フレームごとに使用可能なPICO-8のCPU時間は半分になり
ます
** すべてのPICO-8が60fpsをサポートするわけではないことに注意してください。
60fpsをサポートしないマシンでは、代わりに30fpsでの_draw関数1回ごとに
_update60関数が2回呼ばれます。
以下のコードをあなたのコードの最後に加えることで、30fpsでのプログラム動作の
様子を確認できます。
u60=_update60 _update60=nil function _update() u60() u60() end
--------------------------------------------------------------------------------
グラフィックス
--------------------------------------------------------------------------------
PICO-8は128の8x8サイズのスプライトをシングルバンクで持っています。加えて、マッ
プの後半(共有データ)とオーバーラップする128のスプライトがあります。この256のス
プライトの集合はスプライトシートと呼ばれ、128x128サイズの画像としても扱うこと
ができます。
すべてのPICO-8の描画操作は現在の描画状態の適用対象となります。描画状態はカメラ
位置(すべての座標にオフセットを加えます)、パレット割り当て(スプライトの色を変
更します)、クリップ領域、描画関連の関数でオプションとして色が指定されなかった
時にデフォルトとして使用される描画色を含んでいます。
描画状態はプログラムが実行される度にリセットされます。これは以下のコードと同じ
です。
clip() camera() pal() color()
色番号:
0 黒色 1 暗い青色 2 暗い紫色 3 暗い緑色
4 茶色 5 暗い灰色 6 明るい灰色 7 白色
8 赤色 9 オレンジ 10 黄色 11 緑色
12 水色 13 藍色 14 ピンク 15 桃色
clip [x y w h]
ピクセル単位で画面の描画範囲を設定します。
clip()でリセットします。
pget x y
pset x y [c]
画面の座標(x, y)のピクセル色を取得、またはcに設定します。
sget x y
sset x y [c]
スプライトシートのピクセル色を取得、またはcに設定します。
fget n [f]
fset n [f] v
スプライトのフラグの値を取得、または値にvを設定します。
f: 0-7のフラグ番号です。
v: ブール値でtrueまたはfalseを指定します。
フラグ0-7の初期状態は、スプライトエディターの小さな色のついたボタンの列で設
定できます。
スプライトフラグの意味はユーザー次第で、どのスプライトのグループ(レイヤー)を
マップに描画するか指定するのに使うこともできます。
フラグ番号が省略されると、すべてのフラグはビット列として取得または設定されま
す。
fset(2, 1+2+8) -- ビット0、1、3を設定します
fset(2, 4, true) -- ビット4を設定します
print(fget(2)) -- 27 (1+2+8+16)
print str [x y [col]]
文字列を出力します。
strだけが指定された時、カーソルが画面の終端に到達すると、改行と縦方向のスク
ロールが自動的に行われます。(ターミナル風の動作)
cursor x y
カーソル位置を設定します。
color col
描画関数で使用されるデフォルト色を設定します。
cls
画面をクリアします。
camera [x y]
すべての描画命令について、画面のオフセットを(-x, -y)に設定します。
camera()でリセットします。
circ x y r [col]
circfill x y r [col]
半径rの円の輪郭線、または塗りつぶされた円を(x,y)に描画します。
line x0 y0 x1 y1 [col]
直線を描画します。
rect x0 y0 x1 y1 [col]
rectfill x0 y0 x1 y1 [col]
矩形の輪郭線、または塗りつぶされた矩形を描画します。
pal c0 c1 [p]
後続する描画命令ですべての色c0をc1として描画します。
pal()でデフォルト色にリセットします。(透明色の設定も含みます)
2種類のパレットがあります。(pはデフォルトでは0)
0 描画パレット: 描画時に色を変更します
// 例: スプライトの色を変更して描画します
1 画面パレット: 画面に表示されている色を変更します
// 例: フェードに使用します
c0: 0-15の色番号
c1: 置き換える先の色番号
palt c t
指定した色の透過処理をt(ブール値)に設定します。
透過処理はsprt、ssprt、map関数で反映されます。
例: palt(8, true) -- 赤いピクセルは描画されません
palt()でデフォルトにリセットします。(色番号0以外のすべての色は不透明になりま
す)
spr n x y [w h] [flip_x] [flip_y]
(x, y)にn番のスプライト(0-255)を描画します。
デフォルトの幅wと高さhは(1,1)で、何個分のスプライトの幅で描画するかを指定し
ます。
デフォルトでは色番号0は透明色として扱われます。(palt関数を参照してください)
flip_x: trueだと横方向に反転します
flip_y: trueだと縦方向に反転します
sspr sx sy sw sh dx dy [dw dh] [flip_x] [flip_y]
スプライトシート(sx, sy, sw, sh)から矩形を引き伸ばして(dx, dy, dw, dh)の矩形
として描画します。 // ピクセル単位で指定します
色番号0はデフォルトでは透明色として扱われます。(palt関数を参照してください)
dwとdhはデフォルトではsw、shと同じ値になります。
flip_x: trueだと横方向に反転します
flip_y: trueだと縦方向に反転します
--------------------------------------------------------------------------------
テーブル
--------------------------------------------------------------------------------
add t v
値vをテーブルtの最後に追加します。
t[#t+1] = vと同じです。
FOO={} -- 空のテーブルを作成します
ADD(FOO, 11)
ADD(FOO, 22)
PRINT(FOO[2]) -- 22
del t v
テーブルtの値がvの最初の要素を削除します。
連続するキー番号が非連続にならないよう、残りの要素のキー番号は1つ分小さくな
ります。
vは削除される要素の値であり、テーブルのキー番号ではないことに注意してくださ
い!
del関数はテーブルの繰り返し処理中に、テーブルの要素に安全に使用することがで
きます。
A={1,10,2,11,3,12}
FOR ITEM IN ALL(A) DO
IF (ITEM < 10) THEN DEL(A, ITEM) END
END
FOREACH(A, PRINT) -- 10,11,12
PRINT(A[3]) -- 12
all t
(1から始まるキー番号を持つ)テーブルのすべての要素について、追加された順にFOR
ループで繰り返します。
T = {11,12,13};
ADD(T,14)
ADD(T,"HI")
FOR V IN ALL(T) DO PRINT(V) END -- 11 12 13 14 HI
PRINT(#T) -- 5
foreach t f
テーブルtのそれぞれの要素について、要素を引数として関数fを呼びます。
FOREACH(T, PRINT)
pairs t
テーブルtについて、FORループで各要素のキーと値のペアを提供しながら繰り返しま
す。
all関数と違い、pairs関数は通し番号のキーかどうかに関係なくすべての要素を繰り
返します。順序は保証されません。
T = {["HELLO"]=3, [10]="BLAH"}
T.BLUE = 5;
FOR K,V IN PAIRS(T) DO
PRINT("K: "..K.." V:"..V)
END
出力:
K: 10 v:BLAH
K: HELLO v:3
K: BLUE v:5
--------------------------------------------------------------------------------
入力
--------------------------------------------------------------------------------
btn [i [p]]
プレイヤーp(デフォルトは0)のボタンiの状態を取得します。
i: 0-5(左ボタン 右ボタン 上ボタン 下ボタン ○ボタン ×ボタン)
p: 0-7のプレイヤー番号
引数が指定されないと、プレイヤー0と1の計12ボタンすべての状態をビット列として
返します。// P0: ビット0-5 P1: ビット8-13
プレイヤーボタンのデフォルトのキーボード割り当ては以下になります。
プレイヤー0: カーソルキー, Z,X / C,V / N,M
プレイヤー1: ESDF, LSHIFT,A / TAB,Q,E
btnp [i [p]]
btn関数と同じですが、前回のフレームでボタンが押されていなかった時のみtrueに
なります。またbtnp関数は15フレーム押され続けた後、4フレームごとにtrueを返し
ます。
'ボタンを押して次に進む'のような処理やメニューの操作などに有用です。
--------------------------------------------------------------------------------
オーディオ
--------------------------------------------------------------------------------
sfx n [channel [offset]]
n番のSFXをchannel(0-3)のチャンネルでoffset(0-31)の位置のノートから再生します。
nが-1でそのチャンネルのサウンドを停止します。
nが-2でそのチャンネルのループ再生を取り消します。
そのチャンネルで再生中のすべての音楽は停止します。
オフセットはノート単位(0-31)です。
channelが-1(デフォルト)だと自動的に使用されていないチャンネルを選択します。
// 何も再生されない場合は、music関数でchannel_maskを設定して、音楽再生がす
// べてのチャンネルを独占しないようにしてみてください
// (例: 最初の2つのチャンネルなら1+2)
music [n [fade_len [channel_mask]]]
パターンn(0-63)から始まる音楽を再生します。
nが-1で音楽を停止します。
fade_len: ミリセカンド単位です(デフォルトは0)
channel_mask: 音楽再生専用にどのチャンネルを予約するかを指定します
例: チャンネル0-2で再生する: 1+2+4 = 7
予約チャンネルは効果音の再生に使用することはできますが、チャンネル番号がsfx
関数によって明示的に指定された時のみになります。
--------------------------------------------------------------------------------
マップ
--------------------------------------------------------------------------------
mget x y
mset x y v
マップの(x,y)の値を取得、または値をvに設定します。
map cel_x cel_y sx sy cel_w cel_h [layer]
画面座標(sx, sy)(ピクセル単位)にmap(セル単位)の領域を描画します。
layerが指定されると、同じフラグ番号のセットのセルのみが描画されます。
// ビット列0x05はビット0とビット2のセットのスプライトのみを描画することを
// 意味します。デフォルトではすべてのスプライトを描画します
例外: スプライト0は常に空として扱われます。
例: map(0,0, 20,20, 4,2)
-> 画面の(20,20)にマップの(0,0)から始まる4x2のブロックを描画します
--------------------------------------------------------------------------------
メモリ
--------------------------------------------------------------------------------
PICO-8には3種類のメモリがあります。
1. ベースRAM: 以下のレイアウトをご覧ください。peek、poke、memcpy、memset関数
でアクセスします
2. カートリッジROM: 0x4300までのベースRAMと同じレイアウトです。reload関数で
カートリッジからベースRAMにコピーされます
3. Lua RAM (1MB): コンパイル済みプログラム+変数です。内部開発者以外は気にし
なくてよいでしょう
技術メモ: // 以下のことはおそらく知る必要はありません
エディター使用中、変更されたデータはカートリッジROMの中に存在しますが、sprや
sfxのような関数はベースRAMだけを操作します。PICO-8は以下の3つのケースで、自
動的にカートリッジROMをベースRAMにコピーします。(例:reload関数を呼ぶ)
1. カートリッジがロードされた時 (0.1.6より)
2. カートリッジが実行された時
3. 各エディターから抜けた時
:: ベースRAMメモリレイアウト
0x0 グラフィックス
0x1000 グラフィックス2/マップ2 (共有)
0x2000 マップ
0x3000 グラフィックス属性
0x3100 音楽
0x3200 SFX
0x4300 ユーザーデータ
0x5e00 永続カートリッジデータ (256バイト)
0x5f00 描画状態
0x5f40 ハード状態
0x5f80 GPIOピン (128バイト)
0x6000 スクリーン (8k)
ユーザーデータは決まった機能はなく、memcpy、peek、poke関数経由で何にでも使え
ます。永続カートリッジデータは0x5e00-0x5effに割り当てられますが、cartdata関
数が呼ばれた時だけ保存されます。色フォーマット(gfx/screen)は1バイト2ピクセル
で、下位ビットが各ペアの左のピクセルを意味します。マップフォーマットは1セル
1バイトで、通常スプライト番号を意味します。
peek addr
poke addr val
ベースRAMのアドレスの読み込み、または書き込みを行います。
正規のアドレス範囲は0x0-0x7fffです。
アドレス範囲外への読み込みまたは書き込みはエラーになります。
memcpy dest_addr source_addr len
ベースRAMのsourceからdestへlenバイトコピーします。
コピー範囲を重複させることが可能です。
reload dest_addr source_addr len [filename]
memcpyと同じですが、カートリッジROMからコピーを行います。
コードセクション(0x4300以上)は保護されており読み込むことができません。
ファイル名が指定されると、異なるカートリッジからデータを読み込みます。
cstore dest_addr source_addr len [filename]
memcpy関数と同じように、カートリッジROMからコピーを行います。
cstore()はcstore(0, 0, 0x4300)と同じです。
カートリッジの作成や、マップエディターやスプライトエディターが使用している
マップやスプライトシートの状態を確認するための書き込みツールとして使用できま
す。
コードセクション(0x4300以上)は保護されており書き込めません。
ファイル名が指定されると、データは直接ディスク上のカートリッジに書き込まれま
す。
64カートリッジまで1つのセッションで書き込むことができます。cstore関数を使用
する際の追加の説明は'カートリッジデータ'セクションをご覧ください。
memset dest_addr val len
lenバイトをvalに設定します
(かなり高速です -- クリップなしの水平方向スキャンライン等に使用できます)
--------------------------------------------------------------------------------
数学
--------------------------------------------------------------------------------
max x y
min x y
mid x y z
引数の中から、最大、最小、中間の値を返します。
例えば、mid(7,5,10)は7を返します。
flr x
x以下の最も近い整数を返します。 // x-(x%1)
flr(4.1) --> 4
flr(-2.3) --> -3.0
cos x
sin x
xの余弦(cos)と正弦(sin)を返します。1.0が一周期になります。
画面に合わせるためsinは正負が逆転しています。
例: sin(0.25)は-1を返します
yの反転をしないラジアンベースの三角関数が好みの場合は、プログラムの先頭に以
下のコードを挿入してください。
cos1 = cos function cos(angle) return cos1(angle/(3.1415*2)) end
sin1 = sin function sin(angle) return sin1(-angle/(3.1415*2)) end
atan2 dx dy
(dx, dy)を0-1の角度に変換します。
cos/sinと同様に、angleは画面上で反時計回りの方向になります。
例: atan(1, -1)は0.125を返します
sqrt x
xの平方根を返します。
abs x
xの(正の)絶対値を返します。
rnd x
0以上x未満の乱数nを返します。
整数が必要な場合は、flr(rnd(x))を使用してください。
srand x
乱数のシードを設定します。
シードはカートリッジ起動時に自動的にランダム化されます。
ビット単位操作
band x y
bor x y
bxor x y
bnot x
shl x y
shr x y
// シフトは論理シフトです(符号ビットはシフトしません)
--------------------------------------------------------------------------------
カスタムメニューアイテム
--------------------------------------------------------------------------------
menuitem index [label callback]
ポーズメニューに要素を追加します。
番号は1-5の範囲で、各メニューアイテムが表示される順序を決定します。
labelは16文字までの文字列です。
callbackはユーザーがアイテムが選択した時に呼ばれる関数です。
ラベルや関数が指定されなかった場合、メニューアイテムは削除されます。
例: menuitem(1, "restart puzzle", function() reset_puzzle() sfx(10) end)
--------------------------------------------------------------------------------
文字列
--------------------------------------------------------------------------------
s = "the quick brown fox"
-- 長さ
print(#s) --> 19
-- 文字列の結合
print("three "..4) --> "three 4"
-- sub()で部分文字列を取得する
print(sub(s,5,9)) --> "quick"
print(sub(s,5)) --> "quick brown fox"
--------------------------------------------------------------------------------
カートリッジデータ
--------------------------------------------------------------------------------
各カートリッジは(カートリッジそのものではなく)ユーザーのPICO-8に64の数値(計256
バイト)を保持することができます。これはハイスコアやプレイヤーの進行状況のよう
なデータを保存する手軽な方法として使えます。
256バイトよりも多く必要な場合、cstore関数を使って直接カートリッジに書き込むこ
とができます。この方法の欠点は特定バージョンのカートリッジにデータが紐づけられ
てしまうことです。例えば、もしゲームが更新されるとプレイヤーはセーブデータを
失ってしまいます。
それ以外の方法はcstore関数の4つめのパラメータを指定して2番目のカートリッジに直
接書き込むことです。この方法はカートリッジ交換を必要とし(その分少し遅くなり)、
ローカルフォルダで実行している場合はdata-cartのゴミが残ります。
cartdata id
カートリッジを読み込んだら一度呼んでください。idは64文字までの文字列で、他の
カートリッジが偶然同じidを使うことがないようユニークである必要があります。
例: cartdata("zep_jelpi")
使用可能な文字はa-z、0-9、アンダースコア(_)です。
データが読み込まれるとtrueを返します。
cartdataはカートリッジ実行ごとに1度だけしか呼べません。
cartdata idが設定されると、メモリの0x5e00-0x5effが永続領域に割り当てられ、直
接またはdget/dset関数経由でアクセスできます。
dget index
指定した番号(0-63)の領域の値を取得します。
cartdata関数を呼んだ後に使用してください。
dset index value
指定した番号(0-63)の領域に値を書き込みます。
cartdata関数を呼んだ後に使用してください。
書き込まれたデータに保存操作は必要ありません。
-- 直接poke関数で操作されても自動で永続ストレージに保存されます
--------------------------------------------------------------------------------
GPIO
--------------------------------------------------------------------------------
GPIOは汎用入出力(General Purpose Input Output)を表し、マシン間の通信を可能にし
ます。 PICO-8は0x5f80-5fffの範囲をGPIOピンに割り当てており、poke関数(値の書き
出し -- 例:LEDを点灯させる)やpeek関数(値の読み込み -- 例:スイッチの状態を取得
する)による操作が可能です。
GPIOはホストプラットフォームによって異なる意味になります。
CHIP : 0x5f80-0x5f87がxio-p0 - xio-p7に割り当てられます
Pocket CHIP : 0x5f82-0x5f87がGPIO1-GPIO6に割り当てられます
// xio-p0とp1はケース内のプロトタイピング領域にあります
Raspberry Pi: 0x5f80-0x5f8fはwiringPiピンの0-7に割り当てられます
// 異なるモデル向けのマッピングは http://wiringpi.com/pins/ を参
// 照してください
CHIPとRespbery Piの値はすべてデジタルで、0(L0W)または255(HIGH)になります。
GPIOピンにアクセスする際は、次のようにPICO-8をルート権限で実行する必要があるこ
とに注意してください。
sudo pico8
接続されたLEDをONとOFFで点滅させるシンプルなプログラムです。
t = 0
function _draw()
cls(5)
for i=0,7 do
val = 0
if (t % 2 < 1) val = 255
poke(0x5f80 + i, val)
circfill(20+i*12,64,4,val/11)
end
t += 0.1
end
:: HTML
HTML/JavaScriptとして出力されたカートリッジは整数のグローバル配列
(pico8_gpio)をGPIOピンとして使用します。呼び出し元のHTMLは次のように配列を宣
言する必要があります。
var pico8_gpio = Array(128);
--------------------------------------------------------------------------------
バージョン履歴
--------------------------------------------------------------------------------
v0.1.10
Added: Multi-cart export in html
Added: Cart reset glitch
Added: Demo carts: bounce, sort
Added: .p8 format can now store cart labels
Added: Splore navigation keys: pageup/down, home, end
Added: Splore useage hint shown on empty favourites list
Added: Warning on boot when data folder is read-only or can't be created
Added: Pressing tab with code selected indents those lines (shift-tab to un-indent)
Added: Double click word to select it
Added: Trigger screenshot/video/label capture from inside program: extcmd()
Changed: CTRL+left/right in code editor skips to end of word or span of non-whitespace
Changed: When a cart terminates from splore, button press is required to continue
Changed: load("@clip") can only be called from commandline (security)
Fixed: Can over-allocate host memory if exceed it within one frame
Fixed: atan2(-1, -32768) crash, and error for small values of dy
Fixed: (Web) using cstore() on self causes unloadable cart (bug introduced in 0.1.8?)
Fixed: (web) Pressing ctrl-v crashes the player (should do nothing)
Fixed: (Raspberry Pi) WiringPi library required in static build
Fixed: (Raspberry Pi) Crash on exit when launching via desktop icon
Fixed: (Raspberry Pi) keyboard input broken (observed on raspi2s)
v0.1.9b
Added: Alternative function key mapping: ctrl-6..9 for F6..F9
Added: Alternative glyph entry method: (ctrl-k) to toggle glyph mode
Changed: Enter glyphs with shift a..z, but can be disabled in config.txt
Changed: Increased emscripten ram to 128MB (some carts at risk of running out)
Fixed: Crash when window size is tiny or minified
Fixed: Crash on toggling fullscreen mode
Fixed: printh can write files outside filetree (security issue)
Fixed: show_fps (can also now be toggled with ctrl-1)
Fixed: Shorthand if/then syntax error when using the form: (functionname)(param)
Fixed: log.txt not saved in path specified by -home switch
Fixed: Default application data folder created even when -home specified
Fixed: Missing dynamic builds (pico8_dyn) from linux archives
Fixed: Removed unneeded RPATH from linux binaries
Fixed: export foo%d.wav fails to write multiple files
v0.1.9
Added: Copy and paste sprites and whole cartridges directly to BBS posts
Added: JAM category in splore
Added: GPIO support for Raspberry Pi
Added: Read clipboard using stat(4) after user presses CTRL-V
Added: printh() can optionally write to a file or the host clipboard
Added: Editor tool information and tips shown on mouseover
Added: Set desktop path with -desktop (screenshots and gifs are saved here)
Added: Warning on saving .p8 when compressed code size exceeds .p8.png limit
Added: Alternative editor colours // config.txt: gui_theme 1
Added: Dotted line every 8 rows in song view
Added: -screenshot_scale (default: 3) and -gif_scale (default: 2)
Added: Can use ctrl-up, ctrl-down to jump to start and end of code
Added: CTRL-M to mute/unmute sound
Added: HTML5-exported carts support 60fps
Added: Timeout switch for splore downloads: -timeout
Changed: Glyph characters typed with alt + a..z
Changed: stat(0) does not include allocations waiting to be garbage collected
Changed: Unfiltered screen stretching at integer scales by default
Changed: Removed -aspect and -scale settings (use draw_rect instead)
Fixed: -home has no effect under Windows
Fixed: Sometimes frame skipping starts before CPU useage has reached 100%
Fixed: Double-speed BTNP() timing in 60fps mode
Fixed: Exported HTML fails when _update60 is used instead of _update
Fixed: Can't copy and paste button glyphs
Fixed: Lines containing glyphs do not scroll far enough horizontally
Fixed: Loading .p8 renamed as .p8.png from splore freezes
Fixed: Bucketfill in map doesn't sync to shared memory
Fixed: fset fails when de-setting flags
Fixed: Syntax error when beginning with the form: IF (..) [OR|AND]\n
Fixed: cls() costs twice as much cpu as it should
Fixed: wav file exporter missing some data / writing truncated buffers
Fixed: Entering new notes in song view doesn't observe current volume, instrument
Fixed: alt-tab sometimes generates alt character text entry event
Fixed: Resuming a cancelled download in splore causes crash
Fixed: Controller attributes in log.txt always shown as -1
v0.1.8
Added: 60fps support
Added: Music exporter
Added: Custom GIF length (maximum 120 seconds)
Added: -,+ to navigate sprite tabs, sfx, music patterns
Added: sfx editor: navigate with home, end, pageup/down, mousewheel
Added: <, > to modify sfx speed, or click and drag
Added: Middle mouse button to pan around spritesheet / map
Added: Shortcut command for splore: S
Added: Pre-installed selection of BBS cart (use INSTALL_GAMES)
Added: Warning when saving .p8.png with no label
Added: (OSX) logging to ~/Library/Logs (viewable with Console.app)
Changed: Can not CTRL-S save over a loaded bbs cart
Changed: Only .p8 files listed by dir() and by splore
Changed: Command history increased to 256
Changed: exit() / shutdown() have no effect while running cart
Fixed: Memory useage (stat(0)) inconsistent across host platforms
Fixed: Spinny disks shows when reloading current cart with load()
Fixed: GIF saver does not respect 64x64 / mirrored modes
Fixed: Miscellaneous multi-line comments / strings issues
Fixed: Empty map cels cost cpu in mapdraw()
Fixed: mapdraw() slowdown when drawing bottom half of map
Fixed: preprocess changes semantics when += and : operators on same line
Fixed: Identifiers starting with underscore counted as extra token
Fixed: Saving .png exceeding compressed code limit fails silently
Fixed: Right-clicking a sprite does not set the currently edited sprite
Fixed: (Windows) extra space added to pasted lines
Fixed: spr() expensive when drawn with low negative coordinates
Fixed: pipe character identical to colon character
Fixed: (Raspberry Pi) shift key appends a character when entering text
Fixed: Editor mode buttons are still clickable during cart runtime
Fixed: When loading a .p8.png file, label is reset and needs to be re-captured
Fixed: export() does not report failure
Fixed: mset()'d changes in shared memory not readable via peek() / sget()
Fixed: cstore() saving edited code
Fixed: audio pop between patterns during music playback
v0.1.7
Added: menuitem()
Added: button glyphs in code (shift-L, R, U, D, X, O)
Added: Customisable data directory (e.g. pico8 -home mydata)
Added: Web gpio pins: read and write pico8_gpio[] in javscript
Fixed: SPLORE search doesn't reset
Fixed: Splore skipping 33rd cart listing after loading more items
Fixed: Crash when selecting a local binary file in splore
Fixed: Semicolon can't be used as a list or statement separator
Fixed: Exported html can not cstore self
v0.1.6
Added: SPLORE local & bbs cartridge explorer
Added: setmetatable(), cocreate(), coresume(), costatus(), yield()
Added: Spinning cart icon to show when a cart is swapped / written to
Added: Permanent storage when carts played in a browser
Added: Adjustable aspect ratio (-aspect 420 for 1:1)
Changed: Lua memory limit: 1024k (was 512k)
Changed: Music channel now resumes after being clobbered by an sfx
Changed: Arpeggios double speed when SFX speed <= 8
Changed: Exceeding compressed code limit does not block saving in .p8 format
Changed: spr() half as expensive, to be consistent with map()
Changed: Fractional hex number notation: 0x0.3 == 0x0.3000, (was 0x0.0003)
Changed: : operator doesn't count as an extra token (same as .)
Changed: cstore() writes directly to disk
Changed: cstore(), reload() return number of bytes read / written
Changed: save() while running does nothing. (use cstore() instead)
Changed: load() while running loads and runs the specified cartridge
Fixed: Small pops in audio mixer caused by sound wave discontinuities
Fixed: HTML5-exported sound clicks badly under Chrome
Fixed: Display palette is not oberserved when exporting GIFs
Fixed: Rapid keypresses causes duplicate readings in tracker & text editor
Fixed: += inside comments breaks preprocessor
Fixed: sspr() cpu cost the same when clipped
Fixed: cartdata() with bad parameters crashes
Fixed: EXPORT from commandline can not be used without brackets and quotes
v0.1.5
Added: Raspberry Pi Build
Added: Keyboard configuration for player buttons (KEYCONFIG)
Added: Music tracker select / copy / paste
Added: Single-level undo in audio tools
Added: Live preview of frequencies in sound editor
Fixed: Command history extends past last reboot
Fixed: Sfx exporter broken
Fixed: Slashes at end of path resolve to double slashes
Fixed: Load cart from commandline under Windows
v0.1.4d
v0.1.4c
Fixed: International character entry inserting extra characters
Fixed: Lines with tabs have broken cursor placement and display boundary
v0.1.4b
Fixed: OSX command-key combinations broken
v0.1.4
Added: spritesheet importing and exporting with import("blah.png"), export("blah.png")
Added: sfx exporting with export("blah%d.wav")
Added: External cartridge parameter for reload() and cstore()
Added: Persistent cartridge data mapped to 0x5e00
Added: Click token limit to toggle token & char limit display
Added: assert(), type()
Added: P to pause
Changed: code char limit: 64k (was 32k)
Changed: local declarations and semicolons not counted as tokens
Changed: Pairs of brackets and block delimitations count as one token
Changed: Only _update() or _draw() need to exist to enter main loop
Changed: Allow forward-slash in code editor
Changed: info() reports current (last loaded or saved) filename
Changed: html5 version compiled with NO_DYNAMIC_EXECUTION
Changed: can only cstore up to 64 different files in one session
Changed: load() automatically copies data section of cart to base ram
Fixed: Shift-drag-copy sprites -> paste only pastes 1x1
Fixed: ".." should count as one token
Fixed: Tracker displaying D instead of .
Fixed: Multi-line comments
Fixed: Crash on run when code close to char limit
Fixed: When over token limit, can not run any command
Fixed: Unused high bits in SFX section not saved in .p8 format
Fixed: Camera position memory mapping out of sync
Fixed: pico8.txt link broken in windows installer
Fixed: print() crashes when parameter is not a string or numbers
Fixed: Multi-line strings & escape chars mess up tokenizer and print()
Fixed: Joystick not responding when left stick is up to the left
Fixed: Alt-F4 saves screenshot before quitting
Fixed: Sprite editor mode button doesn't show fullscreen mode
Fixed: -sound parameter not working in html5 version
v0.1.3
Added: paste into commandline
Fixed: lua standard libraries accessible
Fixed: command-line loading doesn't work
Fixed: music pattern finished too early when all tracks set to looping
Fixed: peek()ing odd bytes in sfx address space masks bit 7
Fixed: cstore and reload from code space should have no effect
v0.1.2
Added: html5 cartridge exporter
Added: Cartridge save data (64 fixed point numbers)
Added: 8-player input
Added: Demo carts: COLLIDE and BUTTERFLY
Added: Command-line parameters // load cart, -run, settings
Added: Alternative function keys (F6..F9 aliased as F1..F4)
Added: pairs()
Added: printh() for debugging
Added: Tab completion for filenames in console
Added: stack trace on runtime error
Changed: music pattern length taken to be first non-looping channel's length
Changed: noise instrument (6) has low frequency white noise scaled by volume
Changed: screenshot captures whole window contents at display resolution
Changed: del() moves remaining items up one index to maintain a packed table
Changed: add(),del(),count(),all() no longer store extra fields
Changed: removed count() from docs -- now just a legacy function. Use # operator instead.
Changed: cursor only blinks while window is active
Changed: peek(), poke() and binary operations (band()..) have no function call overhead
Changed: yellow slightly warmer
Changed: No camera snapping after pan in map mode
Fixed: sqrt() crashing for 0 or >= 32761
Fixed: Semi-colon characters in text editor
Fixed: Long lines split when saving in .p8 format
Fixed: pget() does not respect camera position
Fixed: Error message when peeking or poking outside of legal address space
Fixed: Search replace colour fills one pixel outside of selected region
Fixed: Playing an empty music pattern breaks subsequent music playback
Fixed: Invalid sfx editing state on startup
Fixed: Painting instruments values in frequency view also sets volumes
Fixed: Inconsistent gif recording speeds
Fixed: Unmapped joystick support
Fixed: Compressed code size sometimes larger than uncompressed
Fixed: mid() fails when first argument is not smallest
Fixed: Scroll wheel changes sprite/map zoom while in code editor
Fixed: CTRL-R (quick-run) drawing over current line in command mode
Fixed: Label capture (F7) does not respect screen palette state
Fixed: Syntax highlighting of api functions and hex numbers
Fixed: Looping to 0 with negative step finishes at 1
Fixed: nil values printed as false instead of nil
Fixed: Hexedecimal fractional parts
Fixed: btnp() unresponsive when skipping frames
Fixed: Editing mode is lost when using ctrl-r to run
Fixed: Tracker note entry keys mapped, messing up piano-like layout
Fixed: Shared gfx/map memory out of sync after some editor operations
Fixed: Alt-gr character entry
Fixed: Can map display palette to entries >= 16 using poke()
Fixed: Using shift to select in code editor has wrong selection range
Fixed: Dragging above top of text causes selection to flip to end
Fixed: Duplicate at end of file listing
v0.1.1
Added: Token-based code limiting (8192 tokens, 32k ascii text)
Added: Freeform move, pan and selection in sprite and map editors
Added: Flood-fill tool (sprite and map)
Added: .GIF saver
Added: CTRL-Stamp to stamp with transparency
Added: Single-step undo for map and sprites
Added: 2x2 brush
Added: sqrt(), atan2()
Added: CTRL-S to quick-save
Added: CTRL-R reloads .p8 file and runs (useful for external text editing)
Added: Automatic backups on overwriting or quitting without saving
Added: Scroll wheel zooms in sprite editor
Added: Customisable resolution // e.g. pico8 -width 580
Added: Strings highlighted as green
Added: ALT-click can optionally simulate right click (see config.txt)
Added: palt() to control transparency for spr(), sspr()
Added: info()
Changed: load() tries adding .p8.png, .png if file doesn't exist
Changed: Draw operations apply only to selection when active
Changed: Move operations (cursors) apply to selection if present
Changed: Removed time()
Changed: Random seed is random on cart startup
Changed: api functions never read directly from cart rom
Changed: sspr() can take negative values for dw, dh
Fixed: Sparse table indexing with integers fails
Fixed: Assignment operators and shortform if-then-else failing
Fixed: sspr() failed when w0 == 128
Fixed: Circle drawing broken when camera not (0,0)
Fixed: CPU hogging
Fixed: Noise instrument clobbers rnd() sequence
Fixed: Audio system not resetting on program reset
Fixed: % operator sometimes wrong for negative values
Fixed: Length operator (#)
Fixed: Power operator (^)
Fixed: Line clipping bug on right and bottom edges
Fixed: print() precision for whole numbers
Fixed: print() broken for negative y values
Fixed: tokenization and keyword highlighting
Fixed: sprite properties not copied/pasted
Fixed: Only sfx 0..32 could be used as music patterns
Fixed: Saving and loading a .p8 file adds newline to end of code
Fixed: Drag selection to left margin in code editor -> selects all
v0.1.0
Added: demo cart: hello.p8 (use install_demos)
Added: CTRL-R from anywhere to run cart or restart cart
Added: use a,s to select colour in gfx editor
Added: black background behind
Added: consistent operation cpu costs
Added: btn(), btnp() with no arguments returns bitfield
Added: fget(id) returns bitfield of that sprite's flags
Changed: renamed mapdraw() to map() for consistency
Changed: default sleep time is 5ms (better cpu consumption for laptops)
Fixed: memory limiter
Fixed: wonky line and circle drawing
Fixed: shift-click volume in sfx editor to set all
Fixed: number formatting is now never in scientific notation
Fixed: clipped error messages in console
Fixed: text undo stores rollback points when chaning line number
Fixed: print(str) carriage returns to previous x
v0.0.5
Added: help()
Added: Ctrl+F / Ctrl+G to search for text, repeat search
Added: del key in code editor
Added: Short-hand single-line IF statements
Added: Unary operators += -= /= *= %=
Added: srand(), time(), added rnd() to docs
Added: Ctrl+D to duplicate line
Added: interactive ls() for multi-page file listings
Added: band() bor() bxor() bnot() shl() shr()
Added: runtime error line number
Added: dir() (aliased to ls())
Changed: print() only autoscrolls when called with no parameters
Changed: alt+up/down to skip between function definitions (was ctrl)
Changed: sspr() dw, dh defaults to sw, sh
Fixed: Load crashes on files that are not .p8 format or directories
Fixed: Misc editor cursor position glitches
Fixed: Crash when syntax error occurs before viewing code
Fixed: Broken newlines after rebooting
Fixed: mkdir() called with no parameters creating "(null)" directory
Fixed: scrolling past top of code with scrollwheel
Fixed: alt-f4 to fastquit
v0.0.4
Added: Jelpi demo cart
Added: Internal carts // use install_demos()
Added: Joystick support
Added: Undo/redo in code editor
Added: Scroll wheel in code editor
Added: LCTRL + UP/DOWN to navigate functions in code editor
Added: LALT + LEFT/RIGHT to switch editing modes
Added: btnp()
Added: Release looping sample (a in editor , sfx(-2, channel) in code)
Changed: Music stops when pausing program execution
Changed: Allow 8 settable sprite flags
Changed: Made noise instrument more bassy
Fixed: Home, end keys
Fixed: Sprite flags 4,5 not saved
Fixed: mset() discarding 4 high bits
Fixed: Crash when highlighting long strings
v0.0.3
Added: Palette mapping type 1 (on display)
Added: Collections can be initialized with c={1,2,..}
Added: holdframe() // used automatically by _draw(), update()
Added: Sprite selections and operations across selections
Added: Map selection and stamp tool
Added: Immediate mode screen buffer preserved while switching views
Added: Channel mask for music playback
Added: Memory mapping for live sound data
Added: .png cart format
Added: Sprite navigation by keyboard (-, +)
Fixed: Strict 4-channel sound
Fixed: Automatic sfx channel selection (channel index: -1)
v0.0.2
Added: Command history
Added: P2 keys
Added: Boot sequence
Added: Windows, 64-bit linux builds
Added: CPU cost of internal api functions
Added: Separate song channel index and mute status
Added: Memory mapping
Added: Search/replace colour in sprite editor
Added: Copy/paste sprites and map regions
Improved: Immediate mode command editing
Improved: Editor cursor behaviour
Fixed: Automatic audio channel selection
v0.0.1
First Alpha