[foobar2000]PSSでスクロールテキスト

[foobar2000]PSSでスクロールテキスト

Stack Panel Splitter(PSS)のスクリプトを使って、文字列をスクロールさせてみます。PSSスクリプトの書き方を解説の記事に載せようか迷ったのですが、ちょっと複雑なので記事を分けました。

なお、このPSSスクリプトは、JScript Panelスクリプト - スクロールテキストの記事で公開しているスクリプトと同じロジックなので、殆ど同じ動作をします。

スクリプト

秒単位の処理なので、Per Secondタブにコードを記述します。変数の定義だけはPerTrackタブに記述しても動作します。PSSは、変数の値をtrueまたはfalseと定義しても、真偽値ではなく文字列として解釈されます。スクリプト中でtruefalseをクォーテーションで囲んでいるのは、そのことを明確にするためで、なくても動作に影響はありません。

// Variables
$init_ps_global(move1,0,0)
$init_ps_global(move2,0,0)
$init_ps_global(flag1,'true',0)
$init_ps_global(flag2,'false',0)

// Constant
$puts(text1,[%artist%' - '%title%])
$puts(text2,[$info(codec)][' | '$info(bitrate)' kbps'][' | '$info(samplerate)' Hz'][' | '$caps($channels())][' | '%playback_time%' / '%length%])
$puts(font,'Segoe UI')
$puts(size,20)
$puts(color,255-255-255)
$puts(step,50)
$puts(margin,'')
$puts(mw,$gettextwidth($get(margin),$get(font),$get(size)))
$puts(tw1,$add($gettextwidth($get(text1),$get(font),$get(size)),$get(mw)))
$puts(tw2,$add($gettextwidth($get(text2),$get(font),$get(size)),$get(mw)))
$puts(movelimit1,$add(%ps_width%,$get(tw1)))
$puts(movelimit2,$add(%ps_width%,$get(tw2)))

// Set Flag
$ifgreater(%move1%,$add($get(tw1),$div(%ps_width%,2)),$set_ps_global(flag2,'true'),)
$ifgreater(%move1%,$add(%ps_width%,$get(tw1)),$set_ps_global(flag1,'false')$set_ps_global(move1,0),)
$ifgreater(%move2%,$add($get(tw2),$div(%ps_width%,2)),$set_ps_global(flag1,'true'),)
$ifgreater(%move2%,$add(%ps_width%,$get(tw2)),$set_ps_global(flag2,'false')$set_ps_global(move2,0),)

// Set Font
$font($get(font),$get(size))

// Display & Move
$if($stricmp(%flag1%,'true'),
$drawtextex($get(text1),$sub(%ps_width%,%move1%),0,$get(tw1),%ps_height%,$get(color),vcenter)
$ifgreater(%move1%,$get(movelimit1),$set_ps_global(move1,0),$set_ps_global(move1,$add(%move1%,$get(step))))
)
$if($stricmp(%flag2%,'true'),
$drawtextex($get(text2),$sub(%ps_width%,%move2%),0,$get(tw2),%ps_height%,$get(color),vcenter)
$ifgreater(%move2%,$get(movelimit2),$set_ps_global(move2,0),$set_ps_global(move2,$add(%move2%,$get(step))))
)

使い方

このスクリプトは、文字列が画面外にハミ出すと見切れることを利用しています。テキストの表示幅がパネルいっぱいの幅なら正しく表示されるのですが、位置を調整してパネルの一部分に表示しようとしても、「文字列が外から入ってきて外へ出ていく」という動作には、基本的になりません。ですので、ある特定の部分だけに表示したい場合は、新たに作成した子PSSにスクリプトを記述してください。そうすることで、独立したスクロールテキストパネルとして動作します。

PSSの下階層にPSSを挿入する
PSSの下階層にPSSを挿入する

文字列の色は定数に入れていますが、背景を描画する処理は入れていないので、Behaviourタブで設定するかコードを追加してください。

Constantの項(定数)のtext1からstepまでは、値を自由に変更できます。定数stepは文字列が1回に動く距離です。定数marginについてですが、このスクリプトでは、文字列の幅をPSSの$gettextwidth関数を使って計算しています。これがどうも書体によって計算が上手くいかないようで、書体によっては文字列が見切れることがあります。このような場合に、強制的に幅を広げるための設定です。(例えば$puts(margin,'0000')なら、文字列「0」4つ分の幅がプラスされる)

あとは、どうしてもカクカクしてしまいますが、PSSは表示を1秒に1回よりも速く変更できないので、こればっかりはどうしようもありません。滑らかに表示したい場合はJScript Panelのスクリプトを使いましょう。

お知らせ

現在お知らせはありません。

最近の投稿

シェア