幻日幻月環

作成した伺かの更新情報などをつぶやくところ

中央表示と右寄せ表示

この方法は、SSP 2.5.31で実装された
\f[align,right]と\f[align,center]で実装できるようになりました。
里々では以下のように書けば簡単に表現できます。


\f[align,right]この行は右揃え
\f[align,center]この行は中央揃え
特になにもないこの行は左揃え

----

バルーンへの表示は、基本的に左詰めで表示されます。
いままでは中央表示や右寄せ表示が出来なかったのですが、SSP2.3.23以降は可能になりました。
(現在のフォントの半角サイズの横ピクセル数を取れるようになったため)
バルーンで中央表示と右寄せ表示を行う方法と、里々で実装したサンプルを示します。
内容は続きに。
バルーンに表示出来る文字数は、プロパティシステムで取得できます。
バルーンで描画可能な幅半角文字の幅を取得します。
これを割り算すれば、表示可能文字数が分かります、と言いたいのですがちょっと加工の必要があります。
表示可能文字を求める式は以下です。全てのバルーンを試したわけではないので、一部バルーンではうまく動かない可能性があります。

全角表示可能文字数:(バルーンで描画可能な幅 / 半角文字の幅 + 1) / 2(切り上げ)
半角表示可能文字数:バルーンで描画可能な幅 / 半角文字の幅 + 1

表示可能な文字数が分かれば、表示したい文字と合わせて表示位置を決定できます。
これを動的に計算するために、\![embed,...]を使用します。
\![get,property,...]で値を変数に格納しておき、\![embed,...]でイベント名を埋め込んでSSPから呼び出します。
必要になるたびに\![embed,...]で値の取得と処理を行うイベントを呼び出すことで動的に調整が出来るようになります。
参考:![embed,...]の使い方がわかった | すくりや
この方法だと、同じスクリプトでバルーンやフォントが変わっても自動調整出来るようになります。
balloon_align.png


今回のサンプルでは、\_l[x,y](の、y省略)を使っています。
sprintfを使っていないのは、半角スペース埋めすると不自然なウェイトがかかってしまうためです。

以下、ソースとサンプルの全文です。

#使い方は、下の方にある「トークサンプル」を見てください。
#これ以下をコピーして「dic_align.txt」とでも名前をつけて(dic好きな文字列.txt)、
#satori.dllと同じフォルダにおけばランダムトークで使えるようになります。

#注意点
#・SSP2.3.23以降でないと動きません。
#  使う場合は少し下にある「SSP判定」などを使って判別してください。
#・ssu.dllの関数を使うため、SAORI設定が必要です。(Rポストと狛犬なら初期状態で既に設定されています)
#・ユーザーがSSP本体設定の「バルーンフォント上書き」でフォントを変更した場合、
# 等幅フォントなら自動対応できますが、プロポーショナルフォントの場合は正しく表示できません。
#  例:「メイリオ」だとセンタリングと右寄せが中途半端になる
#・表示したい文字にさくらスクリプトを入れると、このスクリプトの動作がおかしくなるので、入れないでください。
#  対処は可能だが、YAYA側でかなり複雑な処理を書く必要あり

#------------------------------------------------------------------------------
#設定部分
#------------------------------------------------------------------------------
#選択肢の先頭につく文字。全角1文字分。「AB」とかでも可
#マーカー(さくらスクリプト\![*])も可だが、サイズが取れないのでちょっとずれる
@選択肢の先頭


#------------------------------------------------------------------------------


