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

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

スポンサーサイト

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

スクリプト超初心者講座(関数2)

関数の2回目は、関数のパラメータについての説明です。前回の関数1回目では、パラメータの無い一番簡単な関数について説明しました。

パラメータのある関数例を以下に示します。

関数名「abc」の後に小カッコ()があります。その中にあるローカル変数がパラメータです。

abc(integer  a)
{
  llSay(0, "Hello");
}

◇関数名: abc
◇パラメータ: 整数型(integer)でパラメータ名は「a
◇関数本体: llSay(0, "Hello");

また、パラメータは「引数」と訳されます。


●仮引数と実引数
まず、以下の簡単なプログラムを説明します。

say(string  s)                               // 関数定義
{
      llSay(0,  s);
}

default
{
      state_entry()
      {
            say("Good morning");       // 関数使用
            say("Good afternoon");
            say("Good night");
      }
}

------------------------------------------------------------
関数は、定義(関数定義)して、使用(関数使用)します。

関数定義
以下の内容の関数を定義します。
◇関数名: 「say」
◇パラメータ: 文字列型、「s
◇関数本体: llSay(0,  s);

関数使用
State_entry イベントの中で関数を使用します。
------------------------------------------------------------

パラメータ(引数)には、仮引数と実引数があります。

◆仮引数
関数定義中に使われるパラメータ(引数)を仮引数といいます。上記プログラムでは「s」が仮引数です。
仮引数は関数を定義するために使われます。そのため、仮引数は任意の名前で構いません。
例えば、仮引数を「a」としてもOKです。その場合、関数は以下となります。

say(string  a)
{
      llSay(0,  a);
}

◆実引数
関数使用中に使われるパラメータ(引数)を実引数といいます。上記プログラムでは、say("Good morning"); の実引数は"Good morning" です。引数が実際のデータとなるので実引数とよびます。


●関数定義と関数使用
関数定義と関数使用の構造をまとめておきます。

関数名(型  仮引数)    // 関数定義
{
   関数本体
}

・関数定義は全てのステートの外、グローバル変数を定義するところと同じところに記述します。defaultステートの前です。

   関数名(実引数);    // 関数使用

・関数は何らかのイベント(例:state_entryイベント)の中で使用します。


●プログラム1(時間によりあいさつが変化する関数)

◇関数名: sayHello
◇仮引数: time
◇関数本体: 6時から10時の間は「Good morning」と、それ以外は「Hi」とチャットする

sayHello(integer  time)
{
      if (time>6  &&  time<10)
      {
            llSay(0,  "Good morning!");
      }
      else
      {
            llSay(0,  "Hi");
      }
}

default
{
      state_entry()
      {
            sayHello(9);
            sayHello(15);
            sayHello(21);
      }
}

◆課題1
(1)適当なプリムに上記プログラムを入れてコンパイル実行してください。
(2)上記プログラムの実引数は何でしょうか?
(3)上記プログラムの関数を、17時から24時の間は「Hello」とチャットするように修正してください。
ヒント:else if 文を使用します


●プログラム2(土地面積からプリム数を計算する)

◇関数名: numOfPrim
◇仮引数: area(土地面積)
◇関数本体: 土地面積からプリム数を計算する。

SIMは一辺256m の正方形をしていて、その全体面積は65,536㎡(256m×256m)です。SIM全体に置けるプリム数は15,000個です。プリム数は以下の簡単な比例式で計算しています。

     プリム数 = 15,000 * 土地面積 / 65,536

numOfPrim(integer area)
{
      float  work = 15000 * (float)area / (256*256);
      integer  num = (integer)(work + 0.5);           // 小数点以下を四捨五入
      llOwnerSay("Area:" + (string)area + "sqm -> Prim:" + (string)num);
}

default
{
      state_entry()
      {
            numOfPrim(65536);
            numOfPrim(4096);
            numOfPrim(2048);
            numOfPrim(1152);
            numOfPrim(784);
            numOfPrim(512); 
      }
}

◆課題2
(1)ボックスを作成し、上記プログラムを入れてコンパイル実行してください。
(2)上記プログラムの実引数は何でしょうか?
(3)土地レンタルしている(考えている)人は、自分の(候補地の)土地面積で計算してみてください。

スポンサーサイト

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

  1. 2008/01/07(月) 01:20:22|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

スクリプト超初心者講座(関数)

今回から数回に渡って、「関数」について簡単なところから説明していきたいと考えています。

関数は大別すると「ユーザー定義関数」と「組み込み関数」があります。

ユーザー定義関数は、ユーザーが定義して使用する関数です。一方、組み込み関数は、LSL に最初から用意してある関数です。

既に使用してきたllOwnerSay 関数などが、組み込み関数です。頭に「ll」が付くのが特徴です。

最初は簡単なユーザー定義関数から始めたいと思います。

■プログラム1
以下に、オブジェクトをコンパイルした際に、各国の言葉で「こんにちは」というプログラムを示します。

default
{
  state_entry()
  {
    llOwnerSay("hello");
    llOwnerSay("kon nichi wa");
    llOwnerSay("an nyon hase yo");
    llOwnerSay("ni hao");
    llOwnerSay("guten tag");
    llOwnerSay("bonjour");
  }
}


■プログラム2
このプログラムを関数を使用して書き換えてみます。

sayHello()                                       // ユーザー定義関数の定義
{
  llOwnerSay("hello");
  llOwnerSay("kon nichi wa");
  llOwnerSay("an nyon hase yo");
  llOwnerSay("ni hao");
  llOwnerSay("guten tag");
  llOwnerSay("bonjour");
}

default
{
  state_entry()
  {
    sayHello();                              // ユーザー定義関数の使用
  }
}

2つのプログラム(プログラム1とプログラム2)を見比べてください。


●一番簡単なユーザー定義関数
一番簡単なユーザー定義関数は以下の構造をしています。 

  関数名()
  {
    関数本体
  }

上記構造とプログラム2を比べると、関数名が「sayHello」で、関数本体は6個のllOwnerSay関数であることが分かります。


●ユーザー定義関数を定義する場所
ユーザー定義関数を定義する場所は、グローバル変数を定義した場所と同じ場所です。default ステートなどのステートの外側で定義します。


●ユーザー定義関数の使用
ユーザー定義関数はイベント中で使用します。以下の構造をしています。

  関数名();

プログラム2を見ると、state_entry イベント中でsayHello関数を使用しています。


■プログラム3
オブジェクトをコンパイルしたときとタッチしたときに、各国の言葉で「こんにちは」というプログラムを示します。

default
{
  state_entry()
  {
    llOwnerSay("hello");
    llOwnerSay("kon nichi wa");
    llOwnerSay("an nyon hase yo");
    llOwnerSay("ni hao");
    llOwnerSay("guten tag");
    llOwnerSay("bonjour");
  }

  touch_start(integer t_num)
  {
    llOwnerSay("hello");
    llOwnerSay("kon nichi wa");
    llOwnerSay("an nyon hase yo");
    llOwnerSay("ni hao");
    llOwnerSay("guten tag");
    llOwnerSay("bonjour");
  }
}

同じ内容のコードが重複していて、冗長になっています。


■プログラム4
プログラム3を関数を利用して書き換えてください。

◇解答例を以下に示します。

sayHello()
{
  llOwnerSay("hello");
  llOwnerSay("kon nichi wa");
  llOwnerSay("an nyon hase yo");
  llOwnerSay("ni hao");
  llOwnerSay("guten tag");
  llOwnerSay("bonjour");
}

default
{
  state_entry()
  {
    sayHello();
  }

  touch_start(integer t_num)
  {
    sayHello();
  }
}

プログラムから冗長な所が無くなりスッキリとしました。そうすることで、プログラムのメンテナンスが容易になり、バグの発生を抑えることができます。


●課題
プログラム3に「イタリア語」のあいさつ「ciao」を追加してください。次に、同じ修正をプログラム4に対して行ってください。
プログラム3の場合は2箇所修正するのに対し、プログラム4では1箇所修正することを確認してください。 短いプログラムですが、メンテナンスが容易になったことが分かります。

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

  1. 2008/01/04(金) 18:30:51|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

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

プログラムの制御構造には次の3種類がありました。

・順次処理
・分岐処理
・繰返処理

既に、順次処理と分岐処理については説明しました。今回は、制御構造の最後である「繰返処理」を解説します。

まず、オブジェクトをタッチすると、3回「Hello!」とチャットするプログラムを記述します。

default
{
  touch_start(integer  t_num)
  {
    llOwnerSay(“Hello!”);
    llOwnerSay(“Hello!”);
    llOwnerSay(“Hello!”);
  }
}

順次処理(llOwnerSay)を3回記述しています。


●for文
上記プログラムを、「繰返処理」の一種類であるfor文で記述してみます。

default
{
  touch_start(integer  t_num)
  {
    integer i;
    for (i = 0;  i < 3;  i++)
    {
      llOwnerSay(“Hello!”);
    }
  }
}

変数「i」 をカウンターとよび、後に続くfor文で使用します。for文にはカウンター変数が必要です。
変数名は任意です。

for文を使用した繰返処理は以下の構造となっています。

カウンター定義
for (カウンター初期化;   繰返条件;   カウンター更新)
{
  処理本体
}

プログラムから対応する部分を抜き出しますので、見比べてください。

integer i;
for (i = 0i < 3i++)
{
  llOwnerSay(“Hello!”);
}

