2010年10月23日
10/20(水)のオフィスアワーっす
10/16(土)のオフィスアワーはカフェの通常営業だったっす。
スクリプトの話はしてたっすけど、講座とは別の話っす。
なので16日のまとめは書かないっす。
どうもぺんぎんっす( ◎v◎ )
20日のオフィスアワーのまとめになるっす。
第4回お題の穴
もう一度お題を書いておくっす。
//******************
// グローバル変数
//******************
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);
}
}
}
これには大きな穴があるっす。
ポイントになるのはllAvatarOnSitTarget関数っす。
座ったアバターのkeyを取得する関数っすね。
この関数にはいくつか注意しないといけないことがあるっす。
例えばっす。
アバターAが座る→アバターBが座る
となったとき、llAvatarOnSitTarget関数の戻り値は
アバターBのkeyではなく、アバターAのkeyになるっす。
まずこれが1つ目っす。
アバターAが座る→アバターBが座る→アバターAが立つ
となったときのllAvatarOnSitTarget関数の戻り値は
NULL_KEYになるっす。
これが2つ目っす。
アバターAが座る→アバターBが座る→アバターAが立つ
→アバターCが座る
となったときはどうなるかと言うと、
アバターCのkeyが返ってくるっす。
これが3つ目っす。
1つ目のケースを考えると、お題でllUnSit(av)となってるのは
望ましい動作ではないっすね。
後に座ったアバターBを立たせるのが自然な流れっす。
ではどうやるかというと、llGetLinkKeyで比較するっす。
リンク番号の後ろから順番に、最初に座ったアバター以外を
全員立たせるということをするっす。
このときに使うのがfor/while文なんっすけど、まだやってないっす。
なので、登場するまでちょっと待ってくださいっす……
と、今日の講座4回目でやる予定「だった」っす。
お題を作ってるときには注意しないといけない点として
覚えてたんっすけど、原稿を書くときにはすっかり忘れてたっす。
つまりっす、原稿では説明してないわけっす。
次回に持ち越すなどして、ここの部分の説明はやるっす。
スクリプトの話はしてたっすけど、講座とは別の話っす。
なので16日のまとめは書かないっす。
どうもぺんぎんっす( ◎v◎ )
20日のオフィスアワーのまとめになるっす。
第4回お題の穴
もう一度お題を書いておくっす。
//******************
// グローバル変数
//******************
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);
}
}
}
これには大きな穴があるっす。
ポイントになるのはllAvatarOnSitTarget関数っす。
座ったアバターのkeyを取得する関数っすね。
この関数にはいくつか注意しないといけないことがあるっす。
例えばっす。
アバターAが座る→アバターBが座る
となったとき、llAvatarOnSitTarget関数の戻り値は
アバターBのkeyではなく、アバターAのkeyになるっす。
まずこれが1つ目っす。
アバターAが座る→アバターBが座る→アバターAが立つ
となったときのllAvatarOnSitTarget関数の戻り値は
NULL_KEYになるっす。
これが2つ目っす。
アバターAが座る→アバターBが座る→アバターAが立つ
→アバターCが座る
となったときはどうなるかと言うと、
アバターCのkeyが返ってくるっす。
これが3つ目っす。
1つ目のケースを考えると、お題でllUnSit(av)となってるのは
望ましい動作ではないっすね。
後に座ったアバターBを立たせるのが自然な流れっす。
ではどうやるかというと、llGetLinkKeyで比較するっす。
リンク番号の後ろから順番に、最初に座ったアバター以外を
全員立たせるということをするっす。
このときに使うのがfor/while文なんっすけど、まだやってないっす。
なので、登場するまでちょっと待ってくださいっす……
と、今日の講座4回目でやる予定「だった」っす。
お題を作ってるときには注意しないといけない点として
覚えてたんっすけど、原稿を書くときにはすっかり忘れてたっす。
つまりっす、原稿では説明してないわけっす。
次回に持ち越すなどして、ここの部分の説明はやるっす。
講座のお題を作るのと、原稿を作るのは同時ではないっす。
そこが今回のミスの原因っす。
講座3回目の最後に4回目のお題を出したっすよね。
これより前に4回目のお題は完成してるわけっす。
一方、原稿が完成したのはその2週間後っす。
3回目と4回目の間隔がいつもより長かったのと、
原稿作成に苦戦したのがあって、間が開いたわけっす。
どこかにメモでもしておけば良かったんっすけどねぇ…
そこが今回のミスの原因っす。
講座3回目の最後に4回目のお題を出したっすよね。
これより前に4回目のお題は完成してるわけっす。
一方、原稿が完成したのはその2週間後っす。
3回目と4回目の間隔がいつもより長かったのと、
原稿作成に苦戦したのがあって、間が開いたわけっす。
どこかにメモでもしておけば良かったんっすけどねぇ…
Posted by ぺんぎん at 19:53│Comments(0)
│デジアカ