« 2008年08月 | メイン

2008年09月07日

●バイナリサーチによる連番ムービー準備時間の短縮

伊代かわいいよ伊代移植パッチとは別口で(また一部の人しか判らないことを)
先日 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 btndef $2+$0+".jpg":blt 0,0,800,600,0,0,800,600 ;※mode800 の場合。デフォルトの解像度 640 なら 640,480 ONS設定とは違いますよん waittimer 2 if %2>=%1 break 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が期待出来ないと割り切って最初から少ない枚数で出力してもいいかもしれませんね。

2008年09月06日

●FAQ -ONS編-

実際にONScripterを実行するにあたって躓きそうな部分やよく見る質問について

01.ONScripterが起動しない

default.ttf がないと起動しません。

02.画面・シーンの切り替わりで落ちるよ

ONScripterはちょっとしたスクリプトミスではなかなか落ちませんが、
問答無用で落ちるケースもいくつかあります。
割と多いのがマスクフェード時に指定ファイルが読み込めない場合です。

print 18,1000,"mask.jpg"
SS 
といった記述をすると左側SSのようにマスクパターン(右画像)を使った画面切り替えを行います。
この時に"mask.jpg"が見つからないと強制終了しますのでご注意ください。

吉里吉里など、元データでマスク画像が通常の画像フォルダと別にあることが多いためか
この現象のご質問を見ることが結構あります。かにしのとかも。

03.効果音が再生されなかったり落ちたり

画像が小さく表示されたり

日本語のファイルがあったり

ログがおかしかったり拡大表示がおかしかったり

推奨ボタン設定とか

途中なのです

●FAQ -Perl編

01.Perlって?

このページで公開しているシナリオコンバータはPerlで動作するスクリプトです。
はっきり言ってフリーソフトとしての体を保っておりません。
Windows環境の方はActivePerlをインストールして、実行可能な環境を作ってください。

02.実行したけどDOS窓が一瞬出てくるだけ

Perlスクリプトの拡張子 .pl をActivePerl に関連づけるとダブルクリックでの実行も可能です。
がしかし、その場合は「ファイルが見つからない」などエラーによる終了時のメッセージが残りません。
というか正常終了の際も特にメッセージを出さないものが主という腐れ仕様です。
必ずコマンドプロンプトから実行してください。

例.hogeフォルダのhoge.plを実行する場合
c:\>cd \hoge     ※hogeフォルダへ移動します
c:\hoge>perl hoge.pl
c:\hoge> ※正常終了時はそのまま入力待ちに戻ります。戯画系は長いので経過報告してます

c:\hoge>perl hoge.pl
died at hoge.pl in line 100 untarakantara
※エラー時は終了した行数や原因が表示されます。
スクリプトをエディタで開いてみて、該当行を見ると問題が解決出来るかもしれません。
解決出来ない場合は、エラー文を当blogまで報告していただければ何らかの助言を出来ると思います。

03.実行すると「Can't locate Image/Magick.pm ... 」という表示が出て終了する

もし標記のエラー文章が表示された場合は ImageMagick(PerlMagick) のインストールが正常にされておりません。
基本的にPerlの標準モジュールだけで処理を行っているのですが、ImageMagick モジュールだけ別途インストールをお願いしています。
これについては FAQ -画像編- を (そしてエゴさんの解説記事を)ご覧下さい。
無事にモジュールが導入されている場合は、実行後知らぬ間にフォルダ内に画像が作成されています。ってのもいい加減どうかと