上記プログラム部分をフローチャートにしてみます。
実は、「繰返処理」を一つの記号で表現するようなフローチャート記号はありません。繰返処理のフローチャートは順次処理と分岐処理の組み合わせで表現します。

セカンドライフ スクリプト for文
□インクリメント(復習)
記号「++」、プラスプラスをインクリメントとよびました。i++; は、i = i + 1; と同じ意味です。
すなわち、変数i の値に1を足しています。

上記フローチャートをフローに沿って解説します。
(1)カウンター定義:
 カウンターを整数型で変数名i で定義します。integer i;
(2)カウンター初期化:
 カウンターi に値0 を代入します。i = 0
(3)分岐条件:
 カウンターi と値3を比較します。i < 3
(4)分岐条件が「Yes」の場合:
 ・処理本体を実行します。llOwnerSay(“Hello!”);
 ・カウンター更新。i++
 ・(3)に戻る
(5)分岐条件が「No」の場合:
 ・繰返処理終了


●定石
For文はいろいろな記述方法があります。10回繰返す場合、次の記述が考えられます。
 ・for (i=0; i<10; i++)
 ・for (i=1; i<=10; i++)

どちらも正しく動きますが、前者が推奨されます。これは定石として暗記しましょう!


●実習
タッチしたら「Ohayo!」チャットを10回繰返す箱オブジェクトを作成してください。

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

  1. 2007/12/25(火) 17:22:29|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

