-華和梨 8.2.8 系 華和梨 8.2.8 系 #br #contents #br *イベントに対応していこう [#a8b344fa] -基本的な事を覚えたら、[[SHIORI Eventリスト:http://ukadoc.googlecode.com/svn/trunk/manual/list_shiori_event.htm]] を見て、対応したいイベントを作り込んでいくだけ。。。。と簡単にいかないのがゴースト制作 -ここでは工夫を必要とする一部のイベントと、作り方を紹介 #br -以下、例示するロジックは分かりやすくするため、System.Callback.OnGETエントリとかは以下の状態にします System.Callback.OnGET : $(entry ${System.Request.ID}) System.Callback.OnNOTIFY : $(entry ${System.Request.ID}) -つまりここから先はOnBoot時にはOnBootエントリをそのまま呼ぶ、セキュリティ云々は考えない前提で説明 #br #br *触り反応(つつかれ) - OnMouseDoubleClick [#b33b2644] -これがないとゴーストとして認められないかも知れない、まずダブルクリックから -一般的なゴーストにダブルクリックすると、メニューを出したりランダムトークをしたりするわけで、ならDisc-2のリストにあった「OnMouseDoubleClick」とはどんなイベントか >栞イベント: OnMouseDoubleClick >ダブルクリックされた際に発生。 >Reference0 マウスカーソルの x 座標(ローカル座標) >Reference1 マウスカーソルの y 座標(ローカル座標) >Reference2 常に0。 >Reference3 本体の場合は0、相方の場合は1が返る。 >Reference4 当たり判定の識別子。 >Reference5 左クリックは0、右クリックは1、ホイールクリックは2が返る。 -上のリファレンスは判別のために3~5を使う OnMouseDoubleClick : $(entry ${R3}${R4}つつかれ) 0Bustつつかれ : \0\s[7]さわんなタコ!!\e -これはさっきの例、しかしReference5を使っていない。このままにしておくと、「右のダブルクリック」でも反応してしまう -↓修正すると共に、メニューを追加し、また、対応した場所がない場合は${ランダムトーク}をするようにする OnMouseDoubleClick : $(if $[ ${R5} == 0 ] $(entry ${R3}${R4}つつかれ ${ランダムトーク})) 0Bustつつかれ : \0\s[7]さわんなタコ!!\e 0つつかれ : \0\s[0]なに?\w9\n${メニュー}\e メニュー : \q[お話して","ランダムトーク]\n\q[なんでもない","キャンセルトーク] ランダムトーク : 略 キャンセルトーク : 略 -これはReference5の判別にifを使った例。これで、左のダブルクリック以外を無視するように -ひとまずダブルクリックに関する対応は完了 #br #br *触り反応(なでられ) - OnMouseMove [#y81b9038] -頭をなでたりした時の反応が欲しいので、これをOnMouseMoveを使って対応する -実現するための工夫が要求されます kisもバンバン使わなければなりません -これを自作できるようになればあなたも立派な華和梨ャー >栞イベント: OnMouseMove >マウスが(当たり判定内を)移動した際に発生。 >Reference0 マウスカーソルの x 座標(ローカル座標) >Reference1 マウスカーソルの y 座標(ローカル座標) >Reference2 マウスホイールの回転量および回転方向。 >Reference3 本体の場合は0、相方の場合は1が返る。 >Reference4 当たり判定の識別子。 -ここではReferenceの0~2は不要(Reference2についても、ホイールも専用に独立したイベントが用意されているため、ここで対応する必要はなし →OnMouseWheelを参照) -とりあえず作ってみようということで、ダブルクリックと同じように OnMouseMove : $(entry ${R3}${R4}なでられ) 0Headなでられ : \0\s[5]なんだよー。\e -とやってみると。。。んまやってみてください。反応しすぎになるはず -マウスがシェルのHead領域に入った瞬間にトークしてしまう #br **改良その1 [#ob7b0d4c] -そんなわけで、なでられ反応を成立させるためにOnMouseMoveイベントの補足 -このイベントは、&color(red){マウスが(当たり判定内を)ちょっと移動しただけで''「大量に」''来る}; -なので、このイベントが来るごとにチェック用の変数を加算していき、一定値に達したらトークをする、といった方法が有効 敏感度 : 50 # 低いほど過敏に反応する OnMouseMove : $(inc なで数) $(if $[ ${なで数} >= ${敏感度} ] ${なでられ反応} ) なでられ反応 : $(set なで数 0)${${R3}${R4}なでられ}\e 0Headなでられ : \0\s[5]なんだよー。\e -↑動作としては「シェルの上をマウスが一定走るとトークする」という挙動 -ここではentryは不要と判断し、代わりに入れ子で対応 -kisの概説は以下の通り --inc 指定エントリに1を足す // なで数 = なで数 + 1 ...プログラム的にはこう --set いわずもがな。ここではincで加算された【なで数】を0に戻している #br **改良その2 [#daeef7f2] -上の挙動は、一見正しそうに見えるが実際はあんまり正しくない -実行してみると以下の問題点があったはず --&color(blue){1.シェルのどこを移動しても【なで数】がカウントされてしまう}; --&color(blue){2.敏感度(50)に達した時点の(最後にマウスのあった)領域のトークになってしまう}; ---&color(blue){2-1.それまでHeadを触っていても、50に達する直前にBustを通ると、Bustをなでられたトークになってしまう}; ---&color(blue){2-2.極端に敏感な時とそうでない時がある}; -解決の方策 --カウント用の変数を、領域ごとに複数用意する ---1 と 2-1 の解決 --OnSecondChangeイベントが来た時(1秒ごとに来る)、カウント用の変数を減算・除算・あるいは初期化する ---2-1 と 2-2 の解決 #br -人によってどう解決するかまるで違うため、ここでは執筆者の出した解 敏感度 : 60 OnMouseMove : ( $(set @j 0) $(foreach @i 当たり判定 $(if $[ ${@i} == ${R3}${R4} ] $(inc @j) ) ) $(if $[ ${@j} == 0 ] $(push 当たり判定 ${R3}${R4}) ) $(inc ${R3}${R4}なで数) $(if $[ ${${R3}${R4}なで数} >= ${敏感度} ] $(set ${R3}${R4}なで数 0)${${R3}${R4}なでられ} ) ) OnSecondChange : ( $(foreach @i 当たり判定 $(set ${@i}なで数 $[ ${${@i}なで数} / 2 ]) ) ) 0Headなでられ : \0\s[5]なんだよー。\e 0Headなでられ : \0\s[5]さわんなよー。\e 0Bustなでられ : \0\s[1]……。\e 0Bustなでられ : \0\s[7]胸を触るな!\e -挙動の簡易説明 --マウスが通った当たり判定の名称で区別したカウント用の変数を作る --マウスが通った当たり判定の名称を変数【当たり判定】に追加していく --1秒毎に、【当たり判定】に格納された変数名を全て2で割る #br #br *ランダムトーク - OnSecondChange [#aca239a6] -一般的には必須のはず -これも里々のように自動ではしてくれないため、OnSecondChangeイベントで実装 -なでられ反応に比べればずっと楽です >栞イベント: OnSecondChange >1秒ごとに発生。 >Reference0 連続起動時間(hour) >Reference1 見切れ時に1、それ以外は0が返る。 >Reference2 重なり時に1、それ以外は0が返る。 >Reference3 cantalkが再生されるときに1、それ以外は0が返る。 >Reference4 ※SSPのみ タイムアウトするまでの時間。(秒単位) -Reference1~2は後々「見切れ・重なり」に対する反応を作る時にお世話になるものの現段階では不要 -理屈としては、なでられ反応と同じようにカウント用の変数を作り、一定値に達したら、、、、でOK -余談はさておき、ランダムトークの実装例 トーク頻度 : 120 # 秒数で指定してね! OnSecondChange : ( $(inc Talkcount) $(if $[ ${Talkcount} >= ${トーク頻度} ] $(set Talkcount 0)${ランダムトーク}\e ) ) ランダムトーク : \0\s[0]新世界の神に\1\s[10]なりません。\w9\0\s[1]\n\n…\w9…\w9。\w9\e -トーク頻度を超えたらトークする。イベントが1秒毎に来る、ということは、120(2分)毎にランダムトークが発生 -簡単 -さっきの例と組み合わせると、OnSecondChange部はこうなる感じ? OnSecondChange : ( $(foreach @i 当たり判定 $(set @i $[ ${${@i}なで数} / 2 ]) ) $(inc Talkcount) $(if $[ ${Talkcount} >= ${トーク頻度} ] $(set Talkcount 0)${ランダムトーク}\e ) ) -以上 #br *以下執筆中 [#aab11848]