忍者ブログ
This is an official blog of Orange Forest who is the aircraft developer in the Secondlife virtual world.

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

LSL 実践講座 - HUD編

こんにちわ、ミューズです。
みなさん Viewer2.x は使ってますでしょうか? 巷ではさんざんな評判のようですがw ウチは営業&サポートの都合上、なるべく標準準拠させなくてはなので、Viewer2.x を使うようにしています。 今日は Viewer2.x でちょっと欲しい情報を表示するHUDを作成したので、それを久しぶりなLSL講座のネタにします。


::: Addtional Informaton HUD for Vewer2.x :::

今回作成するのはコレ↑
現在位置と対地高度(地面からの高さ)とかを表示します。
それではこのHUDの作成方法とスクリプトの解説を始めます。

2010/06/13 Myuse 追記
現在位置のみであれば、 メニューバーから World > Show > Coordinates のチェックを入れることで上のURLバーみたいなエリアの表示でも取得が可能です。また、土地の属性は World > Show > Parcel Properties でアイコンみたいなのが出ます。 本記事はあくまでもLSLの題材として参照下さい。


- 注意 -
お決まりの話しですが、ココに記載の情報利用に伴う一切の不利益についてOrange Forestは責任を負いません。本記事の内容は自己責任で参照下さい。バグ指摘、質問は歓迎です。


::: Create a new box prim :::

 まずはHUDになるプリムを準備します。
Ctrl+B でBuild用のダイアログを出し、図のようにしてBoxプリムを1個、地面に生成します。


::: Edit the created prim and resize :::

続いてそのプリムを編集してサイズを小さくします。
2cm~5cmの立方体にするとよさそうです。


::: Create a new Script in HUD prim's content :::

次にプリムのコンテンツTabに移動して空っぽのスクリプトファイルを生成します。
あ、いい忘れましたが作業する土地はオブジェクト生成OK&スクリプト実行OKな所でお願いします。


::: Paste script code from the below of this blog article :::

スクリプトの中身をこのブログ記事の下にあるコードと入れ替えます。
スクリプトの機能はスクリプトのコメントを参照下さい。
書き換えたら保存して下さい。スクリプトのコンパイル処理が始まります。


::: Attach the object as HUD :::

HUDを"Right Click">"Take"してInventoryに取り込みます。
取り込んだHUDを図のようにHUDとしてアバターに装着します。


::: Locate HUD :::

装着したHUDは、"Right Click">"Edit" で位置やサイズを調整可能です。


::: Detach HUD if you want :::

HUDが不要になった場合は図のようにインベントリから選択して"Detach"することが出来ます。

それでは中身のスクリプトです。
改変、再販はユーザーの責任において御自由にどうぞ。

//---------------------------------------------------------------------------------
// showcurpos - Show current position
// $Id: showcurpos.lsl 682 2010-06-12 15:54:53Z myuse $
//---------------------------------------------------------------------------------

vector gPrevPos = ZERO_VECTOR;

default {
  state_entry () {
    // Show object after build
    llSetAlpha(1.0, ALL_SIDES);
    llSetText("", ZERO_VECTOR, 0.0);

    // HUDを装着したままスクリプトを編集した場合の初期化処理
    if (llGetAttached()) {
      llSetAlpha(0.3, ALL_SIDES);
      llSetTimerEvent(1.0);
    }
  }

  // HUDを装着した場合、on_rez → attach の順番でイベントが発生する。
  // HUDを地面に置いた場合は on_rez のみ発生
  // HUDを不透明にして動作停止
  on_rez (integer rezParam) {
    // Show object after rez
    llSetAlpha(1.0, ALL_SIDES);
    llSetText("", ZERO_VECTOR, 0.0);
    llSetTimerEvent(0.0);
  }

  attach (key id) {
    if (id == llGetOwner()) {
      // HUD をオーナーが装着した
      // → 半透明にして1秒毎に動作開始
      llSetAlpha(0.3, ALL_SIDES);
      llSetTimerEvent(1.0);
      gPrevPos = ZERO_VECTOR;
    }
    else {
      // HUDを取り外した
      // → 不透明にして動作停止
      llSetAlpha(1.0, ALL_SIDES);
      llSetText("", ZERO_VECTOR, 0.0);
      llSetTimerEvent(0.0);
    }
  }

 // 1秒毎に呼び出されるHUD表示更新処理
  timer () {
    vector  pos    = llGetPos();
    integer ground = (integer)llGround(ZERO_VECTOR);
    integer water  = (integer)llWater(ZERO_VECTOR);
    integer parcel = llGetParcelFlags(pos);
    string  out;
    integer abs;
    vector  col    = <0.0, 0.5, 1.0>;  // blue

    // Check if moved ?
    if (gPrevPos == pos) {
      // アバターが移動していない場合は何もしないで終了
      return;
    }
    else {
      gPrevPos = pos;
    }

    // Get absolute altitude
    if (ground > water) {
      abs = ground;
    }
    else {
      abs = water;
    }
    abs = ((integer)pos.z) - abs;

    out = llGetRegionName() + "/" +
          (string)((integer)pos.x) + "/" +
          (string)((integer)pos.y) + "/" +
          (string)((integer)pos.z) + "\nAbsAlt: " + (string)abs + "m";

    // HUDの文字の色の設定
    // 赤 : 進入禁止区域
    // 橙 : Rez不可
    // 青 : Rez, 進入OK
    // イマイチ正しく機能しない場合あり

    if (parcel & (PARCEL_FLAG_USE_ACCESS_GROUP |
                  PARCEL_FLAG_USE_ACCESS_LIST |
                  PARCEL_FLAG_USE_LAND_PASS_LIST)) {
      col = <1.0, 0.0, 0.0>;  // red
    }
    else if ((parcel & PARCEL_FLAG_ALLOW_CREATE_OBJECTS) == 0) {
      col = <1.0, 0.5, 0.0>;  // orange
    }

    // HUD表示
    llSetText(out, col, 1.0);
  }
}


PR