幻日幻月環

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

座標自動調整

2016/01/15
表記を全体的に修正、注意書き追加

02/04 21:58
シェル位置初期化(Ctrl + Shift + F12)に対応

02/04 20:00
マルチモニタで動作しない点を修正
(moveでの基準座標をscreenからprimaryscreenに変更)

----
浮遊するキャラクターは、上下にゆっくりふわふわ動くアニメーションを搭載していることが多いです。
しかし、時間が経つにつれ徐々に位置がずれて下にずれていってしまう現象が置きます。

数十分程度で、明らかに目に見えるほど位置がずれてしまうようです。
このずれをランダムトークのたびに修正する方法について、記述します。

ただし、環境によっては想定通りの動きをしない場合もあるようです。
着せ替えを持たないのであれば、surfaces.txtのアニメーションをmoveではなく、上下に余白を持たせてreplaceで行えば、そもそも問題は発生しません。
----
概要
----
まず、ゴーストの位置が変化するタイミングというのはあまり多くありません。
起動時、シェル変更時、ドラッグ移動時、シェル位置初期化時くらいでしょう。
上記のタイミングで、現在の座標を取っておき、一定時間置きに位置を戻す処理をすることで、位置がずれる問題を修正できます。
位置を戻す処理はさくらスクリプトで行うため、トークとして出力しなければなりません。
それにより、OnMinitesChangeなどで調整するとトークを潰すなどの可能性があります。
既存の処理を妨げないのは、ランダムトーク開始時に調整用さくらスクリプトを入れることだと思います。

座標はプロパティシステムで取得することができます。

以下のようなさくらスクリプトを出力し、発生させたイベント内で変数に座標を格納して保持しておきます。
\![get,property,OnGetSakuraPosition,currentghost.scope(0).x,currentghost.scope(0).y]

自分から\![move]スクリプトで移動する場合は、そこにも追加してください。

また、Ctrl + Shift + F12やコンテキストメニューからのシェル位置初期化時に対応します。
これらに対応するイベントは発行されないため、リソース取得イベントでShiori内部処理を呼び、値を返さない(=デフォルトの値が使用されるため、未記述と同じ動作になる)ことで対応します。
ここでは初期化時のx座標を上書きするsakura.defaultleftを使い、値を返さず変数格納だけ行います。

トークのたびに、\![move]を使い、先ほど格納した座標に移動させて、位置を調整します。

トークのたびに、トークの先頭部分に以下のようなさくらスクリプトを出力します。
\0\![move,保持x座標,保持y座標,0,primaryscreen,left.top,center.bottom]

----
処理
----
以下、里々で実装する例を挙げます。
他SHIORIでも、SHIORIイベントとさくらスクリプトはそのままなので移植は容易です。

・座標取得処理

以下の記述を、辞書のどこかに追加してください。
@で始まる部分は必ず@である必要があります。*に書き換えるとおかしな動作になることがあります。


@OnMouseDragEnd
\C(座標取得0)\e

@座標取得0
\![get,property,OnGetSakuraPosition,currentghost.scope(0).x,currentghost.scope(0).y]

@OnGetSakuraPosition
(set(バイト値,1)さくら側座標(バイト値,1)(R0),(R1))

@座標調整0
\0\![move,(さくら側座標),0,primaryscreen,left.top,center.bottom]

*シェル位置初期化時座標取得
(set,スクリプトの一番頭,\C)\0(座標取得0)

@sakura.defaultleft
(set,シェル位置初期化時座標取得タイマ,1)



ソロゴースト用のバルーン追尾スクリプトと組み合わせる場合は以下です。


@OnMouseDragEnd
\C(バルーン位置調整)(座標取得0)\e

@バルーン位置調整
\1\![set,alignmenttodesktop,free]\![move,0,0,0,0,left.top,left.top]

@座標取得0
\![get,property,OnGetSakuraPosition,currentghost.scope(0).x,currentghost.scope(0).y]

@OnGetSakuraPosition
(set(バイト値,1)さくら側座標(バイト値,1)(R0),(R1))

@座標調整0
\0\![move,(さくら側座標),0,primaryscreen,left.top,center.bottom]

*シェル位置初期化時座標取得
(set,スクリプトの一番頭,\C)(座標取得0)

@sakura.defaultleft
(set,シェル位置初期化時座標取得タイマ,1)


・適切なタイミングで座標を取得する

上記を辞書に加え、座標を取得する処理を既存に辞書に追加します。
以下は「Rポストと狛犬」に搭載する例です。
dic02_Event.txtに記述されているので書き換えます。


#377行目あたり
*OnFirstBoot
>初回
(座標取得0)(初回起動処理)

*初回起動処理
>初回

*OnBoot
>(現在月)月(現在日)日
>起動

(座標取得0)(起動処理)

*起動処理
>(現在月)月(現在日)日
>起動

*OnClose
>終了

*OnGhostChanged
>(現在月)月(現在日)日
>他のゴーストから変更

(座標取得0)(ゴースト変更起動処理)

*ゴースト変更起動処理
>(現在月)月(現在日)日
>他のゴーストから変更

*OnGhostChanging
>他のゴーストへ変更

#270行目あたり
*OnVanished
>(R0)が消された
:(4)メモリの彼方に消え去った(R0)に黙祷。
:明日は我が身か……。
:黙祷っ!
:……。

(座標取得0)(ゴースト消滅起動処理)

*ゴースト消滅起動処理
>(R0)が消された
:(4)メモリの彼方に消え去った(R0)に黙祷。
:明日は我が身か……。
:黙祷っ!
:……。

#46行目あたり
*OnShellChanged
:(0)どぉ?
:むー。

(座標取得0)(シェル変更後処理)

*シェル変更後処理
:(0)どぉ?
:むー。



・ランダムトーク時に座標を調整する

ランダムトーク時、取得した座標に移動する処理を呼び出します。
以下は「Rポストと狛犬」に搭載する例です。
dic03_Menu.txtに記述されているので書き換えます。


#11行目あたり
*0つつかれ
()

#120行目あたり
*OnMouseDoubleClick
>(R3)(R4)つつかれ
()


上記の処理部分を、以下に書き換えます。


#11行目あたり
*0つつかれ
(座標調整0)()

#120行目あたり
*OnMouseDoubleClick
>(R3)(R4)つつかれ
(座標調整0)()

#辞書内のどこかに以下を追加します
#>(R1)と(R0)の間には【タブ】が入っています
*OnTalk
>(R1) (R0)
(座標調整0)()


これで、トークするたびに座標を調整するようになり、勝手に沈んでいくことがなくなります。
PageTop

コメント


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