Virtoolsスクリプト言語(VSL)チュートリアル-値、タイプ、変数



VSLは、次のタイプの値を認識します.
  • 、123、3.14159、'v'または0 xe 0 d 02090、
  • などの数字
  • 論理ブール値:trueまたはfalse
  • 文字、例えば「Virtools,The Behavior Company」
  • 特殊キーワードnullは
  • に等しい.
    を選択します.
    VSLはタイプ化された言語であり、コンパイル時に各変数と各式にタイプがあることを意味します.タイプは演算の意味を決定する.強いタイプは、コンパイル時にエラーをチェックするのに役立ちます.
    VSLタイプは3種類に分けられます.
  • 基本タイプ
  • VSL構造タイプ
  • C++クラス/構造タイプ
  • 基本タイプはブール型(bool)と数値タイプです.デジタルタイプは、整数型(char,int)および浮動小数点型(float)である.
    を選択します.
    内容
    サイズ
    値範囲
    bool
    boolタイプは整数タイプです.論理数を表す2つの可能な値(trueまたはfalse)
    4 Bytes
    trueまたはfalse(0 or 1)
    char
    charタイプも整数タイプであり、通常はASCII文字セットメンバーの実行を含む.
    4 Bytes
    -128 to 127
    int
    intタイプも整数タイプです.C/C++の符号なしintタイプと等価です.
    4 Bytes
    ?147483647? to 2147483647
    float
    floatタイプは浮動小数点数タイプです.C/C++におけるfloat型と等価である.
    4 Bytes
    -3.402823466e+38F to 3.402823466e+38F
    str
    strタイプはC/C+のchar*タイプと等価です.
    4 Bytes
    -
    ご覧のように、すべてのVSLの基本タイプは4バイトで実現されており、メモリではワードグループの整列方式であり、より多くのスペースが必要かどうかに拘束されません.たとえば、charタイプはASCIIコードテーブルのメンバーを表すのに1バイトしかかかりませんが、VSLでは4バイトも使用されています.
    VSL構造は、VSLでカスタムデータ型を作成する方法の1つです.VSL構造は、任意のVSLの既知のタイプのメンバーであってもよい、0個以上のメンバーを有してもよい.VSL構造はC構造と非常に類似している.構造宣言の例:
    struct Car
    {
    Entity3D entity;
    Vector direction;
    float gaz;
    };
  • VSLは、C/C++タイプを操作することができる.VSLでクラス(class)を使用する前に、バインドする必要があります.

  • VSLは多くのVirtools SDKにおける制約クラス(bound classes)に由来する.ほとんどの場合、クラス名はVirtools SDKからVSLに変更されます.Virtools SDKユーザーにとってCK 3 dEntityはよく知られているクラスですが、VSLになるとその名前は「Entity 3 D」に変わります.
    変数#ヘンスウ#
    変数は、メモリセルであり、基本タイプ、VSL構造、またはC/C++クラスのいずれかに関連付けられたタイプです.変数には、常にそのタイプと互換性のある割り当てられた値が含まれます.変数の値は、割り当てまたは接頭辞または接尾辞++/--演算子によって変更されます.
    ここには、VSLで変数宣言を行う例があります.
    // Declare an integer variable named "i"
    int i;
    // Declare an array of 123 float named "table" float table[123];
    // Declare a Vector variable named "speed", initialized with values 1.0, 2.0 and 3.0 Vector speed(1.0,2.0,3.0);
    // Declare a variable referencing an Entity3D Entity3D bird;

    変数の範囲
    VSLでは変数名はプログラムの特定の領域でのみ使用できます.この領域を変数名の適用範囲と呼ぶ.適用範囲:累積変数名(非静的または非共有変数を指す)のライフサイクル.適用範囲は、クラスのコンストラクタまたはコンストラクタを呼び出すときの変数名の可視性、およびローカル変数の初期化をいつ行うかも決定します.
    void foo(int a) // start of the function foo scope
    {	
    	if (a) // start of if scope
    	{
    	
    	} // end of if scope
    } // end of the function foo scope
    

    変数のライフサイクルを簡単な例で考察します.
    float angle; // Declaring a global variable
    
    void foo()
    {
    	angle = 0.01; // ok
    }
    
    void foo2(int a)
    {
    	angle = a*180/P; // error, P is not yet declared
    	float P = 3.14159;
    		
    	if (a) // ok
    	{
    		float angle2 = 360-angle; // ok
    	}
    	bc.OutputToConsole(angle2); // it doesn't exist outside of the scope of the enclosing braces {...}
    }

    関数の外で変数を宣言すると、現在のVSLスクリプトのさまざまな場所で役立つため、グローバル変数として呼び出されます.
    静的および共有グローバル変数
    我々のグローバル変数は共有式または静的であってもよい.
  • 静的グローバル変数は、スクリプトの2回の実行で値を維持する特性を有する.
  • 共有グローバル変数は、その値を静的に維持する能力を有するが、この変数を宣言したすべてのスクリプト間で共有することができる.

  • 静的または共有グローバル変数の宣言方法
    shared int a; // a is a shared global variable
    static float b;	// b is a static global variable
    
    void main()
    {
    	shared int i;// i is not a shared variable (shared keyword is ignored)
    	static float j;// j is not a static variable (static keyword is ignored)
    	// ...
    }
    

    静的または共有グローバル変数を宣言すると、デフォルトのコンストラクタ環境のない変数を初期化または呼び出すことはできません.
    shared int a = 0; // error
    static Vector v(1.0,2.0,3.0); // error
    
    void main()
    {
    	static int b = 0; // Not an error because static keyword is ignored
    	shared Vector w(-1,0,0); // Not an error because shared keyword is ignored
    	// ...
    }
    

    静的グローバル変数
    例:
    // ...
    static int a;
    
    void main()
    {
    	if (iIn1) { // iIn1 is a boolean global variable
    		a = 0;
    	} else {
    		++a;
    	}
    }
    

    私たちが初めてスクリプトを実行したとき、iIn 1はtrueであり、aは0に等しい.そして,次のスクリプト実行時にaの値を増加させるためにiIn 1をfalseとするので,そのとき2回目の実行時にaを1とし,3回目にaを2とするなどする.
    グローバル変数の共有
    例:
    // First script
    shared Vector pos;
    
    void main()
    {
    	pos.Set(0,1,0.5);
    }
    
    // Second script
    shared Vector pos; // the second script also declares pos as a shared Vector
    
    void main()
    {
    	Vector test(0,1,0.5)
    	if (pos == test) {
    		// ...
    	}
    }
    

    2番目のスクリプトで1番目のスクリプトを実行した場合、posの値は{0,1,0.5}なので、2番目のスクリプトではpos==testがtrueとなります.
    変数名
    VSLでは、クラス名や構造名など、変数名として使用できない特定の名前があります.
    mainintshortfloatcharwhiledobool
    ifforthenelsetruefalseTRUEFALSE
    NULLnullstructclassenumexternsharedstatic
    switchcasedefaultbreakcontinuereturn
    コンパイラは次の順序で名前を検索し、名前が見つかった場合に停止します.
  • 現在の範囲からグローバル範囲までの検索
  • 名前が列挙値であるかどうかを検索する
  • 名前が定義された定数かどうかを検索する
  • void foo(int a)
    {
    bc.OutputToConsole(pi); // print 3.14159 (pi is a constant in VSL) float pi = 1.0; if (a) { float pi = 0.5; bc.OutputToConsole(pi); // print 0.5 } bc.OutputToConsole(pi); // print 1.0 }
    enum Const
    {
    pi,
    epsilon,
    maxint,
    };

    void foo(int a) { bc.OutputToConsole(pi); // print 0 float pi = 1.0; if (a) { float pi = 0.5; bc.OutputToConsole(pi); // print 0.5 } bc.OutputToConsole(pi); // print 1.0 }