幻日幻月環

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

数十秒だけ有効な触り反応領域

この記事は伺か Advent Calendar 2015の1日目に投稿したものです。

今回は、ゴーストの触り反応領域だけを追加する方法を示します。
通常は、透明な画像を着せ替えで装着させ、そこに触り反応を設定し、その着せ替えを右クリックメニューに表示しないようにすることが多いと思います。
今回の方法は、他のサーフェスに変わるまでの間だけ、触り反応を追加する方法です。

利点
・フラグ管理などの処理が不要

一言で言うとこれに尽きます。つまりゴースト側の処理がすごく簡単ですみます。
着せ替えで実装すると、着せ替え変更のたびにイベントが呼び出されたり、オンオフ管理が必要になります。
ゴースト上で使う上でそういった管理が面倒な部分が不要になります。

欠点
・追加したままに出来ない

触り反応領域をずっと追加したままにしたいなら、素直に着せ替えで実装しましょう。

スクリプトと使い方は続きに。
とりあえず、シェル画像を用意します。
今回はこのようなサンプル画像を使用します。
シェル画像
通常顔.png 体.png
sampleface samplebody

合成結果(サーフェス0番)
sampleshell
まずはshell側のsurfaces.txtに、設定を記述します。
surfaces.txtには以下が入力されているとします。

// 日本語(全角文字)を使う場合は文字コードに注意
// 里々の場合は、特に気にする必要はありません
// また、//などから始まる行は無視されます
// いつか見返した時のために、メモなど書いておきましょう

////////////////////////////////////////////////////////////////////////////////

// 文字コードの指定。Windowsなら基本はShift_JIS決め打ちでOK
charset,Shift_JIS

// surfaces.txt自体の設定
descript
{
// 新定義で設定を記述する。とりあえず書いておくお約束みたいなもの
version,1
}

////////////////////////////////////////////////////////////////////////////////
// サーフェスの設定
// 0番 本体側デフォルトサーフェス
surface0
{
element0,base,体.png,0,0
element1,overlay,通常顔.png,0,0
}

// 1番 本体側怒りサーフェス
surface1
{
element0,base,体.png,0,0
element1,overlay,怒り顔.png,0,0
}

/* 中略 */

// 9番 本体側照れ怒りサーフェス
surface9
{
element0,base,体.png,0,0
element1,overlay,照れ怒り顔.png,0,0
}

// 10番 相方側デフォルトサーフェス
surface10
{
element0,base,相方体.png,0,0
element1,overlay,相方顔.png,0,0
}

//------------------------------------------------------------------------------
// アニメーション用の画像設定

// 100番 本体側半目
surface100
{
element0,base,半目.png,0,0
}

// 101番 本体側目閉じ
surface100
{
element0,base,目閉じ.png,0,0
}

// アニメーション用の画像設定ここまで
//------------------------------------------------------------------------------

// サーフェスの設定ここまで
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// 領域・アニメーションの設定

// 0番に瞬きアニメーションを追加設定
surface.append0
{
// アニメーション0番 まばたき
// 4秒置きに定期的にアニメーションを実行する
animation0.interval,periodic,4

// ランダムに0~1000ミリ秒(=0/1000~1000/1000秒)待ってから、
// 半目の画像(=サーフェス100番)を座標0,0に重ねる
animation0.pattern0,overlay,100,0-1000,0,0

// 上の行が実行されたら、50ミリ秒待ってから、
// 目を閉じた画像(=サーフェス101番)を座標0,0に重ねる
animation0.pattern1,overlay,101,50,0,0

// 上の行と同様、50ミリ秒後、半目画像(=サーフェス100番)を重ねる
animation0.pattern2,overlay,100,50,0,0

// 今までのアニメーションで重ねた画像を削除(=サーフェスに-1を指定)する
animation0.pattern3,overlay,-1,50
}

// 本体側サーフェスの領域を一括設定
surface.append0-9
{
//--------------------------------------------------------------------------
// いつでも触れる領域

// 領域0番 頭
// 左上座標「96,79」と右下座標「206,123」に囲まれた四角形を領域名「頭」とする
collision0,96,79,206,123,頭

// ここまで通常領域
//--------------------------------------------------------------------------

//--------------------------------------------------------------------------
// 限定で触れる領域

// アニメーション1000番 追加触り領域
// neverのアニメーションはさくらスクリプトで呼ばれるまで実行されない
animation1000.interval,never

// 最初にこのアニメーションの効果を削除し(まだ何もしてないので効果無し)、
// その後、サーフェス0番を、1億ミリ秒(=約30時間)後に座標0,0の上から重ねる
// →アニメーションは開始しているが、30時間経つまで表示されない
// つまり、何も表示しないのとほぼ意味は同じ
// また、サーフェスが変更されると、アニメーションは中断される
// 通常はサーフェス戻しかトークでサーフェスが変わるので、ほぼ必ず解除される
animation1000.pattern0,overlay,-1,0
animation1000.pattern1,overlay,0,100000000,0,0

// アニメーション1000番内限定の領域0番 腹
// アニメーション中のみ有効な領域を設定する
// → 上記のアニメーションが終わるか、サーフェスが変わるまでこの領域は有効
animation1000.collision0,120,285,185,335,腹

// ここまでアニメーション中の限定領域
//--------------------------------------------------------------------------
}

// 領域・アニメーションの設定ここまで
////////////////////////////////////////////////////////////////////////////////


上記設定後、ghost/masterフォルダの辞書のトークで\i[1000]記述すると、サーフェスが変わるまで「腹」の領域が出現します。
里々でのサンプルを表示します。


:お腹とかさわらないでね。くすぐったいから。


:あっ、あれはなんだろう?\i[1000]
#↑のさくらスクリプトは全て半角で書く必要があるので注意

下のランダムトーク時、次に何か喋るまで、「腹」に触れます。
勝手に解除されるので、特にフラグを設定したりする必要はありません。
開発用パレットで当たり判定を表示すると、このようになります。
shellsample
追加された「腹」は、別のサーフェスになると消え、触れなくなります。
特に設定をいじってない里々なら、別のトークが始まると必ず解除されます。

これを利用すれば、ちょっとしたミニゲームも出来ます。
最初にサーフェスを消すのでなく、何かしらの画像を表示、その後すぐ消えるようにすれば、シェルを使ったもぐらたたきゲームなどが作れます。
ミニゲームのスクリプトに関しては、後日公開しようと思います。
PageTop

コメント


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