セカンドライフプラネット

セカンドライフのスクリプト言語(LSL)をプラネットします。3DCG で物体をプラネットしたりもします。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

スクリプト超初心者講座(制御構造5)

LSL超初心者講座もかなり進んできました。そこで、グローバル変数とif 文などを用いて、LSL-Tips(スイッチ) を作ってみます。

また、LSL-Tips(スイッチ)の応用例としてLSL-Tips(スライドドア)を解説します。

●Tips(スイッチ)
クリックの度に、スイッチのON・OFFが切り替わるようなスイッチを作ります。
プリムをクリックするとスイッチONとなり、もう一度クリックするとスイッチOFFとなります。

具体的には以下の仕様とします。
・最初クリックすると「ON」とチャットする
・次にクリックすると「OFF」とチャットする
・後は、クリック毎に「ON」・「OFF」を交互にチャットする

◇制作方針
クリックすると動作するので、今まで通りtouch_start イベントを使用します。そして、スイッチがONかOFFかを記憶するための変数を定義します。変数の型は何でもいいのですが、整数型を使用します。変数名はisON とします。

    integer isON;

スイッチがON のとき変数isON の値は1とし、スイッチがOFFのとき変数isON の値は0とします(そのように変数を使うと決めます)。

変数isON はtouch_start イベントの中で宣言することもできます。
しかしそうすると、プリムをクリックする度に(touch_start イベントが発生する度に)、変数isON を宣言することとなり変数isON の値がクリアされてしまいます。

すなわち、スイッチがON(isON が1)かOFF(isON が0)かを記憶しておくことができません。

そのため、変数isON をグローバル変数として宣言します。

◇フローチャート
以下に、Tips(スイッチ)のフローチャートを示します。

セカンドライフ スクリプト フローチャート スイッチ

フローに沿って説明します。
まず、プログラムをスクリプトエディターで記述し、スクリプトエディターの右下にある「保存」ボタンをクリックすることで、プログラムがコンパイルされリンデン社にあるサーバーに保存されます(Rez します)。

Rez されたオブジェクトは早速動き始めます。

最初、グローバル変数isON を宣言し値に0 を代入します。その後、defaultステートに移り、イベントが発生するのを待ちます。

オブジェクトをクリックすることでtouch_start イベントが発生します。

isONが0 ならば「ON」とチャットし、isON に1 を代入します。
isONが1 ならば「OFF」とチャットし、isON に0 を代入します。

Touch_start イベントを終了し、またイベントが発生するのを待ちます。

演習1:
クリックする度にON・OFFが切り替わることを、フローチャートをトレースして確認してください。ON・OFFが切り替わるアルゴリズムを理解してください。

◇プログラム
上記フローチャートをプログラムにします。

integer isON = 0;

default
{
  touch_start(integer total_number) 
  {
    if (isON == 0)
    { 
      llOwnerSay("ON"); 
             isON = 1;
    }
    else
    { 
             llOwnerSay("OFF"); 
             isON = 0;
    }
  }
}

実習1:
「箱」プリムをrez し、上記プログラムを実際に動かしてみてください。クリックすることで、ONとOFFが切り替わることを確認してください。


●スライドドアのヒナ型
Tips(スイッチ)は2つの状態をクリックで切り替える際に利用できます。
例えば、照明のオン・オフ、ドアの開閉、パーティクル効果の有無、などなど

◇プリムの制作
以下のサイズの「箱」プリムを作ります。スライド方向はX方向です。
X方向に1.70メートル
Y方向に0.07メートル
Z方向に3.00メートル

secondlife scripr tips slidedoor


◇プログラム
スクリプトエディターを用いて、以下のプログラムを作ります。

integer isOpen = FALSE;
vector SLIDE_VEC = <1.5, 0.0, 0.0>;     // meter

default
{
  touch_start(integer total_number)
  {
    vector doorPos = llGetPos();
    if (isOpen == FALSE)
    {
      llSetPos(doorPos + SLIDE_VEC);
      isOpen = TRUE;
    }
    else
    {
      llSetPos(doorPos - SLIDE_VEC);
      isOpen = FALSE;
    }
  }
}

プログラム解説:
プログラムの大筋(骨格)はTips(スイッチ)と同じです。TRUE、FALSE は定数でそれぞれの値は1と0 です。

グローバル変数として新たにベクトル型の変数を宣言しています。変数名はSLIDE_VEC とし、スライドするベクトル(長さと方向)を指定します。長さは1.50メートルで、方向はX方向です。