スクリプト超初心者講座(制御構造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

スクリプト超初心者講座(変数5)

変数の実体はメモリー上の領域であることを見てきました。変数は変数宣言によりメモリー上に確保されます。

例:  integer  a;

メモリー上に変数名a の領域が確保されます。

図1.メモリー領域の確保(変数宣言)
secondlife script variable

確保したメモリ領域は、他のプログラムで使用できません。

それではその領域はいつ開放されるのでしょうか?
開放されたメモリ領域はどのプログラムからも使用可となります。


図2.メモリ領域の開放
セカンドライフ スクリプト 変数


変数宣言した変数は、プログラムのどこででも使用できるわけではありません。
使用できる範囲のことをスコープとよびます。

スコープについて以下のプログラムで説明します。説明のために、プログラムに行番号を付けています。

secondlife script scope
順次処理により、プログラムは0行目から6行目まで上から番号順に実行していきます。

ブロックが1行目から5行目にかけてあります。
(ブロックとは開中括弧 { と閉中括弧 } のペアのことです)

ブロック内で宣言した変数は、処理がブロックを抜けたときに開放されます。

この場合、変数a のスコープは2行目から4行目となります。


●ルール1
ブロック内で変数宣言した変数のスコープはそのブロック内である。

例1.
セカンドライフ スクリプト スコープ
例2.ブロックが入れ子(ネスト)になっている場合

secondlife script scope nest

実習1:
以下のプログラムをコンパイルしてください。

default
{
  state_entry( )
  {
    {
        string  a = “Good morning, Master.”;
     }
     llOwnerSay( a );
   }
}

llOwnerSay関数の変数a の後ろにカーソルが点滅し、以下のエラーメッセージが表示されます。

(7, 22) : ERROR : Name not defined within scope

コンパイルエラーです。

変数aを宣言したブロックの外では、変数aは開放されています。そのため、変数aを使用すると「定義されていません」とエラー表示されます。

llOwnerSay関数を正しい位置に修正してコンパイルしてください。


●ルール2
一般に同じ変数名は使用できないが、違うブロックであれば、同じ変数名を宣言できる。

例1.スコープが重ならない場合

secondlife script variable nest


例2.スコープが重なる場合

セカンドライフ スクリプト 変数 ネスト

ブロックが入れ子(ネスト)になっている場合、より深い方のブロックが優先される。


実習2:
以下のプログラムをコンパイル・実行してください。

default
{
  state_entry( )
  {
    string  a = “Good morning.”
    llOwnerSay( a );
    {
      string  a = “Good night.”;
      llOwnerSay( a );
    }
    llOwnerSay( a );
  }
}

以下のようにチャット出力します。
Object: Good morning.
Object: Good night.
Object: Good morning.

変数a のスコープが重なっています。動作を確認してください。


●グローバル変数
default ステートなどのステートの外で宣言する変数をグローバル変数とよびます。
グローバル変数は全てのブロックの外で宣言されます。

セカンドライフ スクリプト グローバル変数
それに対して、ブロックの中で宣言する変数をローカル変数とよびます。
ローカル変数はブロックによりスコープを制限されます。


実習3:
以下のプログラムをコンパイル・実行してください。

string  a = “Morning.”

default
{
  state_entry( )
  {
    llOwnerSay( a );
    {
      string  a = “Night.”;
      llOwnerSay( a );
    }
  }
}

グローバル変数を使用しています。
チャット出力を見て、動作を確認してください。

同じ変数名を使用する場合、スコープのネストが深い方が優先されることを確認してください。

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

  1. 2007/12/05(水) 15:36:40|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

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

制御構造の途中ですが、ここで演算子についてまとめておきます。既出のものが多数なのですが、ちょっとゴチャゴチャしてきたので整理しておきます。

●算術演算子
プラス(+):
2つの数値を加算する。 例: 10 + 20
2つの文字列を結合する。例: "Second"  +  "Life"

マイナス(-):
2つの数値を減算する。 例: 10 - 20

アスタリスク(*):
2つの数値を乗算する。 例: 10 * 20

スラッシュ( / ):
2つの数値を除算する。 例: 10 / 20


●代入演算子
イコール(=):
左辺の変数に右辺の数値を代入する。 例: a = 10;
左辺の変数に右辺の変数の内容(値)をコピーする。 例: a = b;

例:変数a に変数b の値に1足したものを代入する。
 a = b + 10;


●インクリメント・デクリメント
プラスプラス(++):
代入演算子の使用方法で、「変数に1を足す」といった特別な場合に++演算子を使用します。

例: a++;
これは、a = a + 1; と同じ意味です

マイナスマイナス(--):
代入演算子の使用方法で、「変数から1を引く」といった特別な場合に--演算子を使用します。

例: a--;
これは、a = a - 1; と同じ意味です


●関係演算子
関係演算子はif文の条件部分などで使用されます。

イコールイコール(==):
左右の値(もしくは変数の値)が等しい場合は真(1)となり、等しくない場合は偽(0)となります。

以下に例を示します。

default ()
{
   touch_start (integer num)
   {
      integer a = 0;
      if (a == 10)
      {
         llSay(0, "True.");
      }
      else
      {
         llSay(0, "FALSE");
      }
   }
}

上記プログラムを動かすと、「FALSE」とチャットします。

アバターが箱をタッチすると、
・まず変数a を整数型で宣言し、a に数値の0 を代入します。
・そして、if 文の条件部分において左辺の変数a の値(0)と10 が等しいか見ます。
・・等しくないので偽となり、else部分のブロックを実行します。

◇確認:
上記プログラムをコンパイル・実行してみてください。
上記プログラムで変数a に10 を代入してコンパイル・実行してみてください。

ノットイコール(!=):
左右の値(もくしは変数の値)が等しい場合は偽(0)となり、等しくない場合は真(1)となります。
==演算子と逆の結果となります。
 例: if (a != 10)

◇確認:
上記プログラムの「==」を「!=」に変更してコンパイル・実行してみてください。

小なり(<):
左辺の値が右辺の値より小さい場合は真(1)となり、大きいか等しい場合は偽(0)となります。
 例: if (a < 10)

小なりイコール(<=):
左辺の値が右辺の値より小さいか等しい場合は真(1)となり、大きい場合は偽(0)となります。
 例: if (a <= 10)

大なり(>):
左辺の値が右辺の値より大きい場合は真(1)となり、小さいか等しい場合は偽(0)となります。
 例: if (a > 10)

大なりイコール(>=):
左辺の値が右辺の値より大きいか等しい場合は真(1)となり、小さい場合は偽(0)となります。
 例: if (a >= 10)


●論理演算子
if 文などで複雑な条件を扱う場合に論理演算子を使用します。

アンド(&&):
2つの条件を同時に満たす場合に真となり、そうではない場合に偽となります。

例: if (a == 10  &&  b == 20)
変数a の値が10 、かつ変数b の値が20 の場合に真となり、それ以外の場合は偽。

オア(||):
2つの条件のどちらかを満たす場合に真となり、そうではない場合に偽となります。

例: if (a == 10  ||  b == 20)
変数a の値が10 、もしくは変数b の値が20の場合に真となり、それ以外の場合は偽。


課題
よくやる間違いをシミュレーションしてみます。

関係演算子の「==」に少し違和感を覚えたかと思います。と言うのも、関係演算子の「==」に相当するものを数学では「=」と書いていました。

数学では「=」は「右辺と左辺が等しい」場合の記号として使用してきました。
・・・数学:      = 記号
・・・プログラム:  == 記号

結論から言うと、プログラムでは「=」記号を代入演算子として使っているので、数学での等しいという意味の記号をプログラムでは「==」記号を使用します。

そのため、「=」と「==」の勘違いに起因するバグが発生します。

・・・以下のプログラムをコンパイル・実行してみてください。バグ入りです^^

default ()
{
   touch_start (integer num)
   {
      integer a = 0;
      if (a = 10)
      {
         llSay(0, "True.");
      }
      else
      {
         llSay(0, "FALSE");
      }
   }
}


正常にコンパイルされ、実行時エラーもありません。ただ動きがおかしいですね。

本来、FALSE とチャットされるのが、TRUE とチャットされています。これがロジックのエラーです。

コンパイル・実行されるプログラムは文法的には正しいプログラムです。ただ、今回のように論理的に間違っていることがあります。このことをロジックエラーとか論理エラーとよびます。正真正銘のエラーです^^

プログラムにバグがあります。どこだか分かりますか?

答えは、if 文の条件部です。a == 10 とするところを、a = 10 としています。

「a = 10」は、変数a に10 を代入せよという命令です。変数a は整数型ですし、10 も整数です。そのため、「a = 10」命令は成立し真(1)となります。

すなわち、if 文の条件部に「a = 10」のような代入文を使用すると常に成立することとなりロジックエラーとなります。

バグを修正してコンパイル・実行してみてください。

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

  1. 2007/11/29(木) 16:52:27|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

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

今回は前回の続きとして、フローチャートを用いて分岐処理を詳しく見ていきます。

前回のおさらいとして、一番簡単な分岐処理を見てみます。

●一番簡単な分岐処理
一番簡単な分岐処理をフローチャートにすると下図でした。

secondlife script flowchart
また、これをLSL で記述すると、以下となりました。

if (条件)
{
   処理
}

条件を満たした場合「Yes」は「処理」を行い、そうではない場合「No」は何もしません。
これが一番簡単な分岐処理でした。

それでは、二番目に簡単な分岐処理はどうなるでしょうか?

●二番目に簡単な分岐処理
二番目に簡単な分岐処理をフローチャートにすると下図となります。

secondlife script if else

これをLSL で記述すると、以下となります。

if (条件)
{
   処理1
}
else
{
   処理2
}

条件を満たした場合「Yes」は「処理1」を行い、そうではない場合「No」は「処理2」を行います。

ここで、「else」という文が出てきました。「else」は「if」とペアで用いられ、条件が満たされない場合の処理を記述します。

一番簡単な分岐処理を「if-else」で記述することもできます。

if (条件)
{
   処理
}
else
{
}

これでも正常に動作しますが、elseブロックの中には何もないので、「else { } 」をバッサリとカットします。

●else if 文
それでは問題です。以下のフローチャートをLSL で表すとどうなるでしょうか?

secondlife script if elseif

以下が解答例です。

if (条件1)
{
   処理1
}
else
{
   if (条件2)
   {
      処理2
   }
   else
   {
     処理3
   }
}

これで全く問題ありませんが、else if 文を用いると以下となります。

if (条件1)
{
   処理1
}
else if (条件2)
{
   処理2
}
else
{
   処理3
}

2つのプログラムを見比べてみてください。違いは分かりますでしょうか?
一目見てインデントの違いが目立ちますが、それ以外での違いです。

答えは、else と if の間にある開中括弧 { の有る無しです。

すなわち、else if 文とはelse { ifを省略したものだと理解すればよいです。

言い換えると、elseブロックの最初にif文がある場合は、else if 文で省略できます。


実習1.
以下のプログラムを手入力し実行させてください。
・コピー&ペースト禁止(コピペすると分からなくなりますヨ)。
・キャンプのレートに関するプログラムです。
・10分換算で2L$以上もらえると「Good Camp」とチャットします。
・それ以外の場合は「No Good Camp」とチャットします。

default
{
   touch_start(integer num)
   {
      integer rate = 1;
      if (rate >= 2)
      {
         llSay(0, "Good Camp.");
      }
      else
      {
         llSay(0, "No Good Camp.");
       }
   }
}

ここで、条件文(rate >= 2)について簡単に説明します。>= は比較演算子と呼ばれているものです。左辺の変数rate の値が、右辺の数値2 より大きいかどうかを判断しています。

大きい場合「Yes」の処理、そうでない場合「No」の処理に分岐します。

比較演算子については次回移行で詳しく説明します。

・変数rate の数値をいろいろと変えて正常に動作するかテストしてください。
    rate = 1; の数値を、例えば0, 1, 2, 3, 4, 5 に変えて動かす
・上記プログラムをフローチャートにしてください。


実習2.
以下のプログラムを手入力し実行させてください。

default
{
   touch_start(integer num)
   {
      integer rate = 1;
      if (rate < 2)
      {
         llSay(0, "No Good Camp.");
      }
      else if (rate < 4)
      {
         llSay(0, "Good Camp.");
      }
      else
      {
         llSay(0, "Very Good Camp.");
      }
   }
}

・上記プログラムをフローチャートにしてください。
・プログラムの内容を文章にしてください(箇条書き)。
・変数rate の数値をいろいろと変えて動作テストしてください。
    rate = 1; の数値を、例えば0, 1, 2, 3, 4, 5 に変えて動かす

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

  1. 2007/11/22(木) 02:57:50|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

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

前回はプログラムを図形化する方法(フロープリム)をお話ししました。制御構造の順次処理と分岐処理を図形化することでその概要を把握しました。

今回はプログラムを図化する方法(フローチャート)を説明します。フローチャートを用いることで、より詳細にプログラムを記述することができます。

LSL で使用する図記号(フローチャート記号)は長方形と菱形と丸の3種類です。
それぞれ、処理、分岐、イベントを表現します(下図、参照)。

セカンドライフ スクリプト フローチャート
処理と分岐に関しては、前回に図形記号(フロープリム)で説明しました。3D が2D になっただけで内容は同じです。

一般的フローチャートでは、○記号は結合子とよばれています。

今回、LSLをフローチャート化するため、○記号はイベントを表現することとしました。

LSL はイベント駆動型言語です。何らかの出来事(イベント)によりプログラムがスタートします。

例えば、箱プリムに以下のスクリプトが入っているとします。

default
{
  touch_start(integer touch_num)
  {
    llSay(0, "Hello");
  }
}

touch_start イベントは、アバターが箱プリムをクリックすることでスタートします。

アバターが箱プリムをクリックするイベント(出来事)をきっかけとして動き始めるイベントがtouch_start イベントです。

先ほどのプログラムをフローチャートにします。
secondlife script flowchart
●順次処理
フローチャートでは、各処理は上から下に順番に処理していきます。下から上へと処理が逆流することはありません。
セカンドライフ スクリプト フローチャート
上記フローチャートをLSL で記述すると以下となります。

c = a;
a = b;
b = c;

●分岐処理
何らかの条件により処理内容が変わる場合、分岐処理となります。条件を満たすときは「Yes」方向に行き、条件を満たさないときは「No」方向に行きます。分岐を表す図(ひし形)には必ず上から入り下か横に抜けます。

secondlife script flowchart

横から入るような書き方はお作法的に良くありません(×)。理由は見にくくなり誤解が生じるからです。

セカンドライフ スクリプト フローチャート
また、下に抜ける方を主流と考えて下方向を「Yes」にし、横方向を「No」にした方が見やすくはなります。しかし、下方向を「No」にしても問題ありません。

●一番簡単な分岐処理
一番簡単な分岐処理をフローチャートにすると以下となります。

secondlife script flowchart
分岐した「支流」は「本流」に戻します。
支流から本流にもどる際には矢印(←)を付けます。

上記フローチャートを、LSL で記述すると以下となります。

if (条件)
{
  処理
}

これが一番簡単な分岐処理です。
条件を満たした場合は「Yes」となり「処理」を行います。そうではない場合は何もしません。

実習1.
以下のフローチャートで表されるプログラムを入力し実行させてください。
・キャンプのレートに関するプログラムです。
・10分換算で2L$ より多くもらえると「Good Camp」とチャットします。
・動いたら、rate を1 に変えて動作させてみてください。

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

default
{
  touch_start(integer num)
  {
    integer rate = 3;
    if (rate > 2)
    {
        llSay(0, "Good Camp.");
    }
  }
}

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

  1. 2007/11/16(金) 02:22:31|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

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

前回までで変数は一応の終了です。今回から制御構造に入ります。

プログラムは個々の処理の集まりで、その集まりには前後関係があります。

例えば、まず整数型変数aを宣言(宣言処理)し、その次にaに値1を代入(代入処理)します。

宣言処理と代入処理の順序を逆にすることはできません(エラーになります)

このような処理と処理の結びつきを制御構造といいます。

制御構造は以下の3種類に大別できます。
●順次処理
●分岐処理
●繰返処理

制御構造は何らかの図化をすると分かりやすいです。
一般に、流れ図(フローチャート)とよばれる図化手法を用いますが、これについては次回以降にお話しさせていただきます。

今回はプリムを使用して制御構造を図形化してみました(流れ図形:フロープリム)。

●「Hello,Avatar」の図形化
お馴染みの以下のプログラムを図形化(プリム化)します。

default
{
  state_entry()
  {
  llSay(0,"Hello,Avatar!");
  }
  
  touch_start(integer total_number)
  {
   llSay(0,"Touched.");
  }
}

secondlife script flowchart

プログラムと流れ図形(フロープリム)を見比べてください。

●ステート

ステートは白いドーナツを薄くしたような形状で表現します。

●イベント
イベントは2つの赤球でつながった図形で表現します。
上のフロープリムを見ると、2つのイベントがあることが分かります。

●各処理

各処理は水色の立方体で表現します。

上の図形で、左側のイベントは、処理が一つなのでstate_entry イベントを表していることが分かります。。
・・・処理1:llSay(0, “Hello,Avatar!”);

一方、右側のイベントは、処理が二つなのでtouch_start イベントを表しています。
・・・処理1:integer  total_number;
・・・処理2:llSay(0, “Touched.”);


●順次処理
下の画像は、順次処理を図形化した部分です。
2つの処理を結ぶパイプに注目してください。このパイプの中を水が落ちると想像してください。

水の流れ方から、次の性質があることとします。
・・・水は上から下に流れる:まず、上の水色の箱(処理)を行い、次に下の箱(処理)を行う。
・・・水は下から上に流れない:逆流しない、すなわち下の箱を上の箱より先に処理することはない。

セカンドライフ スクリプト 制御構造

touch_start イベントを見ると、まず、整数型変数を宣言し、次にllSay 関数を用いています。このように個々の処理に順番を指定し、順番通り一つずつ実行していくことを順次処理といいます。

一つ一つ順番に処理していくので、「順次処理」といいます。

●一般的なLSLプログラムの図形化
一般的なLSLプログラムを図形化してみました。

secondlife script flowchart

2つのステートがあり、各ステートに2つのイベントがあることが分かります。
まだ説明していない黄色い図形があります。これは何でしょうか?

●分岐処理
黄色い図形は分岐処理を表します。

セカンドライフ スクリプト 制御構造

黄色い図形の上からパイプの中を流れてきた水は、条件により下に流れたり横に流れたりします。

流れが分岐するので「分岐処理」とよびます。

ここで注意点ですが、上からの水は100% 下か横かに流れていきます。下に60%、横に40% といった分岐ではありません。

残る「繰返処理」は次回以降に解説したいと思います。

LSLプログラムを図形化することは、プログラムの全体像を把握するのに役立ちます。

この図形は以下のSIM で公開していますので、見に来てください。
●SL Game Forum http://slurl.com/secondlife/Game%20Forum/61/52/36

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

  1. 2007/11/14(水) 04:24:47|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

スクリプト超初心者講座(変数4)

前回までのおさらいで、変数に関するプログラム問題を出題しておきます。
 
実際にプログラムしてください。初回にお話ししたように、プログラミングは体で覚えるものです。ガンバッテ実動させてください。
 
実習のやり方が全く分からない人は、以下のHP の項目「●実習に際して」をクリックしてください。
(またこのブログに戻るのですが・・・)
セカンドライフゲームフォーラム
 
また、今までの、スクリプト超初心者講座を上記HPにまとめてあります。ただ単にこのブログを項目分けしただけですが、ブログより見やすいと思います。そちらもご参照ください。
 
ここでまず、問題を解くのに必要な、まだ説明していないことをお話ししたいと思います。
 
●省略した書き方
今までは、変数を宣言することと、変数に値を代入することを別々に記述していました。
これを一行で記述することができます。
 
・・・別々に記述
string a;                                                        ← 変数の宣言
a = "Aa";              ← 値の代入    
 
・・・一行で記述
string a = "Aa";
 
変数の宣言と値の代入が一行で記述されています。
 
 
●プラス演算子(+)
プラス演算子は「足し算」を実行します。
 
足し合う変数や値が「整数型」の場合は、通常の足し算となります。
a = 123 + 456;
整数123と整数456を足して、整数型変数aに代入しています。
ここで、変数aには値579が代入されます。
 
足し合う変数や値が「文字列型」の場合は、面白い演算となります。
b = "Hello," + "Avatar!";
文字列”Hello,”と文字列”Avatar!”を結合して、文字列型変数bに代入します。
つまり、変数bには値”Hello,Avatar!”が代入されます。
 
 
●実習1.
以下の動きをするプログラムを制作しなさい。

箱をタッチすると「アバター名」とチャットする。

ヒント
・touchイベントの中で文字列型変数a を宣言する。
・変数aにアバターの名前を代入する。
・llSay関数を用いて「アバター名」をチャットする。
 
 
●実習2.
以下の動きをするプログラムを制作しなさい。
箱をタッチすると「Hello,アバター名!」とチャットする。

ヒント
・実習1のヒント参照
・文字列の足し算のために、新たな文字列型変数bを宣言する。
 
 
●実習3.
以下の動きをするプログラムを制作しなさい。
箱をタッチすると、整数型変数aの値をチャットする。

ヒント
・touchイベントの中で整数型変数a を宣言する。
・変数aに値(例えば、123)を代入する。
・文字列型変数bを宣言する。
・型変換を行い、aの値をbに代入する。
・llSay関数を用いて変数bの値をチャットする。
 
 
●実習4.
以下の仕様のプログラムを制作しなさい。
箱をタッチすると、整数型変数aとbを足した値をチャットする

ヒント
・実習3のヒント参照
・整数型変数aを宣言し、値(例えば、123)を代入する。
・整数型変数bを宣言し、値(例えば、456)を代入する。
・足した値を保存するメモリー領域(整数型変数c)を宣言する。
・変数cに変数a値と変数bの値を足した値を代入する。
 

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

  1. 2007/11/10(土) 00:08:51|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

スクリプト超初心者講座(変数3)

自分でプログラムを書けるようになるには、変数について詳しく理解する必要があります。

今回は「変数の型」について詳しく見ていきます。

●整数型の宣言
これまでに、変数を使用する際には、変数名と変数の型を宣言する必要があることを説明しました。

変数の型については、前回までは「文字列型」を使用していました。

今回、新たに「整数型」をお話しします。

整数型の変数とはその名のとおり、整数を保存しておくためのメモリー領域です。

以下の書式で整数型の変数を宣言します(下図、参照)。

integer  b;

変数名b の整数型の変数が宣言され、メモリー領域が確保されます。

下図は、文字列型の変数a と、整数型の変数b が宣言された状態を示しています。

secondlife スクリプト 変数

●整数型変数への値の代入
代入演算子(=)を使用して、整数値を代入します。

b = 123;

整数型の変数に文字列を代入するとエラーになります。

b = "123"; ← エラー

一般に、変数の型と代入する値の型が一致しないとエラーとなります。

ここで、「型変換」を行います。

b = (integer)"123";

変数b に整数値123 が代入されます。

型変換することで、文字列"123" が整数123に変換されます。

●型の違う変数間での値のやり取り
下図のように、文字列型の変数a の値"123" を、整数型の変数b に代入する場合、どうすればよいでしょうか?
考えてみてください。

secondlife スクリプト 変数

答えは、

b = (integer)a;

です。図にするとこのようになります。

secondlife スクリプト 変数

一般に、左辺と右辺の変数の型が異なる場合、以下となります。

変数1  = (変数1の型)変数2;

●llSay 関数
以下のllSay 関数はエラーになります。

integer a;
a = 123;
llSay(0, a);

何故でしょうか?

前々回、llSay 関数について説明しました。分からなかった人は前々回のllSay 関数に関する説明を参照してください。

答えは、llSay 関数の2番目のパラメーターが文字列ではないからです。
llSay 関数の2番目のパラメーターは文字列である必要があります。

integer a;
string b;
a = 123;
b = (string)a;
llSay(0, b);

文字列型の変数b を新たに宣言し、変数aの値を型変換し変数b に代入します。

●実習1.
準備1:地面に新しいプリムを作成してください。
準備2:新しいスクリプト(New Script)を作成してください。

スクリプトを以下のように記述し、実行してください。整数型の変数の値をチャット表示することができましたか。

default
{
    touch_start(integer total_number)
    {
        integer a;
        string b;
        a = 123;
        b = (string)a;
        llSay(0, b);
    }
}

●問題1.
以下のプログラムを作りなさい。
・aという変数名の整数型変数を宣言し、整数値 123 を代入する。
・bという変数名の整数型変数を宣言し、整数値 456 を代入する。
・cという変数名の整数型変数を宣言する。
・変数a と変数b を足し算し、変数c に代入する。
・足し算の結果をチャット出力する(llSay関数使用)。

ヒント:変数a と変数 b の値を変数c に代入するプログラムは以下のようになります。

c = a + b;

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

  1. 2007/11/04(日) 19:43:08|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

スクリプト超初心者講座(変数2)

今回は、前回のスクリプト超初心者講座(変数)のつづきです。

まず、前回のおさらいをしておきます。

それでは、以下のプログラム部分が実行されるとメモリーはどうなるでしょうか?

 string  a;
 string  b;
 a  =  "123";


答えは以下となります。
●メモリー上に、変数名a で文字列型の領域が確保されます。
●メモリー上に、変数名b で文字列型の領域が確保されます。
●変数a に値 "123" が代入されます。
(下図、参照)

secondlife script 変数

●代入演算子(=)
変数の中に値を代入する際に代入演算子を使用します。
a = "123"; を一般化すると以下となります。

変数 = 値;

左辺の「変数」に直接「値」を代入しています。

変数に値を代入する方法は他にもあります。変数の中に変数を介して間接的に値を入れる方法です。

変数 = 変数;

具体的に考えていきます。
上図の段階で、以下のプログラムを動かします。

b  =  a;

右辺が変数の場合、その変数の値が左辺の変数にコピーされます。
上図の場合で考えます。
左辺の変数(b)に、右辺の変数の値("123")がコピーされます。

secondlife script 変数

ここで、変数b に値が代入されますが、元の変数a の値はそのまま保持されていることに注意してください。

●実習1.
準備1:地面に新しいプリムを作成してください。
準備2:新しいスクリプト(New Script)を作成してください。

スクリプトを以下のように修正し、実行してください。動作結果を予想してください。
予想通りになりましたか。

default
{
    touch_start(integer total_number)
    {
        string a;
        string b;
        a = "123";
        b = a;
        llSay(0, a);
        llSay(0, b);
    }
}

●問題1.
以下のプログラムを作りなさい。
●「a」という変数名の文字列型変数を宣言し、文字列 "123" を代入する。
●「b」という変数名の文字列型変数を宣言し、文字列 "456" を代入する。
●変数a と変数b の値をチャット出力する(llSay関数使用)。
●変数a と変数b の値を入れ替える。
●変数a と変数b の値をチャット出力する(llSay関数使用)。

ヒント1:変数a と変数 b の値を入れ替える前のllSay(0, a); は "123" と返しますが、
入れ替えた後ではllSay(0, a); は "456" と返します。

ヒント2:変数の値入れ替え前後のメモリー状態

図.変数値入れ替え前
secondlife script 変数

図.変数値入れ替え後
secondlife script 変数

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

  1. 2007/11/03(土) 17:29:56|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

スクリプト超初心者講座(変数)

以前、コンピューターの構造についてお話ししました。主記憶装置(以下、メモリー)が一番重要な装置であることを説明しました。


secondlife script 変数

プログラマーはメモリーを自由に使用することができます。

自分が使用するメモリーの領域を「私が使います」と宣言します。

プログラマーが使用すると宣言したメモリー上の領域を「変数」とよびます。

宣言した領域を他のプログラム(例えば、OSなど)は使用できません。

secondlife script 変数

変数を宣言する場合、変数名と変数の型を宣言します。

●変数名
上図の場合、「a」 という変数名でメモリーの一部を確保しています

●変数の型
確保した領域に「何」を記憶させたいかを宣言します。
・・・・・ 例えば、文字列・整数・ベクトル・等。
この何を記憶させたいかを宣言することを「変数の型を宣言する」といいます。
上図の場合、文字列を記憶させたいので、変数名a の変数の型は文字列型を宣言します。

変数宣言の書式:
●変数名「a」 という文字列型の変数の宣言

secondlife script 変数 宣言

最後のセミコロン(;)を忘れずに!

●変数に値を代入する
変数に値を代入するには以下のようにします。

secondlife script 変数 代入

ここで、記号イコール(=)を代入演算子とよびます。

数学でイコール(=)は、右辺と左辺が等しいといった意味がありました。
プログラムにおいてイコール(=)は、左辺の変数に右辺の値を代入することを意味します。

上の例では、変数a に値 "123" を代入しています。

セミコロン(;)を忘れずに!


●実習1.
準備1:地面に新しいプリムを作成してください。
準備2:新しいスクリプト(New Script)を作成してください。

スクリプトを以下のように修正し、実行してください。

secondlife script 変数

プログラムの説明
●default ステート
LSL は複数のステート(状態)を記述することができます。いかなる場合においても、defaultステートは必ず記述する必要があります。defaultステートは、スクリプトが動く際にまず最初に動くステートです。

●touch_start イベント
LSL はいずれかのステートで何らかのイベント(出来事)が発生するのを待っています。上記の例では、LSLはdefaultステートで待機しています。
スクリプトが入ったプリムを「タッチ」すると、touch_start イベントの中身(ブロック内)が順次実行されます。

●llSay 関数
llSay 関数はLSL で予め用意されている関数です。
パラメーター(引数)を2個持ちます。
最初のパラメーターは通信チャンネル番号です。0番はパブリックチャンネルで、アバターが通常チャットしているチャンネルです。2番目のパラメーターは会話の内容です。
llSay(0,  a); は、「変数a の値をチャットしなさい」といった命令です。

●問題1.
「b」 という変数名の文字列型変数を宣言し、文字列 "456" を代入するプログラムを作りなさい。
ヒント:なし

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

  1. 2007/11/02(金) 17:39:48|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

LSL の書式(作法)

LSL(リンデンスクリプト) を記述するとき、準拠すべき記述方法(書式)があります。

プログラム以外の一般の文章にも書式はあります。
「拝啓・・・敬具」などがそうです。

これは守らなくても意味は伝わるので、「お作法」のようなものです。

プログラミングにおけるお作法は、プログラマの考え方が反映されるので、「コーディングスタイル」とよんだりもします。

この作法には絶対守るべきものから、まあどちらでも良いものまでいろいろあります。
また、バリエーションがあったりもします。

何か曖昧なところが、「お作法」的ですね。

今回は、優先度が高いものを説明したいと思います。
その他のお作法については順次その都度解説したいと思います。

以下のスクリプトで具体的に説明します。

secondlife スクリプト 書式 コーディングスタイル

●ルール1.
 開中括弧{ は必ず閉中括弧 }とペアにします。
これは「お作法」ではなく「文法」でした。これを守らないと一発アウト(エラー)です。
ペアにならない場合、かなり深刻なエラーとなります。

・・・開・閉括弧のペアのことを「ブロック」とよびます。


●ルール2.
 ブロックの字下げ(インデント)位置は、ブロック直前の単語と頭を合わせる。

・・・図では「default」という単語の頭である「d」の位置に、ブロック位置を合わせています。
他のブロックも同様であることが分かります。


●ルール3.
 ブロックの「中身」は「タブ(Tab)」キーを使用して字下げをする。
これは、スクリプトのエディターが自動的にやってくれています。自分で字下げするときは、タブキーを使用してください。このエディターの場合、タブキーを一回おすと半角空白が4個記述されます。

・・・図では、state_entry() の位置が字下げしてあることが確認できます。

そうすると必然的にブロックの中にまたブロックがあるような場合、中のブロックは字下げされることになります。

そのため、ブロックの始めと終わり(開・閉中括弧)が見やすくなります。


・・・図では、青丸で囲まれた開・閉括弧がペアになっていることがすぐに判別できます。

また、橙丸で囲まれた開・閉括弧もペアになっていることが「一目瞭然」で分かります。

プログラミングにおける、お作法の目的は一目瞭然にすることと考えてよいでしょう。
一目瞭然にすることで、プログラムミス(バグ)を低減させることができます。

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

  1. 2007/11/01(木) 18:25:30|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

リンデンスクリプト言語の構造

前回のLSL超初心者講座で、コンピューターの構造を記述しました。今回は、ソフトウェアの構造についてです。

リンデンスクリプト言語(LSL:Linden Script Language)は次の大小の構造に分けることができます。

●大構造:コンテンツ、スクリプト、ステート、イベント、関数
●小構造:変数、定数、制御構造、演算子

「大構造」の部分は、LSLの特徴を色濃く反映していますが、「小構造」の部分はLSL以外の言語に共通する仕様となっています。

今回は、LSLの大構造について見ていきます。
(個々の詳しい内容については次回以降で記述する予定です)

LSLはいくつかの階層で表現されます。

●コンテンツ(Contents:内容)
最下層のコンテンツ層はスクリプトの入れ物です。ここにスクリプトを記述します。

・・・スクリプト名は変更することができます。
・・・スクリプトは複数記述することができます。

セカンドライフ スクリプト contents

例えば、「ツアーライド」のスクリプトと「課金」のスクリプトを別々に記述することができます。

この場合、個々のスクリプトは独立に動きます。ツアーライドの乗り物を動かしながら、課金を実行します。

セカンドライフ スクリプト contents

機能をハッキリと分けることができるスクリプトは分けて記述した方が、各スクリプトが短くなり見やすくなります。

●スクリプト(Script)
Contents層の上に、スクリプト層があります。この中に、ステートを記述します。

例えば、New Scriptの中は以下のようになっています。

セカンドライフ スクリプト script

defaultステートは必須です。このステートがないとコンパイルエラーとなります。

スクリプト層に複数のステートを記述することができます。 defaultステート以外のステートは全てユーザーが定義します。

例えば、スイッチONとスイッチOFFとにステートを分けることができます。

セカンドライフ スクリプト script

ステートをハッキリと分けることができる場合は分けて記述した方が、各ステートが短くなり見やすくなります。

●ステート(State:状態)
スクリプト層の上に、ステート層があります。この中に、イベントを記述します。

例えば、defaultステートの中は以下のようになっています。

セカンドライフ スクリプト ステート

ステートの中に複数のイベントを記述することができます。

イベントの種類は既に決まっていて、ユーザーが追加定義することはできません。

●イベント(Event)
ステート層の上に、イベント層があります。この中に、関数を記述します。

例えば、state_entryイベントの中は以下のようになっています。

セカンドライフ スクリプト イベント

イベントの中に複数の関数を記述することができます。

●関数(Function)
関数とは、何らかのまとまった処理に名前を付けたものです。コンピューターの基本的な動き(入力→処理→出力)と相性がよい考え方です。

関数は、LSLに予め用意されている関数群(llSay関数、等)とユーザーが新たに定義する関数(ユーザー定義関数)に分類できます。

ユーザー定義関数の場合、最初に関数を定義する必要があります。

関数を定義する場所は決まっています。
・・・ユーザー定義関数はスクリプト層で定義する

関数を使用できる場所も決まっています。
・・・ユーザー定義関数の定義中(スクリプト層)
・・・イベント層

ユーザー定義関数の例: 関数名xyz

セカンドライフ スクリプト 関数

●スクリプト「ハロー、アバター」
建造ウィンドウでオブジェクトを作成し、新しいスクリプトを作成した際に、最初から記述されているのが下記スクリプトです。

default
{
      state_entry  (  )
      {
             llSay(0,  "Hello, Avatar!");
      }

      touch_start(integer  total_number)
      {
            llSay(0,  "Touched.");
      }
}

これをLSL階層図にすると下図のようになります。

セカンドライフ スクリプト ハローアバター

●建造ウィンドウの操作方法
sandboxでボックスを作成し、新しいスクリプトを作成する方法は以下を参照してください。細かい説明は読み飛ばし、主に建造ウィンドウの操作方法を習得してください。

1.sandboxでボックスを作成する方法
http://gameworkshop.blog106.fc2.com/category2-3.html
2.ボックスに新しいスクリプトを作成する方法http://gameworkshop.blog106.fc2.com/category2-2.html

●確認
1.contents層に複数のスクリプトを定義できることを実際に確認してください。
2.スクリプト層からdefaultステートを削除するとエラーになることを確認してください。

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

  1. 2007/09/01(土) 06:19:31|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

SIMの仕組み(コンピューターの構造)

LSL超初心者講座の続きです。SIMの仕組み、コンピューターの構造について見ていきます。

ノイマン型コンピューター
身の回りにあるコンピューターの大部分は、ノイマン型とよばれているものです。

例えば、今使用しているPC はノイマン型です。また、携帯電話やゲーム機(家庭用、携帯型、業務用)もノイマン型です。はたまた、あらゆる家電や自動車・航空機などに組み込まれているコンピューターも全てノイマン型です。

要するに、我々の周りにはノイマン型コンピューター(以下、コンピューター)で溢れかえっています。

コンピューターの構造
それでは、コンピューターはどのような構造になっているのでしょうか?

プログラムを制作する際に、コンピューターの大まかな構造を知っておく必要があります。ちょうど、自動車を運転するのに、自動車の構造を勉強するようなものです。

コンピューターは、主記憶装置を中心に、周りにCPU(中央処理装置)、入力装置、出力装置、補助記憶装置と配置されます。それぞれの装置は結線され、2進数で表現されたデーターが行き来することでプログラムが動作します。


セカンドライフ スクリプト コンピューター構造

●主記憶装置(Main Storage, Memory)
コンピューターで一番重要な装置は主記憶装置です。一般にメモリー(Memory)とよばれ、2進数で表現されたプログラム本体が保存される場所です。容量はコンピューターの用途により色々です。例えば、セカンドライフが快適に動作するPC の場合、メモリー容量は1GBとか2GBとかです。

●補助記憶装置(Secondary Storage)
名前の通り、主記憶装置を補助する装置が、補助記憶装置です。ハードディスクドライブ(HD)、USBメモリー、SDカード、ゲームカセット、などです。例えば、プログラム実行中にメモリー領域が足りなくなった場合、一時的に補助記憶装置が使用されます。また、一般的に主記憶装置は持ち運びができませんが、持ち運び可能な補助記憶装置を併用することでプログラムやデーターを持ち運ぶことが可能になります。

●中央処理装置(CPU:Central Processing Unit)
主記憶装置にあるプログラムを実行する装置です。この装置は全ての装置を司り、データーの流れを制御しています。

●入力装置(Input Devices)
プログラムの実行に必要な情報をプログラムに入力する装置です。キーボード、タブレット、ゲームコントローラー、携帯電話ボタン、などがあります。

●出力装置(Output Devices)
プログラムの実行結果を人間に表示する装置です。ディスプレイ、プリンター、などがあります。


システム
複数のコンピューターが接続されていたり、コンピューターと人間が仕事を分担していたりしている形態をシステムとよびます。

銀行システムや各種発券・運行システム(緑の窓口、航空機、鉄道)など社会のインフラとなっているシステムは大規模で大変重要なシステムです。インターネットもそうです。

これらは、作業を遂行する際に、複数のコンピューターの使用をその作業手順に含めています。コンピューター使用を前提に作業分担されます。


セカンドライフ スクリプト システム

システムエンジニアとよばれる職種の人達が、このコンピューターと人間の作業分担を設計します。

それでは、コンピューターが利用される以前にシステムは存在しなかったのでしょうか?
コンピューター以前にも、銀行はありましたし鉄道も動いていました。大まかにいって、人々は現在とあまり変わらない生活をすごしていました。


セカンドライフ スクリプト システム

実は、コンピューター以前にも、記憶装置(メモリー)は存在していました。
紙媒体では、帳簿や証書、書籍などがそうです。人間の不確かな記憶能力を補うそれらメモリーを利用することで、人間は複雑な業務を遂行していました。古い所では「原始人の壁画」もメモリーです。

グリッド
セカンドライフもシステムです。多数のコンピューターと人間が共同で擬似世界(セカンドライフ)を運営しています。

1つのSIMには1台のコンピューター(サーバー)が担当し、擬似社会を維持管理しています。

例えば、AaのいるToshimakuも1台のサーバー上で擬似世界が動いています。Toshimakuの西隣にはItabasikuが、東隣にはBunkyokuがあり、これらも1台1台別のサーバー上で動いています。Toshimaku近隣のSIMに対応するサーバーはお互いに結線されていて、情報をやり取りしています。

セカンドライフ スクリプト Tokyo2

上図はToshimakuが属するTokyo2の様子です。現在、23SIMがつながっています。すなわち、Tokyo2だけでサーバーが23台使用されています。

セカンドライフ スクリプト グリッド

上図の一つ一つがSIMです。セカンドライフ全体でこれだけ多くのサーバーが使用されています。リンデンラボでは、これらのことをグリッドとよんでいます。

セカンドライフ内でいろいろな所にショッピングやキャンプ(バイト)に行くと直ぐに気がつくことがあります。

●アバターが多数いるSIMは非常に重い。
●アバターが一人もいないSIMが結構ある。


「重い」とは、アバターが自由に動かせない状態のことです。これは、そのSIMのサーバーが多数のアバターの処理に手間取っているためです。

せっかく、多数のコンピューターを接続しているのですから、アバターの数が多いSIMの処理は、アバターの数が少ないSIMも分担して処理をするようにすれば良いと思うのですがどうなのでしょうか?

この辺の情報はプレミアム会員にならないと公開されないようです(英語ですが)。

Aaはまだベーシック会員ですが、早々にプレミアム会員になろうと考えています。この辺の情報が分かれば、またの機会にお話しできればと思います。

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

  1. 2007/08/14(火) 17:04:23|
  2. LSL-Tips集
  3. | トラックバック:1
  4. | コメント:0

スクリプト超初心者講座4(16進数、基数変換)

リンデンスクリプト言語の超初心者向けの講座、4 回目は16 進数と基数変換についてです。

LSL 超初心者講座(LSL-LSB:LSL lecture for super beginners)

前回、2 進数についてお話ししました。今回は、2 進数の親戚のような16 進数について解説し、その後、基数変換についてお話ししたいと思います。

16進数
使用文字
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F] の16 種類

桁(けた)
1, 16, 256, 4096, 65536, 1048576, ・・・
よびかたは、特にありません

これはまた、以下のように記述できます。
160, 161, 162, 163, 164, 165, ・・・

基数
各桁が16 の何乗といった形に表されるので、この16 を基数とよびます。16 進数の基数は16 です。

数の数え方
0 から始まり、1,2,3、4、5、6、7、8、9 と数えていきます。9 の次の数は、アルファベットの「A」です。その次は、「B」と「F」まで数えます。「F」の次の数は、新たに使用する文字がないので、桁が上がり2 つの文字を使用し、10 と表記します。



基数変換
10進数、2進数、16進数と見てきたように、数え方にはいろいろな進数がありました。各進数間での数の変換を基数変換といいます。

基数変換表
各基数間での変換を表にまとめたものを基数変換表といいます。

セカンドライフ スクリプト 基数変換表

ここで、基数の異なる数を同時に扱う場合、数に括弧をつけて右下に小さく基数を表記します。

例えば、
    (100)2  は2 進数の 100 です。
    (9)10  は10 進数の 9 のことです。

基数変換表を見ると、10 進数の 5、すなわち(5)10 を、2 進数に基数変換すると、(101)2 となることが分かります。逆に、(101)2  を10 進数に基数変換すると、(5)10 となることも分かります。

基数変換しても、物の数に変化はないことに注意してください。以下に例を示します。

リンゴが5 個ある状態

セカンドライフ スクリプト 2進数

この状態を、10 進数で表現すると、「リンゴが(5)10 個ある」です。2 進数で表現すると、「リンゴが (101)2 個ある」となります。

(5)10 と(101)2 とは、同じ数を表しています。すなわち、基数変換で物の数が変化することはありません。



人間とコンピューターとを隔てる高い壁
コンピューター(ノイマン型)はその数学的基礎が2 進数です。一方、人間は10 進数です。10 進数と2 進数の間には高い壁が存在します。それはそのまま「人間」と「コンピューター」を隔てる高い壁となっています。

セカンドライフ スクリプト 基数変換

基数変換においても、10 進数と2 進数の間では、計算を行う必要があります

一方、2 進数と16 進数は親戚の関係にあり、2 進数と16 進数間の基数変換では、計算を行う必要はありません


基数変換(10 進数 → 2 進数)
以下の手順で基数変換します。なお、手順はここで紹介する以外にも複数存在します。

2 進数の各桁が以下のようになっていることを利用します。
(1)10 = (1)2
(2)10 = (10)2
(4)10 = (100)2
(8)10 = (1000)2
(16)10 = (10000)2
(32)10 = (100000)2
(64)10 = (1000000)2
(128)10 = (10000000)2

2 進数の桁「ニー、ヨン、パー、イチロク、サンニー、ロクヨン、イチニッパー、・・・」は暗記しましたか?

1.対象となる数を、2 進数の各桁で構成されるように分解する。
2.分解した各々の数を、2 進数に基数変換する。
3.2 進数に基数変換した各々の数を合成(足し算)する。

手順を文章にしてもよく分からないと思いますので、例を示します。

例1.(76)10 を2 進数に基数変換しなさい。

1.(76)10 を2 進数の各桁に分解します。

  (76)10   =   (64)10   +   (8)10   +   (4)10


分解方法は以下のようにします。
・対象となる数(76)10に一番近くかつ小さい2 進数の桁を探します。(64)10 ですね。
・(76)10 から(64)10 を引きます。
  (76)10   =   (64)10   +   (12)10
・次に、(12)10 に一番近くかつ小さい2 進数の桁を探します。(8)10 ですね。
・(12)10 から(8)10 を引きます。
  (76)10   =   (64)10   +   (8)10   +  (4)10
・(4)10  は、2 進数の桁なので、対象となる数の分解は終了です。


2.分解した各々の数を、2 進数に基数変換します。
  (76)10  =  (1000000)2  +  (1000)2  +  (100)2

3.2 進数に基数変換した各々の数を合成(足し算)します。
足し算する各々の数は2 進数の桁なので、足し算することで桁上がりすることはありません。

セカンドライフ スクリプト 2進数
結局、答えは(1001100)2 です。


基数変換(2 進数 → 10 進数)

ビットが立っている
2 進数の場合、「1」となっている状態を「ビットが立っている」といいます。一方、「0」のことを「ビットが座っている」とかいったような言い方はありません。

例えば、(1001)2 では、一桁目(右端)と四桁目(左端)はビットが立っています。

2 進数から10 進数へは、以下の手順で基数変換します。なお、手順はここで紹介する以外にも複数存在します。

1.対象となる数を、ビットが立っている各桁に分解する。
2.分解した各桁を10 進数に基数変換する。
3.基数変換した各数を足し算する。

ここでも、例示します。
例1.(10100)2 を10 進数に基数変換せよ。

1.(10100)2 を、ビットが立っている各桁に分解する。
  (10100)2  =  (10000)2  +  (100)2

2.分解した各桁を10 進数に基数変換する。
  (10100)2  =  (16)10  +  (4)10

3.基数変換した各数を足し算する。
  (10100)2  =   (20)10


基数変換(2 進数 → 16 進数)
以下の手順で変換します。計算は一切必要ありません。

1.対象となる数を、右から四桁毎に分解する。
2.基数変換表を用いて、各四桁の2 進数を、16 進数に変換する。
3.基数変換した数をそのまま並べる。

例1.(10010101)2 を16 進数に基数変換せよ。

1.(10010101)2 を右から四桁で区切る。間に線を入れる。
セカンドライフ スクリプト 基数変換

2.基数変換表を用いる

セカンドライフ スクリプト 基数変換


3.基数変換した数をそのまま並べる。間の線を取り去る。

セカンドライフ スクリプト 基数変換
答えは、(95)16 です。


基数変換(16 進数 → 2 進数)
以下の手順で変換します。計算は一切必要ありません。

1.対象となる数を、右から一桁毎に分解する。
2.基数変換表を用いて、各一桁の16 進数を、2 進数に変換する。
3.基数変換した数をそのまま並べる。

例1.(6C)16 を2 進数に基数変換せよ。

1.一桁毎に線を入れる。

セカンドライフ スクリプト 基数変換


2.各桁の16 進数を、2 進数に変換する。基数変換表を用いる。

セカンドライフ スクリプト 基数変換


3.線をとる。

セカンドライフ スクリプト 基数変換
答えは、(01101100)2 です。


確認
●基数変換表を作成してください。何も見ないで再現できることを確認してください。
●(255)10 を2 進数に変換してください。計算が必要なことを確認してください。
●(10000000)2 を16 進数に変換してください。計算が必要ないことを確認してください。
●(255)10 を16 進数に変換してください。計算が必要なことを確認してください。
●(E8)16 を2 進数に変換してください。計算が必要ないことを確認してください。

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

  1. 2007/07/17(火) 19:52:31|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

スクリプト超初心者講座3(2進数)

リンデンスクリプト言語の超初心者向けの講座、3回目は2進数についてです。

LSL 超初心者講座(LSL-LSB:LSL lecture for super beginners)

リンデンスクリプト言語の場合、実は、2進数の知識がなくてもスクリプトを作成することは可能です。そのため、パスしてもよかったのですが、プログラマーであれば2進数は理解しておかないとと思い、記述することにしました。

LSL を深く理解する上でも、2進数の知識は有用です。知っていて損はないです。

2進数に入る前に、10進数についての簡単なおさらいをします。

10進数
使用文字
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] の10 種類

桁(けた)
1, 10, 100, 1000, 10000, 100000, 1000000, 100000000, ・・・
イチ、ジュー、ヒャク、セン、マン、ジュマン、ヒャクマン、センマン、イチオク、・・・

これはまた、以下のように記述できます。
100, 101, 102, 103, 104, 105, 106, 107,・・・

ここで、例えば102 は10 の2 乗のことで、10×10 と10 を2  回かけ算することです。

基数
各桁が10 の何乗といった形に表されるので、この10 を基数とよびます。10 進数のは基数は10 です。

数の数え方
0 から始まり、1,2,3、4、5、6、7、8、9 と数えていきます。9 の次の数は、新たに使用する文字がないので、桁が上がり2 つの文字を使用し、10 と表記します。「イチ・ゼロ」を「ジュー」とよびます。


2進数
使用文字
[0, 1] の2 種類

桁(けた)
1, 2,4,8,16,32,64,128,256,512,1024,・・・
ニー、ヨン、パー、イチロク、サンニー、ロクヨン、イチニッパー、ニゴロ、ゴーイチニー、イチマルニーヨン、・・・
これは、何度も暗唱して確実に覚えてください!

これはまた、以下のように記述できます。
20, 21, 22, 23, 24, 25, 26, 27,・・・

ここで、例えば23 は2 の3 乗のことで、2×2×2 と2 を3  回かけ算することです。

基数

各桁が2 の何乗といった形に表されるので、この2 を基数とよびます。2 進数のは基数は2 です。

数の数え方
0 から始まり、1 と数えていきます。1 の次の数は、新たに使用する文字がないので、桁が上がって2 つの文字を使用し、10 と表記します。10 は「イチ・ゼロ」とよびます。2 進数では、使用する文字が2 種類しかないので、10 進数の場合と比べて頻繁に桁が上がります。


下図のようなリンゴの状態を表す数

セカンドライフ スクリプト 2進数

10 進数では、「リンゴが5(ゴ)個あります」といい、2 進数では、「リンゴが101(イチ・マル・イチ) 個あります」といいます。

2 進数の基本パターン
2 進数の数の数え方には基本パターンがあります。箱に石を入れる話を思い出してください。空箱に右から左へと順序よく石を入れていきます。2 進数なので一つの箱に石は一つしか入れられません。

セカンドライフ スクリプト 2進数

2 進数の数の増え方を以下に述べます。箱と石を思い浮かべで思考実験してみてください。少し複雑ですが、がんばってパターンを理解してください。

1. 最初、全ての箱に石が入っていません。
2. 次に、右端の箱に石を入れます。
3. 既に、右端の箱に石が入っているので、右から2 番目の箱に石を入れて、右端の箱から石を取り出します。
4.   2. を行います。
5. 既に、右端から2 番目までの箱に石が入っているので、右から3 番目の箱に石を入れて、右端から2 番目までの箱に入っている石を取り出します。
6.   2. ~4. を行います。
7. 既に、右端から3 番目までの箱に石が入っているので、右から4 番目の箱に石を入れて、右端から3 番目までの箱に入っている石を取り出します。
8.   2.~6. を行います。

基本パターンが理解できたら、石が入っていない箱を 「0」に、石が入っている箱を 「1」に置き換えます(下図参照)

セカンドライフ スクリプト 2進数

2進数と10進数との対応表
今までの話しを総合すると以下のような表となります。

セカンドライフ スクリプト 2進数

黄色でぬってあるところは桁上がりしているところです。

基数の異なる数を同時に扱う場合、数に括弧をつけて右下に小さく基数を表記します。例えば、(100)は2 進数の100 です。(9)10 は10 進数の9 のことです。

対応表を全部覚えるのは大変なので、まずは桁上がりしているところだけを覚えましょう。ニー、ヨン、パー、イチロク、サンニー、・・・です。

(2)10 = (10)2
(4)10 = (100)2
(8)10 = (1000)2
(16)10 = (10000)2


確認
●2 進数と10 進数との対応表を、(0)10から(15)10 まで作成してください。パターンを考えながら、何も見ないでできることを確認してください。
●上で作成した対応表において、桁上がりしているところが間違っていないか確認してください。
●2 進数と10 進数との対応表を、(16)10から(31)10まで作成してください。パターンを考えながら、何も見ないでできることを確認してください。

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

  1. 2007/07/15(日) 22:51:35|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

スクリプト超初心者講座(接頭語)

リンデンスクリプト言語の超初心者向けの講座、2回目は接頭後についてです。

LSL 超初心者講座(LSL-LSB:LSL lecture for super beginners)

接頭語(せっとうご)

「目的地は5kメートル先です」とか、「ペン先が0.3mメートルのボールペン」とかに使われている「k」や「m」が接頭語です。メートルは長さの単位です(前回やりました)。

ちなみに、メートルは「m」と表記するので、上記の例では通常は「5km」、「0.3mm」と表記されます。

k(キロ)
1,000 倍のことを表す接頭語は、「k」です。
1km とは、1,000m のことです。1kg とは、1,000g のことです。
1Kbit とは、1,000bit のことです。1kByte とは、1,000Byte のことです。

M(メガ)
1,000,000 倍のことを表す接頭語は、「M」です。「M」は「k」の1,000 倍です。

G(ギガ)
1,000,000,000 倍のことを表す接頭語は、「G」です。「G」は「M」の1,000倍です。「G」は「k」の1,000,000 倍です。

T(テラ)
「T」は「G」の1,000 倍のことを表す接頭語です。

P(ペタ)
「P」は「T」の1,000 倍のことを表す接頭語です。

ここまで記述するともうお分かりのように、1,000倍・1,000倍・1,000 倍と接頭語が変わっていきます。

なぜ、1,000倍で接頭語が変わるのでしょうか?

人間の情報処理能力が1,000 倍が限度なのが原因ではないでしょうか。

人間の指は10 本です。そのため、指折り数えることで、10 までの数を処理することができます。人間の直感で実感できる数字が1,000 が限界なのではないでしょうか。

例えば、一日のおこずかい(自由に使えるお金)が千円(1K円)の人がいたとします。

その人にとって、1 円以下のお金は意味があるでしょうか?たぶん、拾ってもうれしくないし、落としても気がつかないのではないでしょうか(1円を大事にしないという話ではありません)

また、その人にとって、毎日100万円(1M円)使うとはどうゆうことでしょうか?

1,000 倍というのは、それくらいの大きな違いがあり、そのため接頭語を変えると考えると納得がいきます。

10倍、100倍までは何となく実感がわくのですが、1000倍を越えると世界が変わるといった感じでしょうか。

キロ・メガ・ギガ・テラ・ペタ」、「キロ・メガ・ギガ・テラ・ペタ」、「キロ・メガ・ギガ・テラ・ペタ」と何回も繰り返し暗唱して暗記してください。


m(ミリ)
1,000 分の1倍のことを表す接頭語は、「m」です。

μ(マイクロ)
1,000,000 分の1倍のことを表す接頭語は、「μ」です。「μ」は「m」の1,000 分の1倍です。

n(ナノ)
1,000,000,000 分の1倍のことを表す接頭語は、「n」です。「n」は「μ」の1,000 分の1倍です。

p(ピコ)
1,000,000,000,000 分の1倍のことを表す接頭語は、「p」です。

f(フェムト)
1,000,000,000,000,000 分の1倍のことを表す接頭語は、「f」です。

ミリ・マイクロ・ナノ・ピコ・フェムト」、「ミリ・マイクロ・ナノ・ピコ・フェムト」、「ミリ・マイクロ・ナノ・ピコ・フェムト」と何回も繰り返して暗唱して暗記してください。

PCプログラミングやPC周辺機器のスペックによく出てくる接頭語は、大きいほうは「k」「M」「G」で、最近は「T」です。近い将来には、「P」が登場するでしょう。

確認
●100MByte のUSBメモリーに、一枚約100kByte の画像を何枚保存できるでしょうか?
●「bps」とは通信回線などのデータ転送速度の単位で、「bits per second」一秒当たりに転送する情報量(ビット数)の略です。100Mbps の光回線で、1bit のデータは理論上何秒で転送できるでしょうか?

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

  1. 2007/07/14(土) 03:56:56|
  2. LSL-Tips集
  3. | トラックバック:1
  4. | コメント:0

スクリプト超初心者講座(単位)

リンデンスクリプト言語の超初心者向けの講座、初回は単位についてです。

LSL 超初心者講座(LSL-LSB:LSL lecture for super beginners)

単位(たんい)

単位は「長さの単位はメートルです」といった使われ方をします。

単位とは、何かの量を数値で表現するための基準値のことです。何かの量とは、重さとか長さとか時間などです。

単位には、歴史文化的背景、科学的発見、人体構造などいろいろな要因で、同じ量を表すにもいろいろな表現があります。

●重さの単位:グラム、トン、オンス、匁(もんめ)、など。
●長さの単位:メートル、インチ、フィート、ヤード、尺(しゃく)、など。
●時間の単位:秒、分、時間、日、など。

情報も量です。「情報量が多い」とかいいますよね。情報も量であるので単位が存在します。

●情報の単位:ビット(bit)、バイト(byte)など。


1ビットの情報とは?

質問:それでは、1ビットの情報とは、どれだけの情報量でしょうか?

回答:1ビットの情報は、「2つの状態を識別できる」情報量です。
例をあげると
・・・スイッチのONとOFF
・・・イスに座っているか立っているか
・・・箱に石が入っているか入っていないか
・・・などなど

2つの状態:箱に石が入っている状態と入っていない状態


セカンドライフ スクリプト ビット

                  箱に石が入っていない


セカンドライフ スクリプト ビット

                  箱に石が入っている


箱と石の状態を図にすると以下となります。



セカンドライフ スクリプト ビット



2ビットの情報とは?
2ビットの情報により、2個の箱に石が入っているか否かの状態を表現することができます。すなわち、2×2の4通りの状態を表すことができます。

2ビットの情報は、1ビットの情報の組み合わせ(掛け算)となります。足し算2+2ではありません。


4つの状態:右の箱にだけ石が入っている状態


セカンドライフ スクリプト ビット


箱と石の各状態を図にすると以下となります。


セカンドライフ スクリプト ビット



8ビットの情報とは?
8ビットの情報は、2×2×2×2×2×2×2×2の256通りの状態を表現できます。


セカンドライフ スクリプト 箱と石



8ビットのことを、1バイトとよびます。


1バイト =  8ビット


8ビットをひとまとめにして1バイトと名付けるには理由があります。たた、今は丸暗記してください。ビットという単位が小さすぎて不便なことが多々あるのでバイトを導入したと考えてください。

例えば、「2時間後に会いましょう」というのと、「7,200秒後に会いましょう」では全く同じ意味ですが、普段後者の言い方をすることはありません。

日常生活においては、「秒」という単位は使いずらいので、「時間」を使用します。


1時間 = 3,600秒


それと同じです。



確認:
3ビットの情報で、表現できる状態は8通りであることを確認してください。箱3個と石3個を用意し(図にしても可)、箱と石の状態が8通りあることを実験して確認してください。実験結果から、3ビットの場合、2×2×2の8通りであり、2+2+2の6通りではないことを確認してください。

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

  1. 2007/07/12(木) 17:20:48|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:0

スクリプトの超初心者向け講座はじめます

リンデンスクリプト言語の超初心者向けの講座をはじめます。

LSL 超初心者講座(LSL-LSB:LSL lecture for super beginners)

LSL(リンデンスクリプト言語)には、日本語訳wiki がありLSL初心者向けのチュートリアルが充実しています。また、言語体系も明確なので、他のコンピュータ言語を知っているがLSL は知らない人(LSL 初心者)にとっては簡単に習得できます。

ただ、そこのLSLチュートリアルを見ていると、他のコンピュータ言語を全く知らない、本当の初心者(超初心者)にとっては、プログラミングまでには至らないだろうなと感じます。周りを見てもLSL などのスクリプトに大変苦戦しています。

やはり、プログラミングできるようになるためには、オーソドックスなプログラミング教育を習得する必要があります。

プログラミングに王道なし!

そのために、例えばまずC言語を勉強するのも一つの方法です。確実な方法ですが、たぶん独学では大部分の人は息切れしてしまうでしょう。LSL はC よりも格段に簡単です。

LSL のwiki にあるチュートリアルを元に、「言葉」を一つ一つ解読していくのも一つの方法です(実際、全然お勧めではないのですが)。ただこの方法では情報の迷宮(wiki) に迷い込み、目的地(プログラミング)に到達できないでしょう。プログラミングは「知識:頭で理解する」ものではなく、「反応:体で覚える」ものです(本当です)。

そこで、プログラミング言語を全く知らない(超初心者)向けのLSL 講座を記述していこうと思います。

オーソドックスなプログラミング教育を、LSL プログラミング向けにアレンジします。

それにより、超初心者が最速でLSL プログラミングできるようになる(なれば良いなぁー)と考えています。

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

  1. 2007/07/12(木) 03:15:22|
  2. LSL-Tips集
  3. | トラックバック:0
  4. | コメント:1

プロフィール

Aa

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

ショップのSLURL

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

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

最近の記事

月別アーカイブ

カテゴリー

ブログ内検索

おすすめ商品!


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



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



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



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

ゲームPC

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

リンク

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

スポンサードリンク

スポンサードリンク

最近のコメント

最近のトラックバック

RSSフィード

FC2カウンター

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