VimからPICO-8・TIC-80・LÖVEをお手軽に使えるようにする
色々あって更新がだいぶ久しぶりになってしまいました。
ここ一年くらい、2D系のゲームエンジンをちょこちょこいじって楽しむことが多かったのですが、その中でも触れる機会が多かったのが以下の3つのゲームエンジンです。
参考(Fantasy Console Game Jam 3):
どのエンジンも、Lua等のスクリプトで気軽にゲーム開発を始められるのが魅力ですが、せっかくならVimから簡単に実行できるようにして、もっと手軽にコーディングを楽しみたい!ということで、専用の実行コマンドを作成してみることにしました。
やりたいこと
- VimのコマンドでPICO-8、TIC-80、LÖVEを起動する
- その際に、現在編集中のソースコードを自動的に実行する
- LÖVE場合は自動で起動フォルダを探して指定する
- WindowとMacのどちらでも同じコマンドが使える
思いついたらさっとコードを書いて、面倒な設定なしにショートカットを押すだけで即実行、というのが目指す姿です。
なお、TIC-80はコードをテキスト形式で保存可能な$5の有料版を使用します。
実現方法
当初はvim-quickrunで実現しようと思ったのですが、OSごとに処理を振り分けたり、バックグラウンドで実行したかったりと、色々調整が必要だったので、独自コマンドを作成する方針に切り替えました。
コード
作成したVim scriptがこちら。
if has('mac') let s:pico8 = "/Applications/PICO-8.app/Contents/MacOS/pico8" let s:tic80 = "/Applications/tic80.app/Contents/MacOS/tic80" let s:love = "/Applications/love.app/Contents/MacOS/love" elseif has('win32') || has('win64') let s:pico8 = "C:/Program Files (x86)/PICO-8/pico8" let s:tic80 = "C:/Program Files (x86)/tic80_pro_0.60.3/tic80" let s:love = "C:/Program Files/LOVE/love" endif function! s:Run(c) if has('mac') execute 'silent !' . a:c . '&' elseif has('win32') || has('win64') execute 'silent !start ' . a:c endif endfunction function! s:RunPico8(...) call s:Run('"' . s:pico8 . '" -run %') endfunction function! s:RunTic80(...) call s:Run('"' . s:tic80 . '" -code-watch %') endfunction function! s:RunLove(...) let l:dir = fnamemodify(findfile('main.lua', expand('%:p:h') . ';'), ':p:h') call s:Run('"' . s:love . '" ' . l:dir) endfunction command! Pico8 call s:RunPico8() command! Tic80 call s:RunTic80() command! Love call s:RunLove()
動作の流れ
最初にMac、Windowsそれぞれの各エンジンのパスを指定し、それをベースにs:RunPico8
、s:RunTic80
、s:RunLove
の各関数で実行コマンドを作成しています。実行コマンドはs:Run
関数でOSに適した形でバックグランド実行されます。
ちょっとトリッキーなのはLÖVEの実行コマンド作成箇所で、以下のコードにより
let l:dir = fnamemodify(findfile('main.lua', expand('%:p:h') . ';'), ':p:h')
作成中のファイルがあるフォルダから、ルートフォルダにさかのぼりながら、main.lua
を含むフォルダを探して、それをプロジェクトのフォルダとして使用するようにしてあります。
PICO-8の起動方法
Vimで.p8ファイルを保存した後に、コマンド:Pico8
を実行すると、PICO-8が起動してファイルが自動実行されます。
PICO-8起動後はコードを更新するごとに、PICO-8 上でCommand(またはCTRL)+r
を押すとファイルが再読み込みされます。
なお、新規に.p8ファイルを作成した際はコードの先頭に以下のヘッダを記述する必要があります。(v0.1.11g時点のもの)
pico-8 cartridge // http://www.pico-8.com version 16 __lua__
.vimrcに以下のように記述すると、luaのシンタックスハイライトの適用とヘッダの挿入を自動で行います。
function! s:EditPico8() set filetype=lua if getline(1)[:5] != 'pico-8' call append(0, 'pico-8 cartridge // http://www.pico-8.com') call append(1, 'version 16') call append(2, '__lua__') endif endfunction augroup pico8 autocmd! autocmd BufRead,BufNewFile *.p8 call s:EditPico8() augroup END
TIC-80の起動方法
Vimで.lua/.moon/.jsファイルを保存した後に、コマンド:Tic80
を実行すると、TIC-80が起動してファイルが自動実行されます。
TIC-80起動後はコードを更新するごとに、TIC-80上でCommand(またはCTRL)+r
を押すとファイルが再読み込みされます。
なお、TIC-80はPICO-8と異なり、TIC-80側からファイルを上書きすると、規定の保存用フォルダに同名の別ファイルが作成されてしまうため、TIC-80のfolder
コマンドで開かれる保存用フォルダにファイルを作成するのが無難です。
LÖVEの起動方法
プロジェクトフォルダ内の任意の.luaファイルを保存した後に、コマンド:Love
を実行すると、LÖVEが起動してファイルが自動実行されます。
編集するファイルはプロジェクトフォルダ内のものであればどれでも大丈夫ですが、LÖVEのルールとして、プロジェクトファイルの直下にmain.lua
ファイルが存在している必要があります。