読者です 読者をやめる 読者になる 読者になる

ごちゃログぴこっ

はなまるデジタル創作紀行(DTM、TAS、いろいろな技術)

VisualBoyAdvance でキー入力をAVIに出力するには?

ゲーム ゲーム-TAS 技術 技術-プログラミング 技術-プログラミング-Lua

Web拍手経由でご質問いただきました。

VisualboyAdvanceでLuaでの入力表示に関して色々とぐぐってたら、vba-rerecording rr22?とかいうのでjoypad.getdown(int port)という文章を見つけたので、RamWriter.lua(空白区切り版)という奴に file:write(string.format("%d ", joypad.get())) というのを書いて見たんですが、普通にエラーで出てしまいました。これってどういう風に Joypad.get を書けば入力キーを出力できるようになるんでしょうか?

AVIファイルにキー入力を表示させたいという観点でいくつかお答えします。

Lua を使わずにキー入力を AVI に書き出すアプローチ

ただ AVI に Input Display の表示を書き出すだけなら、Lua を使わなくてもできます。

  1. 「,」キーを押して Input Display を表示する。
  2. AVI にも表示されるように、HUD の表示を In Game に変更する(下記画像参照)。
  3. AVI の録画を行う。

利点は実現が楽なことです。欠点は表示形式をカスタマイズできないことです。

Lua を使ってキー入力を得るには?

まず最初に、以下の記事からスクリプトを再度ダウンロードしてください。数あるエミュレータの中でもVBAはAVI書き出し時にフレームが複製されて記録される問題があり、本日それに対する対応コードを加筆しました。

file:write(string.format("%d ", joypad.get())) というのを書いて見たんですが普通にエラーで出てしまいました。

joypad.get() の戻り値は table 型です*1が、%d で number 型の出力を行おうとしているからエラーが出ます。

賢い方法はともかく、メモリの値を出力する場面で以下のようなコードを書けば、Aボタンが押されているかいないかを記録できます。

-- RamWriter.lua:
local pad = joypad.get(1)
framedata = framedata .. string.format("%d ", (pad.A and 1 or 0))

対応する読み込み側の一例は次のような感じです。

-- RamReader.lua:
i = file:read("*n"); frame[f].A = ((i ~= 0) and true or false)

*1:print( joypad.get() ) を行ってみるとより詳しく中身がわかります。