#------------------------------------------------------------------------------
#SSPバージョン判別コード
#不要なら削除
#------------------------------------------------------------------------------
@basewareversion
(nop,
(set,ベースウェア名,(R1))
(split,(R2),.)
(set,バージョン番号,(S0)(when,(S1)< 10,0)(S1)(when,(S2) < 10,0)(S2))


@SSP判定
(calc,(ベースウェア名) == SSP && (バージョン番号) >= 20323)

#使い方の例
#*初回
#>動かないよ (SSP判定)==0
#:はじめまして
#*起動
#>動かないよ (SSP判定)==0
#:こんにちは
#*他のゴーストから変更
#>動かないよ (SSP判定)==0
#≫(R0)「(R1)」
#>(R0)から変更
#:ようこそ。
#*動かないよ
#:SSP2.3.23以降じゃないと動きません。\+
##\+はランダムチェンジするさくらスクリプト
#------------------------------------------------------------------------------


#------------------------------------------------------------------------------
#トークサンプル
#------------------------------------------------------------------------------

:使い方だよ
(call,右寄せ表示0,←が呼び出し、ここが表示したい文字だよ)
(call,中央表示0,真ん中表示はこうだよ)
こんな(call,中央表示0,風に)(call,右寄せ表示0,使い分けも可)
:(call,右寄せ表示1,←は相方側だと変わるよ、注意してね)
あと、(call,中央表示1,半角は全角に)(call,右寄せ表示1,されるよ)


:(call,右寄せ表示0,さくらスクリプトは入れないでね)
:(call,右寄せ表示1,本体は「~表示0」、相方は「~表示1」)
\p[2](call,右寄せ表示2,3人めは、「~表示2」って書いてね)
:(call,右寄せ表示0,バルーン1行を超える長い文字を入れるとおかしくなるのでいれないでね)
(call(バイト値,1)中央表示0(バイト値,1)←は,カンマを,入れたい場合)
↑の文はYAYA as SAORIがないと半角カンマの表示はされないよ
詳しくは里々wikiの関数の基本の「引数区切り時」を参照だよ


(call,右寄せ表示1,YAYA as SAORIが入ってれば)
(call,中央表示1,半角も表示出来るよ)
:(call,中央表示0,satori_confには)
(call(バイト値,1)中央表示0(バイト値,1)aya,saori/yaya.dll)
(call,中央表示0,って、半角で書いてね)
(call,右寄せ表示0,既に導入済みなら↑は半角表示されるよ)


:(call,中央表示0,選択肢を表示するよ)
(call,右寄せ選択肢表示0,1個目選択だよ,2個目選択,3個目)
(call,中央選択肢表示0,中央に選択肢だよ,2個目だよ)
:(call,中央表示1,選択肢の場合、半角カンマを入れないでね)
:(call,右寄せ表示0,選択肢の名前と同じイベントにジャンプするよ)
(call,右寄せ表示0,名前が被らないように注意してね)
:(call,中央表示1,↓は動かないよ、変数いれないでね)
(call,中央選択肢表示1,(ユーザ名)とか変数を含む)

*1個目選択だよ
:右寄せ表示選択肢の1個目を選んだよ。
*2個目選択
:右寄せ表示選択肢の2個目を選んだよ。
*3個目
:右寄せ表示選択肢の3個目を選んだよ。
*中央に選択肢だよ
:中央表示選択肢の1個目を選んだよ。
*2個目だよ
:中央表示選択肢の2個目を選んだよ。
*(ユーザ名)とか変数を含む
:これは呼び出されないよ

#------------------------------------------------------------------------------
#処理部分
#そのまま使う場合は、そのまま辞書にコピペしておけば大丈夫。
#------------------------------------------------------------------------------
@中央表示0
(set,バルーンのスコープ,0)(中央表示メイン)

@中央表示1
(set,バルーンのスコープ,1)(中央表示メイン)

@中央表示2
(set,バルーンのスコープ,2)(中央表示メイン)

@中央表示メイン
(call(バイト値,1)寄せ表示メイン(バイト値,1)(A0)(バイト値,1)(バルーンのスコープ)(バイト値,1)0(バイト値,1)0)

@中央選択肢表示0
(set,バルーンのスコープ,0)(中央選択肢表示メイン)

@中央選択肢表示1
(set,バルーンのスコープ,1)(中央選択肢表示メイン)

@中央選択肢表示2
(set,バルーンのスコープ,2)(中央選択肢表示メイン)

@中央選択肢表示メイン
(call,寄せ表示メイン,0,(バルーンのスコープ),0,1(for,1,(Aの数),1,(半角カンマ)(A(calc,(C0) - 1))))

@右寄せ表示0
(set,バルーンのスコープ,0)(右寄せ表示メイン)

@右寄せ表示1
(set,バルーンのスコープ,1)(右寄せ表示メイン)

@右寄せ表示2
(set,バルーンのスコープ,2)(右寄せ表示メイン)

@右寄せ表示メイン
(call(バイト値,1)寄せ表示メイン(バイト値,1)(A0)(バイト値,1)(バルーンのスコープ)(バイト値,1)1(バイト値,1)0)

@右寄せ選択肢表示0
(set,バルーンのスコープ,0)(右寄せ選択肢表示メイン)

@右寄せ選択肢表示1
(set,バルーンのスコープ,1)(右寄せ選択肢表示メイン)

@右寄せ選択肢表示2
(set,バルーンのスコープ,2)(右寄せ選択肢表示メイン)

@右寄せ選択肢表示メイン
(call,寄せ表示メイン,0,(バルーンのスコープ),1,1(for,1,(Aの数),1,(半角カンマ)(A(calc,(C0) - 1))))

@寄せ表示メイン
\![get,property,OnGetBalloonAdjustWidthData,currentghost.balloon.scope((A1)).validwidth,currentghost.balloon.scope((A1)).char_width]φ
\![embed,OnAdjustBalloonAlign,"(A0)","(A2)","(A3)"(for,5,(Aの数),1,(半角カンマ)"(A(calc,(C0) - 1))")]

@OnGetBalloonAdjustWidthData
(when,!(is_empty,(R0)) && !(is_empty,(R1)),
(set,バルーン表示列数,(calc,(R0) / (R1) + 1) / 2 + (calc,(R0) / (R1) + 1) % 2)
(set,バルーン表示文字サイズ,(R1)),
(set,バルーン表示列数,0)
(set,バルーン表示文字サイズ,0)


@OnAdjustBalloonAlign
(when,(YAYAasSAORIの有無),
(when,(R2) == 0,
\_l[(calc,(calc,(バルーン表示列数) * 2 - (aya(バイト値,1)GETSTRBYTES(バイト値,1)(R0))) * (バルーン表示文字サイズ)(when,(R1) == 0,/ 2))(半角カンマ)]φ
(R0),
\_l[(calc,(calc,(バルーン表示列数) * 2 (for,4,(Rの数),1,- (aya,GETSTRBYTES,(R(calc,(C0) - 1)))) - (calc,(Rの数) - 3) * 2) * (バルーン表示文字サイズ)(when,(R1) == 0,/ 2))(半角カンマ)]
(for,4,(Rの数),1,
(選択肢の先頭)\q[(R(calc,(C0) - 1))(半角カンマ)(R(calc,(C0) - 1))]

),
(when,(R2) == 0,
\_l[(calc,(calc,(バルーン表示列数) - (length(バイト値,1)(R0))) * (バルーン表示文字サイズ)(when,(R1) == 1,* 2))(半角カンマ)]
(han2zen(バイト値,1)(R0)),
\_l[(calc,(calc,(バルーン表示列数)(for,4,(Rの数),1,- (length,(R(calc,(C0) - 1)))) - (Rの数) + 3) * (バルーン表示文字サイズ)(when,(R1) == 1,* 2))(半角カンマ)]
(for,4,(Rの数),1,
(選択肢の先頭)\q[(han2zen,(R(calc,(C0) - 1)))(半角カンマ)(R(calc,(C0) - 1))]




@半角カンマ
,

@YAYAasSAORIの有無
(is_digit,(aya,gettickcount))
#------------------------------------------------------------------------------
PageTop

コメント


管理者にだけ表示を許可する