タッチした時の、ドアの位置をllGetPos関数で求めています。それを変数doorPos に代入します。

ドアが閉まっているときは、ドアの現在位置にSLIDE_VEC を足した位置にドアを移動させます。ドアプリムを移動させるために、llSetPos関数を使用します。

ドアが開いているときは、ドアの現在位置からSLIDE_VEC を引いた位置にドアを移動させます。

実習2:
実際にスライドドア・プリムを制作し、「スライドドアのヒナ型」を動かしてみてください。ドアの開閉ができることを確認してください。


●Tips(スライドドア)
実は、「スライドドアのヒナ型」はまだ一般的なスライドドアとしては使用できません。実習2の段階で気が付かれた方もいると思いますが、スライドドアを回転させた場合におかしな方向にスライドしてしまいます。

これは、スライドする方向が常にX方向となっているためです。

座標系には2種類あり、グローバル座標系とローカル座標系があります。
テレポートなでの際に指定する座標がグローバル座標です。
例:http://slurl.com/secondlife/Game%20Forum/35/63/25 の<35,63,25>

一方、オブジェクトに付随する座標系をローカル座標系といいます。

スライドするベクトル(大きさと方向)をグローバル座標からローカル座標に変換する必要があります。llGetRot関数でスライドドアの回転角度を求め、以下の掛け算をします。

     SLIDE_VEC * llGetRot();

説明は省略しますが、グローバル座標からローカル座標への変換方法だと理解してください。

//
// Slide Door Ver.0.1
//
// This Script was produced by Second Life Planet
//                          prototype in 2007/08/16.
//
//
http://gameworkshop.blog106.fc2.com/
//
integer isOpen = FALSE;
vector SLIDE_VEC = <1.5, 0.0, 0.0>;     // meter

default
{
  touch_start(integer total_number)
  {
    vector doorPos = llGetPos();
    rotation doorRot = llGetRot();
    if (isOpen == FALSE)
    {
      llSetPos(doorPos + SLIDE_VEC * doorRot);
      isOpen = TRUE;
    }
    else
    {
      llSetPos(doorPos - SLIDE_VEC * doorRot);
      isOpen = FALSE;
    }
  }
}

実習3:
Tips(スライドドア)を動かしてみてください。ドアを回転させて設置してもドアの開閉が正常に行えることを確認してください。


●スライドドアの配付
スライドドアを下記で無料配付しています。サイズやテクスチャーなど自由に変更できます。スクリプトも見れるので、いろいろと改良を加えてみてください。
Game Forum:http://slurl.com/secondlife/Game%20Forum/8/111/22

テーマ:セカンドライフ - ジャンル:オンラインゲーム

  1. 2007/12/12(水) 17:43:24|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:2
<<週刊懸賞生活に掲載決定! | ホーム | 2つのTipsを合成する方法(玄関センサー)>>

コメント

実習1

実習1のプログラムなんですけど
isOpen を isON にしないとエラーが出ますよ。
  1. 2007/12/30(日) 20:33:14 |
  2. URL |
  3. 通りすがり #-
  4. [ 編集]

実習1

通りすがりさん、ご指摘ありがとうございます。
ミスしてますね^^; 直しておきます。
  1. 2007/12/31(月) 19:04:53 |
  2. URL |
  3. Aa #-
  4. [ 編集]

コメントの投稿


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

トラックバック

トラックバックURLはこちら
http://gameworkshop.blog106.fc2.com/tb.php/53-b01d12fc
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Aa

Author:Aa
SLプラネットへようこそ!
Koenjiで物づくりしてます。
皆さん、遊びにきてください。

ショップのSLURL

ショップ(白屋)のSLURLです。メタバーズの高円寺にあります。商品を展示販売しています。

メタバーズ、高円寺、白屋

最近の記事

月別アーカイブ

カテゴリー

ブログ内検索

おすすめ商品!


パソコンの横において、疑問点をサッと調べられます!...



オブジェクト制作を基礎から解説!販売方法も詳しく記述!...



すぐに使えるサンプルプログラムを多数収録!...



関数の詳しい記述あり!辞書のように便利!...

ゲームPC

ゲーム用パソコンならドスパラへ!Galleriaシリーズが大人気!

リンク

このブログをリンクに追加する

スポンサードリンク

スポンサードリンク

最近のコメント

最近のトラックバック

RSSフィード

FC2カウンター

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。