伊代かわいいよ伊代移植パッチとは別口で(また一部の人しか判らないことを)
先日 ONScripter での連番画像を使ったムービー再生について考える機会がありました。
ちなみに最近の作業物では、めんどくさいので実は盛り込んでなかったんですよね。
しかしあるとないとじゃ没入感がやはり違ってくるので真面目にやってみようかと。
大本は変わらずすとーむさん製の連番ムービー再生スクリプトです。改めてありがとうございます。
1から順次画像をチェック(fileexist)して画像枚数を測定し、経過時間でフレーム制御するというこの方式。
PSPで使用する際のネックは、測定に要する時間が非常に長くなってしまうという点でした。
以前カタハネ等で組み込んだ時は、測定を終盤まで100枚単位で行って多少測定時間を短くしてはいたのですが、まだまだ長すぎです。
そこで今回はバイナリサーチ(二分探索)による測定時間短縮を目論んでみました。
*movie
getparam $1,%1 ;movie "ムービーのBGMファイル",再生時間
saveoff
fileexist %2,$1:if %2=0 return
csp -1
csp2 -1
split $1,".",$2:add $2,"-"
mov %2,0:mov %3,7 ;画像ファイルは movie-0000001.jpg のような7桁連番で
mov %4,5000 ;上限値設定
for %0=0 to 100
itoa $0,%4:len %5,$0:mov %5,%3-%5
for %6=1 to %5:mov $0,"0"+$0:next
fileexist %2,$2+$0+".jpg"
if %2=1 add %4,5000
if %2=0 break
next
mov %7,0 ;下限値設定
for %0=0 to 999999
mov %8,(%7+%4)/2 ;中央値
itoa $0,%8:len %5,$0:mov %5,%3-%5
for %6=1 to %5:mov $0,"0"+$0:next
fileexist %2,$2+$0+".jpg"
if %2=0 jumpf
itoa $0,%8+1:len %5,$0:mov %5,%3-%5
for %6=1 to %5:mov $0,"0"+$0:next
fileexist %2,$2+$0+".jpg"
if %2 = 1 mov %7,%8+1:next
if %2 = 0 break
~
mov %4,%8-1 ;(修正)±が逆でした
if %8==0 break ;(追加)画像が一枚もない場合の永久ループ避け
next
mov %0,0
lr_trap *movie_end
bgmonce $1
resettimer
for %0=1 to 999999
gettimer %2
itoa $0,%8*%2/%1:len %5,$0:mov %6,%3-%5
for %7=1 to %6:mov $0,"0"+$0:next
if %2>=%1 break ;←20090323修正 参考.コメント欄
btndef $2+$0+".jpg":blt 0,0,800,600,0,0,800,600
;※mode800 の場合。デフォルトの解像度 640 なら 640,480 ONS設定とは違いますよん
waittimer 2
next
goto *movie_end2
*movie_end
if %0>0 break:next
*movie_end2
lr_trap off
ofscpy:bg black,1:stop
saveon
return
これで平均測定回数が log2(n)*2 以下に減少するかと思います。n= int(画像枚数/5000 + 1) * 5000試しにと『車輪の国、向日葵の少女』のOPムービー4257枚が26回の fileexist 命令で済みました。
あとTMPGEnc 等では連番画像の出力フレームレートも設定出来るので、PSPではFPSが期待出来ないと割り切って最初から少ない枚数で出力してもいいかもしれませんね。