2010年11月07日
講座5回目っす
説明することは一通りやったっす。
ということは、「今からポーズスタンドを作れ!」とやった場合、
出来てもらわないと困るわけなんっすけど、
えーっと、大丈夫っすかね?
どうもぺんぎんっす( ◎v◎ )
default
{
changed(integer change)
{
if(change & CHANGED_LINK)
{
llResetScript();
}
}
touch_start(integer num_detected)
{
integer landmark_num = llGetInventoryNumber(INVENTORY_LANDMARK);
key detected_key = llDetectedKey(0);
integer i;
for(i = 0; i < landmark_num; ++i)
{
llGiveInventory(detected_key, llGetInventoryName(INVENTORY_LANDMARK, i));
}
}
}
-----------------------------------------------------------------
while文で書き直したバージョン(touch_startイベントのみ)
default
{
touch_start(integer num_detected)
{
integer landmark_num = llGetInventoryNumber(INVENTORY_LANDMARK);
key detected_key = llDetectedKey(0);
while(landmark_num--)
{
llGiveInventory(detected_key, llGetInventoryName(INVENTORY_LANDMARK, landmark_num));
}
}
}
では5回目を始めるっす
宿題は2つっすね
自分の方まで出してくださいっす
出せたらいつも通り、赤い玉からURL持って行ってくださいっす
今回の作文は「正解」があるっす
ブログに書いておくっすね
タッチ起動のsitballは
総評というカタチでいつも通り書いておくっす
タッチなので、自動承認じゃないっすから
ダイアログによるパーミッションの承認になるっす
そこら辺のことを確認してもらえれば良いっすね
ではそろそろ良いっすかね?
解説始めるっす
今回のお題は「Landmark giver」っす
行数はそんなにないんっすけど、見慣れないモノがあるっすね
今回はそこのところの解説になるっす
動きの流れは
「アバターがタッチすると、コンテンツにあるLandmark全部を
タッチしたアバターに渡す」
以上っす
気付いてるとは思うんっすけど
llResetScriptは無くても良いっすね
必要無いなら書かない方が良いっす
お題はあくまで説明用に書いてるっす
講座の残り回数の関係上、無理やり突っ込んだっす
過不足無い、キレイなお題でやりたかったんっすけどねぇ…
llResetScriptについては後半でやるっす
前半は超重要な「繰り返し(ループ)処理」についてっす
ポーズスタンドでは必須というわけではないっすけど、
1人だけを座らせたい場合に使うことになるっす
他に誰か座ったら、1人以外全員立たせるわけっすね
前回抜けてたので、あとで解説するっすね
お題を見ていくっす
changedイベントはさっきも言った通り、無くて良いっす
その下のtouch_startイベントを見ていくっす
変数が3つ宣言されてるっすね
landmark_numとdetected_keyは、まあ良いっすね
残り1つ、あっさりした変数名のがあるっす
今回の主役はこの i っす
iはループ用に宣言した変数っす
作法の話になるんっすけど
・integer型のiはループ専用(=他に使うな)
・変数のiはinteger型
・i以外にループ用のinteger型の変数が必要なら
j, k, l, m, nを用いる
というのがあるっす
これはLSLだけじゃなく、他の言語でもそうっす
これも一応覚えておいてくださいっす
いよいよ本体に突撃っす
for文というやつっす
for文の書き方は
for(初期化; 継続条件; カウンタ変数の更新)
{
処理
}
こうっす
どういう動きになるかと言うと
1.まずは初期化
カッコにある3つの文のうち最初の文っす
お題はi = 0 と、i に 0 を代入してるっすね
2.継続条件を評価
カッコの真ん中のところっす
ここはif文と同じっす
真だったら中の処理、偽だったら抜けて次へ行くっす
お題はi < landmark_num となってるっすね
[if文の大小比較]は初めてになるっすかね
これは見たまんまの解釈で良いっすよ
iがlandmark_numより小さいなら「真」、そうでないなら「偽」っす
iとlandmark_numが等しい場合は「偽」っすよ
「以上」とか「以下」を判定したい場合もあるっすよね
算数だと不等号の下にイコールを付けるっすよね
LSLは下じゃなくて、不等号の後ろに付けるっす
<= とか >= と書くわけっすね
イコールは前に書いちゃダメっすよ
j >= 5 の場合は
jが5以上なら「真」(jが5のときも「真」)
jが5未満なら「偽」になるっす
戻ってお題のi < landmark_num は
iがlandmark_num未満なら「真」
iがlandmark_num以上なら「偽」になるっす
イコールが付いてないので
iとlandmark_numが同じ場合は「偽」っすね
継続条件はこれで良いっすかね
3.継続条件が「真」なら中の処理
ブロックの中の処理を実行するっす
お題ではllGiveInventoryを実行するわけっす
4.カウンタ変数の更新
中の処理が下まで全部終わったら、
カッコの3つ目、最後の文を実行するっす
お題は++iっすね
前に出てきた、インクリメントをしてるっす
4.カウンタ変数の更新が終わったら
また2.継続条件の評価に戻るっす
つまり継続条件が「真」の間
2.評価→3.中の処理→4.カウンタの更新
を繰り返すことになるわけっす
お題をもうちょっと具体的に見ていくっす
オブジェクトのコンテンツにランドマークが2つ入ってるとするっす
するとlandmark_numの値は2っすね
このときのfor文の動きは
まずi = 0 で初期化されるっす
次の継続条件の評価は
今、iが0で、landmark_numが2っす
i < landmark_num は「真」っすね
「真」なので中の処理っす
iが0なのに注意っすね
llGetinventoryNameの第2引数にiが入ってるっすよ
このiも0っす
中の処理が終わったので、カウンタの更新っす
++i なので i は 1 になったっす
次はまた継続条件を評価するっす
今度はiが1、landmark_numが2っす
まだi < landmark_num は「真」っすね
中の処理っす
llGetinventoryNameのiは1なのに注意っす
中の処理が終わればカウンタの更新っす
++i で、iの値は2になるっす
再び継続条件をチェックするっす
今、iの値は2っす
landmark_numの値は変わらず2っすね
i < landmark_num は、今度は偽になるっす
イコールは付いてないっすからね
で、結局のところどうなったかと言うと、
中の処理が2回繰り返されたっすね
でも、iの値は違うっす
iが0のときと1のときに中の処理をしたので、
あのfor文の部分は
llGiveInventory(detected_key, llGetInventoryName(INVENTORY_LANDMARK, 0));
llGiveInventory(detected_key, llGetInventoryName(INVENTORY_LANDMARK, 1));
こう書き直せるわけっす
ここら辺で休憩にするっす
質問あれば今のうちにどうぞっす
再開するっすね
後半1発目はもう1つの「繰り返し(ループ)処理」っす
while文についてっす
for文が分かれば難しくないっすよ
まず、while文の書き方は
while(継続条件)
{
処理
}
こうっす
for文と違って、継続条件だけっす
継続条件が「真」なら中の処理をやって
また継続条件を評価して「真」なら中の処理、
また継続条件を評価して…
と、繰り返すわけっす
継続条件が「偽」になったら次に進むっす
このあたりはfor文も同じっすね
処理の流れを見てみると、for文をwhile文で書き直せるっす
for文にあってwhile文に無いのは
「初期化」と「カウンタの更新」なので
書き加えてやれば同じになるわけっす
for(初期化; 継続条件; カウンタ変数の更新)
{
処理
}
これはwhile文で
初期化
while(継続条件)
{
処理
カウンタ変数の更新
}
こう書いてやれば同じになるっすね
LSL portalのfor文のところにも書いてあるんっすけどね
使い分け方はforとwhileの英語としての意味を考えると良いかもっす
forは「~まで」
whileは「~する間」
っていう意味があるっすよね
このことからfor文は
・「AからBまで」という場合
iが3から8までの間、とかいうケースっす
・反復する回数が決まっている場合
これはお決まりの書き方があって
for(i = 0; i < 回数; ++i)
{
処理
}
こうすると指定回数だけ反復できるっす
while文は
・反復する回数が決まっていない場合
「コンテンツのLandmarkの数」は
入れた数によって当然違ってくるっすよね
お題はfor文で書くよりwhile文で書いた方が良さそうっす
使い分け方は作法の話になるので、歯切れの悪い言い方しかできないっす
使っていくうちに自然と身に付くとは思うんっすけどね
じゃあ、実際に書き直してみるっすかね
書き直したのも用意したので、TypeWith.Meに貼り付けるっすね
書き直すとこうなるっす
for文やwhile文で「おかしいな?」と思ったら
中の処理にカウンタ変数なりをOwnerSayさせるようにすれば良いっすね
値を確認することで、原因が分かるかもしれないっすからね
時間が結構きてるっすね
for文、while文はこれくらいにして、次っす
お題に意味も無く突っ込んだllResetScriptについてっす
「スクリプトをリセットする」関数になるっす
オブジェクトに入っているスクリプトを[保存]したときと
ほぼ同じ状態になる、と言った方がイメージしやすいかもっす
stateはdefaultに戻って、
グローバル変数も初期化され、
timerもlistenも設定されてない、
パーミッションも許可を取る前の状態になるっす
初期設定をする処理をdefaultステートの
state_entryイベントに書くのは良くやる方法っす
ただ、そのオブジェクトをTakeした後に
再度Rezしたときには、state_entryイベントは起きないっす
「自分では動くのに、他のヒトに渡したら動かない」
なんてのは、大抵コレが原因になってるっす
Rezされたときには代わりにon_rezイベントが起きるっす
Rezされたときにも初期設定をしたい場合には
方法は2通りあって、
1つ目はon_rezイベントにもstate_entryイベントでやる
初期設定をする処理を記述することっす
ただ、同じことを2回書くのは行儀が悪いので
「初期設定をする処理」をユーザ関数として書いて、
state_entry、on_rezイベントそれぞれで呼び出すことになるっす
2つ目はon_rezイベントでllResetScriptすることっす
「スクリプトを実行したときに、最初に初期設定をする」
と考えると、この方法もアリっす
ポーズスタンドに使うか使わないか分からないっすけど
llResetScriptの話は念のため出しておいたっす
他で使うこともあると思うっすからね
ここまでで講座で説明することは全部やったっす
次回で講座は最後になるんっすけど
これまでやったパーツの組み立てと、
あとは卒業制作の話をしようと思うっす
というわけで、次回、お題は無いっす
これまでの復習をみっちりやってくださいっす
でも今回やったfor/while文については宿題出しておくっすね
あとで解説も入れておくっす
宿題(今回の復習)
前回のお題、sitballに穴があることはブログにも書いたっす
そこで、望ましい動きとなるように書き換えてほしいっす
宿題は
「アバターがオブジェクトに座っている状態で
さらに他のアバターが座ったら、
最初に座っていたアバター以外全員を立たせる」
という風にしてほしいっす
さすがにノーヒントはツライと思うのでヒントっす
考え方としては
誰かがオブジェクトに座ったとき、
誰も座っていなければパーミッションの要求などをして
誰か既に座っていたら、後から座ったアバターを立たせれば良いっす
「後から座ったアバター」というのは、リンクを見れば良いっす
3プリムのオブジェクトにアバターA、アバターBが順に座ると
リンク番号1から3までがオブジェクト、
次に座ったアバターAがリンク番号4、
その次、アバターBがリンク番号5とされるっす
と、いうことは
誰かが既に座っていた場合は
リンク番号の後ろの方から
座っていたアバターかどうかを調べて
座っていたアバターと異なった場合に立たせて、
座っていたアバターと同じならそこで終了とすれば良いっす
3プリムのオブジェクトにAとBが座った例だと、
最初に座っているのはアバターAっす
アバターBが座ったとき、リンク数は5になるっす
ここで後ろから見て行くわけっすね
リンク番号5はアバターBっす
これはアバターAとは違うので立たせるっす
次、リンク番号4はアバターAっす
これは既に座っていたアバターと一致するので、
ここで立たせる処理は終了っす
座っているアバターも含めたリンク数を取得する関数に
llGetNumberOfPrims っていうのがあるっす
これを使ってやってみてくださいっす
今の説明でfor/while文を使うなーとイメージできてれば
だいぶ考え方が身に付いてきた証拠っす
あとは手を動かして、実際に作ってみてくださいっす
では次回は2週間後、この時間っす
最終回だからといって特別なことはしないっすよ
一切期待せずに来てくださいっす
オフィスアワーは水曜日も土曜日もやるっすよ
宿題を個別に添削してほしい方とかは来てみてくださいっす
あと、この後質問を受け付けるの
プリムとかは片付けて帰ってくださいっす
ではお疲れさまでしたっす
今回は繰り返し(ループ)処理とllResetScriptの話っす。
ちょっと補足するっす。
for文の「初期化式」と「カウンタの更新」は、必要が無いなら
書かなくても良いっす。
「継続条件式」は必ず必要なのが他の言語との違いっすね。
for(;;)で無限ループさせることは出来ないわけっす。
(代わりにwhile(1)の無限ループは使えるっすよ)
省略して書くと、こんな感じになるっす。
default
{
touch_start(integer num_detected)
{
integer i = 0;
for( ; i < 5; )
{
llOwnerSay((string)i);
++i;
}
}
}
先にループ用変数(上の例ではi)を初期化してしまって、
「初期化式」を省略するのは結構やるっすよ。
見かけても驚かないようにしないとっすね。
ということは、「今からポーズスタンドを作れ!」とやった場合、
出来てもらわないと困るわけなんっすけど、
えーっと、大丈夫っすかね?
どうもぺんぎんっす( ◎v◎ )
default
{
changed(integer change)
{
if(change & CHANGED_LINK)
{
llResetScript();
}
}
touch_start(integer num_detected)
{
integer landmark_num = llGetInventoryNumber(INVENTORY_LANDMARK);
key detected_key = llDetectedKey(0);
integer i;
for(i = 0; i < landmark_num; ++i)
{
llGiveInventory(detected_key, llGetInventoryName(INVENTORY_LANDMARK, i));
}
}
}
-----------------------------------------------------------------
while文で書き直したバージョン(touch_startイベントのみ)
default
{
touch_start(integer num_detected)
{
integer landmark_num = llGetInventoryNumber(INVENTORY_LANDMARK);
key detected_key = llDetectedKey(0);
while(landmark_num--)
{
llGiveInventory(detected_key, llGetInventoryName(INVENTORY_LANDMARK, landmark_num));
}
}
}
では5回目を始めるっす
宿題は2つっすね
自分の方まで出してくださいっす
出せたらいつも通り、赤い玉からURL持って行ってくださいっす
今回の作文は「正解」があるっす
ブログに書いておくっすね
タッチ起動のsitballは
総評というカタチでいつも通り書いておくっす
タッチなので、自動承認じゃないっすから
ダイアログによるパーミッションの承認になるっす
そこら辺のことを確認してもらえれば良いっすね
ではそろそろ良いっすかね?
解説始めるっす
今回のお題は「Landmark giver」っす
行数はそんなにないんっすけど、見慣れないモノがあるっすね
今回はそこのところの解説になるっす
動きの流れは
「アバターがタッチすると、コンテンツにあるLandmark全部を
タッチしたアバターに渡す」
以上っす
気付いてるとは思うんっすけど
llResetScriptは無くても良いっすね
必要無いなら書かない方が良いっす
お題はあくまで説明用に書いてるっす
講座の残り回数の関係上、無理やり突っ込んだっす
過不足無い、キレイなお題でやりたかったんっすけどねぇ…
llResetScriptについては後半でやるっす
前半は超重要な「繰り返し(ループ)処理」についてっす
ポーズスタンドでは必須というわけではないっすけど、
1人だけを座らせたい場合に使うことになるっす
他に誰か座ったら、1人以外全員立たせるわけっすね
前回抜けてたので、あとで解説するっすね
お題を見ていくっす
changedイベントはさっきも言った通り、無くて良いっす
その下のtouch_startイベントを見ていくっす
変数が3つ宣言されてるっすね
landmark_numとdetected_keyは、まあ良いっすね
残り1つ、あっさりした変数名のがあるっす
今回の主役はこの i っす
iはループ用に宣言した変数っす
作法の話になるんっすけど
・integer型のiはループ専用(=他に使うな)
・変数のiはinteger型
・i以外にループ用のinteger型の変数が必要なら
j, k, l, m, nを用いる
というのがあるっす
これはLSLだけじゃなく、他の言語でもそうっす
これも一応覚えておいてくださいっす
いよいよ本体に突撃っす
for文というやつっす
for文の書き方は
for(初期化; 継続条件; カウンタ変数の更新)
{
処理
}
こうっす
どういう動きになるかと言うと
1.まずは初期化
カッコにある3つの文のうち最初の文っす
お題はi = 0 と、i に 0 を代入してるっすね
2.継続条件を評価
カッコの真ん中のところっす
ここはif文と同じっす
真だったら中の処理、偽だったら抜けて次へ行くっす
お題はi < landmark_num となってるっすね
[if文の大小比較]は初めてになるっすかね
これは見たまんまの解釈で良いっすよ
iがlandmark_numより小さいなら「真」、そうでないなら「偽」っす
iとlandmark_numが等しい場合は「偽」っすよ
「以上」とか「以下」を判定したい場合もあるっすよね
算数だと不等号の下にイコールを付けるっすよね
LSLは下じゃなくて、不等号の後ろに付けるっす
<= とか >= と書くわけっすね
イコールは前に書いちゃダメっすよ
j >= 5 の場合は
jが5以上なら「真」(jが5のときも「真」)
jが5未満なら「偽」になるっす
戻ってお題のi < landmark_num は
iがlandmark_num未満なら「真」
iがlandmark_num以上なら「偽」になるっす
イコールが付いてないので
iとlandmark_numが同じ場合は「偽」っすね
継続条件はこれで良いっすかね
3.継続条件が「真」なら中の処理
ブロックの中の処理を実行するっす
お題ではllGiveInventoryを実行するわけっす
4.カウンタ変数の更新
中の処理が下まで全部終わったら、
カッコの3つ目、最後の文を実行するっす
お題は++iっすね
前に出てきた、インクリメントをしてるっす
4.カウンタ変数の更新が終わったら
また2.継続条件の評価に戻るっす
つまり継続条件が「真」の間
2.評価→3.中の処理→4.カウンタの更新
を繰り返すことになるわけっす
お題をもうちょっと具体的に見ていくっす
オブジェクトのコンテンツにランドマークが2つ入ってるとするっす
するとlandmark_numの値は2っすね
このときのfor文の動きは
まずi = 0 で初期化されるっす
次の継続条件の評価は
今、iが0で、landmark_numが2っす
i < landmark_num は「真」っすね
「真」なので中の処理っす
iが0なのに注意っすね
llGetinventoryNameの第2引数にiが入ってるっすよ
このiも0っす
中の処理が終わったので、カウンタの更新っす
++i なので i は 1 になったっす
次はまた継続条件を評価するっす
今度はiが1、landmark_numが2っす
まだi < landmark_num は「真」っすね
中の処理っす
llGetinventoryNameのiは1なのに注意っす
中の処理が終わればカウンタの更新っす
++i で、iの値は2になるっす
再び継続条件をチェックするっす
今、iの値は2っす
landmark_numの値は変わらず2っすね
i < landmark_num は、今度は偽になるっす
イコールは付いてないっすからね
で、結局のところどうなったかと言うと、
中の処理が2回繰り返されたっすね
でも、iの値は違うっす
iが0のときと1のときに中の処理をしたので、
あのfor文の部分は
llGiveInventory(detected_key, llGetInventoryName(INVENTORY_LANDMARK, 0));
llGiveInventory(detected_key, llGetInventoryName(INVENTORY_LANDMARK, 1));
こう書き直せるわけっす
ここら辺で休憩にするっす
質問あれば今のうちにどうぞっす
再開するっすね
後半1発目はもう1つの「繰り返し(ループ)処理」っす
while文についてっす
for文が分かれば難しくないっすよ
まず、while文の書き方は
while(継続条件)
{
処理
}
こうっす
for文と違って、継続条件だけっす
継続条件が「真」なら中の処理をやって
また継続条件を評価して「真」なら中の処理、
また継続条件を評価して…
と、繰り返すわけっす
継続条件が「偽」になったら次に進むっす
このあたりはfor文も同じっすね
処理の流れを見てみると、for文をwhile文で書き直せるっす
for文にあってwhile文に無いのは
「初期化」と「カウンタの更新」なので
書き加えてやれば同じになるわけっす
for(初期化; 継続条件; カウンタ変数の更新)
{
処理
}
これはwhile文で
初期化
while(継続条件)
{
処理
カウンタ変数の更新
}
こう書いてやれば同じになるっすね
LSL portalのfor文のところにも書いてあるんっすけどね
使い分け方はforとwhileの英語としての意味を考えると良いかもっす
forは「~まで」
whileは「~する間」
っていう意味があるっすよね
このことからfor文は
・「AからBまで」という場合
iが3から8までの間、とかいうケースっす
・反復する回数が決まっている場合
これはお決まりの書き方があって
for(i = 0; i < 回数; ++i)
{
処理
}
こうすると指定回数だけ反復できるっす
while文は
・反復する回数が決まっていない場合
「コンテンツのLandmarkの数」は
入れた数によって当然違ってくるっすよね
お題はfor文で書くよりwhile文で書いた方が良さそうっす
使い分け方は作法の話になるので、歯切れの悪い言い方しかできないっす
使っていくうちに自然と身に付くとは思うんっすけどね
じゃあ、実際に書き直してみるっすかね
書き直したのも用意したので、TypeWith.Meに貼り付けるっすね
書き直すとこうなるっす
for文やwhile文で「おかしいな?」と思ったら
中の処理にカウンタ変数なりをOwnerSayさせるようにすれば良いっすね
値を確認することで、原因が分かるかもしれないっすからね
時間が結構きてるっすね
for文、while文はこれくらいにして、次っす
お題に意味も無く突っ込んだllResetScriptについてっす
「スクリプトをリセットする」関数になるっす
オブジェクトに入っているスクリプトを[保存]したときと
ほぼ同じ状態になる、と言った方がイメージしやすいかもっす
stateはdefaultに戻って、
グローバル変数も初期化され、
timerもlistenも設定されてない、
パーミッションも許可を取る前の状態になるっす
初期設定をする処理をdefaultステートの
state_entryイベントに書くのは良くやる方法っす
ただ、そのオブジェクトをTakeした後に
再度Rezしたときには、state_entryイベントは起きないっす
「自分では動くのに、他のヒトに渡したら動かない」
なんてのは、大抵コレが原因になってるっす
Rezされたときには代わりにon_rezイベントが起きるっす
Rezされたときにも初期設定をしたい場合には
方法は2通りあって、
1つ目はon_rezイベントにもstate_entryイベントでやる
初期設定をする処理を記述することっす
ただ、同じことを2回書くのは行儀が悪いので
「初期設定をする処理」をユーザ関数として書いて、
state_entry、on_rezイベントそれぞれで呼び出すことになるっす
2つ目はon_rezイベントでllResetScriptすることっす
「スクリプトを実行したときに、最初に初期設定をする」
と考えると、この方法もアリっす
ポーズスタンドに使うか使わないか分からないっすけど
llResetScriptの話は念のため出しておいたっす
他で使うこともあると思うっすからね
ここまでで講座で説明することは全部やったっす
次回で講座は最後になるんっすけど
これまでやったパーツの組み立てと、
あとは卒業制作の話をしようと思うっす
というわけで、次回、お題は無いっす
これまでの復習をみっちりやってくださいっす
でも今回やったfor/while文については宿題出しておくっすね
あとで解説も入れておくっす
宿題(今回の復習)
前回のお題、sitballに穴があることはブログにも書いたっす
そこで、望ましい動きとなるように書き換えてほしいっす
宿題は
「アバターがオブジェクトに座っている状態で
さらに他のアバターが座ったら、
最初に座っていたアバター以外全員を立たせる」
という風にしてほしいっす
さすがにノーヒントはツライと思うのでヒントっす
考え方としては
誰かがオブジェクトに座ったとき、
誰も座っていなければパーミッションの要求などをして
誰か既に座っていたら、後から座ったアバターを立たせれば良いっす
「後から座ったアバター」というのは、リンクを見れば良いっす
3プリムのオブジェクトにアバターA、アバターBが順に座ると
リンク番号1から3までがオブジェクト、
次に座ったアバターAがリンク番号4、
その次、アバターBがリンク番号5とされるっす
と、いうことは
誰かが既に座っていた場合は
リンク番号の後ろの方から
座っていたアバターかどうかを調べて
座っていたアバターと異なった場合に立たせて、
座っていたアバターと同じならそこで終了とすれば良いっす
3プリムのオブジェクトにAとBが座った例だと、
最初に座っているのはアバターAっす
アバターBが座ったとき、リンク数は5になるっす
ここで後ろから見て行くわけっすね
リンク番号5はアバターBっす
これはアバターAとは違うので立たせるっす
次、リンク番号4はアバターAっす
これは既に座っていたアバターと一致するので、
ここで立たせる処理は終了っす
座っているアバターも含めたリンク数を取得する関数に
llGetNumberOfPrims っていうのがあるっす
これを使ってやってみてくださいっす
今の説明でfor/while文を使うなーとイメージできてれば
だいぶ考え方が身に付いてきた証拠っす
あとは手を動かして、実際に作ってみてくださいっす
では次回は2週間後、この時間っす
最終回だからといって特別なことはしないっすよ
一切期待せずに来てくださいっす
オフィスアワーは水曜日も土曜日もやるっすよ
宿題を個別に添削してほしい方とかは来てみてくださいっす
あと、この後質問を受け付けるの
プリムとかは片付けて帰ってくださいっす
ではお疲れさまでしたっす
今回は繰り返し(ループ)処理とllResetScriptの話っす。
ちょっと補足するっす。
for文の「初期化式」と「カウンタの更新」は、必要が無いなら
書かなくても良いっす。
「継続条件式」は必ず必要なのが他の言語との違いっすね。
for(;;)で無限ループさせることは出来ないわけっす。
(代わりにwhile(1)の無限ループは使えるっすよ)
省略して書くと、こんな感じになるっす。
default
{
touch_start(integer num_detected)
{
integer i = 0;
for( ; i < 5; )
{
llOwnerSay((string)i);
++i;
}
}
}
先にループ用変数(上の例ではi)を初期化してしまって、
「初期化式」を省略するのは結構やるっすよ。
見かけても驚かないようにしないとっすね。
Posted by ぺんぎん at 00:32│Comments(0)
│デジアカ