2010年11月13日
講座4回目の宿題についてっす
宿題が2つなので2本立てになってるっす。
前半は「if分の書き下し」(作文)
後半は「タッチ起動に書き換え」(スクリプト)
となってるっす。
どうもぺんぎんっす( ◎v◎ )
お題は
//******************
// グローバル変数
//******************
string ANIM_NAME = "run";
key sitting_av = NULL_KEY;
//******************
// state default
//******************
default
{
state_entry()
{
llSitTarget(<0.0, 0.0, 2.0>, ZERO_ROTATION);
}
changed(integer change)
{
if(change & CHANGED_LINK)
{
key av = llAvatarOnSitTarget();
if(sitting_av)
{
if(av)
{
llUnSit(av);
}
else
{
llStopAnimation(ANIM_NAME);
sitting_av = NULL_KEY;
}
}
else
{
if(av)
{
sitting_av = av;
llRequestPermissions(sitting_av, PERMISSION_TRIGGER_ANIMATION);
}
}
}
}
run_time_permissions(integer perm)
{
if(perm & PERMISSION_TRIGGER_ANIMATION)
{
llStopAnimation("sit");
llStartAnimation(ANIM_NAME);
}
}
}
まずはif文の書き下しの宿題っす。
A.sitting_avがNULL_KEYでない、かつavがNULL_KEYでないとき
(=llUnSitが実行されるとき)
B.sitting_avがNULL_KEYでない、かつavがNULL_KEYのとき
(=llStopAnimationが実行されるとき)
C.sitting_avがNULL_KEY、かつavがNULL_KEYでないとき
(=llRequestPermisisonsが実行されるとき)
って一体どんなときなのかを書いてくるってことだったっすね。
sitting_av、av、NULL_KEY
この3つは禁止ワードになってるっす。
構造が分かってもらえたのかを自分が確認したいのと、
あと、「お題に穴がある」と言ったと思うんっすけど、
どこが問題なのかを調べて欲しかったわけっす。
結局調べてもらえなかったみたいなんっすけどね…
簡単にポイントを整理してみるっす。
llAvatarOnSitTarget関数の戻り値(=avの値)
・アバターA(以下A)が座る
Aのkeyを返す
・Aが座る→アバターB(以下B)が座る
Aのkeyを返す
・Aが座る→Bが座る→スクリプトをリセット
Aのkeyを返す
・Aが座る→Bが座る→Aが立つ
NULL_KEYを返す
・Aが座る→Bが座る→Aが立つ→スクリプトをリセット
NULL_KEYを返す
・Aが座る→Bが座る→Aが立つ→アバターC(以下C)が座る
Cのkeyを返す
sitting_avの更新
・初期値/リセットされたとき
NULL_KEYに
・change & CHANGED_LINKが「真」かつ
・sitting_avがNULL_KEYかつavがNULL_KEYでない
avに
・sitting_avがNULL_KEYでない、かつavがNULL_KEYでない
NULL_KEYに
if(change & CHANGED_LINK)
※リンク数が変わったとき
・アバターが座ったとき
・座っていたアバターが立ち上がったとき(立たせたときも)
・座っていたアバターがTPしたとき
・座っていたアバターがログアウトしたとき
・オブジェクトを新たにリンクしたとき
・オブジェクトのリンクを解除したとき
では、自分の作った解答っす。
抜けてるような気もするので、そのときはコメントお願いしますっす。
------------------------------------------------------------------------
[解答]
お題のスクリプト以外に別のスクリプトを使ったり、
オブジェクトのリンクセットを変えたりするのもアリ。
llUnSitが実行されるとき
Case.1 Aが座っているときにBが座ったとき。[Aが立つ]
Case.2 Case.1のあと、Cが座って(このとき座っているのはBとC)、
その後アバターDが座ったとき。[Cが立つ]
以降2名座るたびに、先に座った1名が立つ。
Case.1のあとでBが立ち上がっても同様に、
以降2名座るたびに、先に座った1名が立つ。
Case.3 Aが座っているときに、オブジェクトを新たにリンクしたとき、
またはリンクを解除したとき。[Aが立つ]
Case.4 Case.1のあと、Cが座って(このとき座っているのはBとC)、
その後オブジェクトを新たにリンクした、または解除したとき。
[Cが立つ]
(Case.2とCase.3の合わせ技)
llStopAnimationが実行されるとき
Case.5 Aが座っていて、Aが立ち上がった/テレポート/ログアウトした時。
[Aのアニメーションを停止]
Case.6 上述のCase.1からCase.4で、llUnSitによって立たされた時。
[立たされたアバターのアニメーションを停止]
※llUnSitによってchangedイベントが起こるので、そのときに。
Case.7 Case.1のあと、Cが座って(このとき座っているのはBとC)、
その後Cが立ち上がった/テレポート/ログアウトしたとき。
※テレポートしたときにもllStopAnimationが実行されるかは要検証。
llRequestPermissionsが実行されるとき
Case.8 誰も座っていないときに、誰か座ったとき。
Case.9 Case.1からCase.4のいずれかの後、誰か座ったとき。
Case.10 Case.8かCase.9の後、スクリプトをリセットした後に
オブジェクトを新たにリンクした、またはリンクを解除したとき、
または別のアバターが座ったとき。
---------------------------------------------------------------
座る→立つだと問題は無いんっすけど、座る→座るとなったとき、
ん?となる動きになるわけっす。
見ての通り、解答はかなりややこしいっす。
あとでじっくり確かめてみてくださいっす。
頭の体操っすね。
後半は「タッチ起動に書き換え」っす。
まず、コメントが無いので何のスクリプトか分からないのが多かったっす。
「どんなことをさせたいのか」、意図が見えないので、
書いてもらったスクリプトが最善なのかは言えないわけっす。
動くor動かないっていう低いレベルの話になっちゃうっす。
「本当はこんなことをさせたかった…」と言われても、
書いてないから知らぬ!→なら初めから書いとけ!
となるわけっすから、必ず書くようにしてくださいっす。
場所はスクリプト本文に入る前、冒頭にコメントしておけば良いっす。
冒頭には
「こんなことをさせました」
「ここを工夫しました/ここはちょっと変わっています」
なんてのも書いておけば、スクリプト本文も理解しやすくなるっすね。
質問もあれば、ついでに書いておいてもらえれば見ておくっすよ。
ではスクリプト本体についてっす。
touch_startイベントでいきなりllStartAnimaionさせると
Script trying to trigger animations but
PERMISSION_TRIGGER_ANIMATION permission not set
とデバッグチャンネルでShoutされるっす。
ちゃんとパーミッションを取らないとダメっすよ。
llRequestPermissions関数の第1引数は「誰に」の部分なんっすけど、
これはllDetectedKey関数で取得できるっすね。
あとはパーミッションが取れたか確認したうえで
アニメーションを実行させれば良いっす。
問題は止めるときっす。
llStopAnimationで「ちゃんと止まったように見える」っすかね?
というのも止めた後、ちょっとでも動かないとstandが再生されないので
引き続いてアニメーションが実行されてるように見えるからっす。
これって自分だけっすかね?
インデントは気を付けて書いてもらえたみたいっすね。
だいぶ良くなったっすよ。
書かれてた質問はオフィスアワーのネタとカブるので、
オフィスアワーの記事でやるっすね。
前半は「if分の書き下し」(作文)
後半は「タッチ起動に書き換え」(スクリプト)
となってるっす。
どうもぺんぎんっす( ◎v◎ )
お題は
//******************
// グローバル変数
//******************
string ANIM_NAME = "run";
key sitting_av = NULL_KEY;
//******************
// state default
//******************
default
{
state_entry()
{
llSitTarget(<0.0, 0.0, 2.0>, ZERO_ROTATION);
}
changed(integer change)
{
if(change & CHANGED_LINK)
{
key av = llAvatarOnSitTarget();
if(sitting_av)
{
if(av)
{
llUnSit(av);
}
else
{
llStopAnimation(ANIM_NAME);
sitting_av = NULL_KEY;
}
}
else
{
if(av)
{
sitting_av = av;
llRequestPermissions(sitting_av, PERMISSION_TRIGGER_ANIMATION);
}
}
}
}
run_time_permissions(integer perm)
{
if(perm & PERMISSION_TRIGGER_ANIMATION)
{
llStopAnimation("sit");
llStartAnimation(ANIM_NAME);
}
}
}
まずはif文の書き下しの宿題っす。
A.sitting_avがNULL_KEYでない、かつavがNULL_KEYでないとき
(=llUnSitが実行されるとき)
B.sitting_avがNULL_KEYでない、かつavがNULL_KEYのとき
(=llStopAnimationが実行されるとき)
C.sitting_avがNULL_KEY、かつavがNULL_KEYでないとき
(=llRequestPermisisonsが実行されるとき)
って一体どんなときなのかを書いてくるってことだったっすね。
sitting_av、av、NULL_KEY
この3つは禁止ワードになってるっす。
構造が分かってもらえたのかを自分が確認したいのと、
あと、「お題に穴がある」と言ったと思うんっすけど、
どこが問題なのかを調べて欲しかったわけっす。
結局調べてもらえなかったみたいなんっすけどね…
簡単にポイントを整理してみるっす。
llAvatarOnSitTarget関数の戻り値(=avの値)
・アバターA(以下A)が座る
Aのkeyを返す
・Aが座る→アバターB(以下B)が座る
Aのkeyを返す
・Aが座る→Bが座る→スクリプトをリセット
Aのkeyを返す
・Aが座る→Bが座る→Aが立つ
NULL_KEYを返す
・Aが座る→Bが座る→Aが立つ→スクリプトをリセット
NULL_KEYを返す
・Aが座る→Bが座る→Aが立つ→アバターC(以下C)が座る
Cのkeyを返す
sitting_avの更新
・初期値/リセットされたとき
NULL_KEYに
・change & CHANGED_LINKが「真」かつ
・sitting_avがNULL_KEYかつavがNULL_KEYでない
avに
・sitting_avがNULL_KEYでない、かつavがNULL_KEYでない
NULL_KEYに
if(change & CHANGED_LINK)
※リンク数が変わったとき
・アバターが座ったとき
・座っていたアバターが立ち上がったとき(立たせたときも)
・座っていたアバターがTPしたとき
・座っていたアバターがログアウトしたとき
・オブジェクトを新たにリンクしたとき
・オブジェクトのリンクを解除したとき
では、自分の作った解答っす。
抜けてるような気もするので、そのときはコメントお願いしますっす。
------------------------------------------------------------------------
[解答]
お題のスクリプト以外に別のスクリプトを使ったり、
オブジェクトのリンクセットを変えたりするのもアリ。
llUnSitが実行されるとき
Case.1 Aが座っているときにBが座ったとき。[Aが立つ]
Case.2 Case.1のあと、Cが座って(このとき座っているのはBとC)、
その後アバターDが座ったとき。[Cが立つ]
以降2名座るたびに、先に座った1名が立つ。
Case.1のあとでBが立ち上がっても同様に、
以降2名座るたびに、先に座った1名が立つ。
Case.3 Aが座っているときに、オブジェクトを新たにリンクしたとき、
またはリンクを解除したとき。[Aが立つ]
Case.4 Case.1のあと、Cが座って(このとき座っているのはBとC)、
その後オブジェクトを新たにリンクした、または解除したとき。
[Cが立つ]
(Case.2とCase.3の合わせ技)
llStopAnimationが実行されるとき
Case.5 Aが座っていて、Aが立ち上がった/テレポート/ログアウトした時。
[Aのアニメーションを停止]
Case.6 上述のCase.1からCase.4で、llUnSitによって立たされた時。
[立たされたアバターのアニメーションを停止]
※llUnSitによってchangedイベントが起こるので、そのときに。
Case.7 Case.1のあと、Cが座って(このとき座っているのはBとC)、
その後Cが立ち上がった/テレポート/ログアウトしたとき。
※テレポートしたときにもllStopAnimationが実行されるかは要検証。
llRequestPermissionsが実行されるとき
Case.8 誰も座っていないときに、誰か座ったとき。
Case.9 Case.1からCase.4のいずれかの後、誰か座ったとき。
Case.10 Case.8かCase.9の後、スクリプトをリセットした後に
オブジェクトを新たにリンクした、またはリンクを解除したとき、
または別のアバターが座ったとき。
---------------------------------------------------------------
座る→立つだと問題は無いんっすけど、座る→座るとなったとき、
ん?となる動きになるわけっす。
見ての通り、解答はかなりややこしいっす。
あとでじっくり確かめてみてくださいっす。
頭の体操っすね。
後半は「タッチ起動に書き換え」っす。
まず、コメントが無いので何のスクリプトか分からないのが多かったっす。
「どんなことをさせたいのか」、意図が見えないので、
書いてもらったスクリプトが最善なのかは言えないわけっす。
動くor動かないっていう低いレベルの話になっちゃうっす。
「本当はこんなことをさせたかった…」と言われても、
書いてないから知らぬ!→なら初めから書いとけ!
となるわけっすから、必ず書くようにしてくださいっす。
場所はスクリプト本文に入る前、冒頭にコメントしておけば良いっす。
冒頭には
「こんなことをさせました」
「ここを工夫しました/ここはちょっと変わっています」
なんてのも書いておけば、スクリプト本文も理解しやすくなるっすね。
質問もあれば、ついでに書いておいてもらえれば見ておくっすよ。
ではスクリプト本体についてっす。
touch_startイベントでいきなりllStartAnimaionさせると
Script trying to trigger animations but
PERMISSION_TRIGGER_ANIMATION permission not set
とデバッグチャンネルでShoutされるっす。
ちゃんとパーミッションを取らないとダメっすよ。
llRequestPermissions関数の第1引数は「誰に」の部分なんっすけど、
これはllDetectedKey関数で取得できるっすね。
あとはパーミッションが取れたか確認したうえで
アニメーションを実行させれば良いっす。
問題は止めるときっす。
llStopAnimationで「ちゃんと止まったように見える」っすかね?
というのも止めた後、ちょっとでも動かないとstandが再生されないので
引き続いてアニメーションが実行されてるように見えるからっす。
これって自分だけっすかね?
インデントは気を付けて書いてもらえたみたいっすね。
だいぶ良くなったっすよ。
書かれてた質問はオフィスアワーのネタとカブるので、
オフィスアワーの記事でやるっすね。
Posted by ぺんぎん at 16:53│Comments(0)
│デジアカ