• 追加された行はこの色です。
  • 削除された行はこの色です。
* 構文 - Script Language [#g9284ebe]
#contents
Last-modified: &lastmod();

** このページについて [#ie2b0c1a]
AngelScript(AS)のスクリプト構文について書きます。
(このページに書かれているサンプルコードの一部はAngelScript公式のドキュメントから転載しています。)

** 「同等」と「同様」について [#sa64f03f]
文中で「C++と同等」と「C++と同様」という言葉を使っています。
「C++と同等」は「C++とほぼ同じ」という意味合いで,
「C++と同様」は「C++と全く同じ」という意味合いで使っています。

** 字句 [#i3b49282]
*** コメント [#oda6fcbb]
C++と同様に1行コメント,ブロックコメントの2種類が使えます。
#code(c,){{
// 1行コメント
/*
 ブロックコメント
*/
}}

*** 値 [#z1ceda31]
#code(c,){{
// 10進数表現した整数値
int a = 3; 

// 16進数表現した整数値
int b = 0xFFFF;

// 64bit浮動小数
double ca = 1.2345;
double cb = 1.2345e10;

// 32bit浮動小数
float da = 1.2345f;
float db = 1.2345e10f;

// bool値
bool ea = true;
bool eb = false;
}}
** 型 [#c13aa6fe]
*** 組み込み型 [#pb10e35e]
C++と同等の組み込み型が用意されています。

:void|
C++と同様に関数の戻り値に型に使います。

:bool|
C++と同様のもので,true,falseのどちらかの値を持ちます。

:整数|
下記のタイプが存在します。
|型名|最小値|最大値|h
|int8|-128|127|
|int16|-32768|32767|
|int&br;int32|-2147483648|2147483674|
|int64|-92233772036854775808|9223372036854775807|
|uint8|0|255|
|uint16|0|65535|
|uint&br;uint32|0|4294967295|
|uint64|0|18446744073709551615|
公式のドキュメントによると,パフォーマンスの最適化をするために
公式のドキュメントによると,パフォーマンスを最適化したいのであれば
32bitより小さい型の値はクラスのメンバ変数など,データを保持するもののみに使用し,
それ以外(ローカル変数,一時変数など)は32bitの型の値を使用したほうがいいようです。

:小数|
下記のタイプが存在します。
|型名|値の範囲|一番小さい正の値|最大桁数|h
|float|+/- 3.402823466e+38|1.175494351e-38|6|
|double|+/- 1.7976931348623158e+308|2.2250738585072014e-308|15|
公式のドキュメントによりますと,ASではNaN(Not-aNumber)を0x7fc00000で表現しているようです。
*** 配列 [#k3346995]
配列の変数は次のように宣言します。
#code(c,){{
// int型の配列を宣言
int[] intArray;

// int型の配列を3つ宣言
int[] intArrA,intArrB,intArrC;

// 何も初期化子を指定しなければ,長さ0の配列を作ります
int[] a; // a.length() == 0

// 初期化子に数を指定すると,その数の長さの配列を作ります
int[] b(3); // b.length() == 3

// 配列初期化子を指定すると,それがコピーされた配列を作ります。
int[] c = {1,2,3}; // 先頭から1,2,3がコピーされた配列

}}

配列はC++と同様にインデクス式を使ってアクセスします。
また,配列の長さはlength()メソッドにより取得できます。
#code(c,){{
int[] a = {0,1,2};
for ( uint i = 0; i < a.length(); ++i )
{
    a[i] += 1;
}
}}
*** ユーザー定義型 [#r0f093c7]
ユーザー定義型(クラスや列挙型)はC++と同様に宣言することができます。

#code(c,){{
// objという型のインスタンスが作られる
// デフォルトコンストラクタがあればそれが呼ばれる
obj a;

// objの一時変数を作成し,aに代入する
a = obj();
}}
*** オブジェクトハンドル [#t39c8cfc]
オブジェクトハンドルとはC++でいう参照・ポインタにあたるものです。
参照先のオブジェクトは参照カウンタで寿命を管理しているため,「既に破棄されたデータにアクセスする」という不正なデータアクセスはおこりません。
もしnullなオブジェクトハンドルにアクセスしようとしたら例外が発生しスクリプトの実行が止まります。

#code(c,){{
obj o;
obj@ a; // a はnullで初期化されます
obj@ b = @o; // oの参照をbに代入します

b.ModifyMe(); // o.ModifyMe()と同様のことがおこります

if ( a is null ) // nullかどうかチェックしています。
{
  @a = @b; // aにbが参照しているオブジェクトを代入します。この場合,結果的にoの参照が渡されています。
}

}}
*** 文字列 [#lec9ebac]
ASでの文字列は8bitもしくは16bitのデータの配列として扱われます。

ASではC++と同等のエスケープシーケンス文字が用意されています。
下記がエスケープシーケンス文字をまとめた表です。

|文字|値|意味|h
|¥0|0|null文字|
|¥¥|92|バックスラッシュ|
|¥'|39|シングルコーテーション|
|¥"|34|ダブルコーテーション|
|¥n|10|改行文字 LF|
|¥r|13|改行文字 CR|
|¥t|9|TAB|
|¥xFFFF|0xFFFF|16bitで表した文字|
|¥uFFFF|0xFFFF|unicode16bitで表した文字|
|¥uFFFFFFFF|¥0xFFFFFFFF|unicode32bitで表した文字|

文字列はダブルコーテーションもしくはシングルコーテーションで囲んで表します。
#code(c,){{ 
// ダブルコーテーションで囲む例
// 文字列の中にダブルコーテーションを使いたいときは,エスケープ文字を使うこと。
string str1 = "This is a string with \"escape sequences\".";

// シングルコーテーションで囲む例
// シングルコーテーションで囲むと,エスケープ文字を使わずに文中にダブルコーテーションを使うことができる
string str2 = 'If single quotes are used then double quotes can be included without "escape sequences".';

}}

C++と同様に複数の文字列を1つの文字列として連結することができます。
#code(c,){{
// strには "First Line.¥nSecondLine.¥n"が代入される
string str = "First Line.¥n"
  "Second Line.¥n";
}}

ASでは''"""''を使うことで複数行に渡す文字列を簡単に記述することができます。
#code(c,){{
// """ で始まった文字列は """で閉じる
string str = """
First Line.
Second Line.
""";
}}
** 文 [#teb1f49c]
*** 宣言文 [#ae71baed]
#code(c,){{
// 同じ型の変数はカンマで区切ることで複数宣言することができます。
int var = 0, var2 = 10;
object@ handle, handle2;

// C++と同様にconstをつけることができます
const float pi = 3.141592f;

// 組み込み型の変数の初期化子を省略した場合,値は未初期化となり不定になります
int randaomVar;

// オブジェクトハンドルの場合,nullが代入されます
object@ nullHandle;

// ユーザー定義型の場合,デフォルトコンストラクタが呼ばれます
object defaultCtorCalled;

}}
*** 式文 [#o5c9ee2d]
C++同様の式文が使えます。詳しくは式の項をご覧ください。
#code(c,){{
a = b; // 代入演算式
func(); // 関数呼び出し
}}
*** if文 [#p78a09e7]
C++同等のif文が使えます。
#code(c,){{
if( condition ) 
{
  // condition == trueのときに実行する処理
}

if( value < 10 ) 
{
  // valueが10未満のときに実行する処理
}
else
{
  // valueが10以上のときに実行する処理
}
}}

ただし,C++と異なり,C#のように条件部はbool値である必要があります。
#code(c,){{
// 条件部はbool値である必要があるため,次のコードはエラー
int notZeroValue = 1;
if ( notZeroValue ) // エラー:条件がbool値でない
{
}

// 次のように書くこと
if ( notZeroValue != 0 )
{
}

}}
*** for文 [#baebd491]
C++と同等のfor文が使えます。
ただし,条件部はif文と同じようにbool値である必要があります。

#code(c,){{
for ( int n = 0; n < 10; ++n )
{
    // 10回する処理を書く
    // ...
    

    // continueやbreakも書けます
    if ( n == 5 )
    {
        continue;
    }
    if ( n == 9 )
    {
        break;
    }
}

}}
*** while文 [#j461bb07]
C++と同等のwhile文が使えます。
ただし,条件部はif文と同じようにbool値である必要があります。

#code(c,){{  
int i = 0;
while( i < 10 )
{
    i++;

    // continueやbreakも書けます
    if ( i == 5 )
    {
        continue;
    }
    if ( i == 9 )
    {
        break;
    }
}
}}
*** do-while文 [#p5762b82]
C++と同等のdo-while文が使えます。
ただし,条件部はif文と同じようにbool値である必要があります。

#code(c,){{  
int i = 0;
do
{
    i++;

    // continueやbreakも書けます
    if ( i == 5 )
    {
        continue;
    }
    if ( i == 9 )
    {
        break;
    }
}while( i < 10 );
}}
*** switch文 [#g0b99de9]
C++と同様のswitch文が使えます。
#code(c,){{
  switch( value )
  {
  case 0:
    // value == 0のときにここに飛ぶ
    break;

  case 2:
  case constant_value:
    // value == 2 もしくは value == constant_valueのときにここに飛ぶ
    break;

  default:
    // 全ての条件に該当しない場合,ここに飛ぶ
  }
}}
*** return文 [#g7ecfbf7]
C++と同様のreturn文が使えます。

#code(c,){{
float valueOfPI()
{
    return 3.141592f; // 値を返す
}
void function()
{
    return; // 値を返さずに関数の処理を終了する
}

}}
*** スコープブロック文 [#kc357a28]
C++と同様のスコープブロック文が使えます。
#code(c,){{
  {
    int a; 
    float b;

    {
      float a; // aという同じ名前の変数を宣言したため,int aを隠してしまいます

      // float aの値をbに代入しています
      b = a;
    }

    // ここで再びint aにアクセスできるようになります
  }

}}
** 式 [#nb44a3d6]
*** 代入式・代入演算式 [#yeb8cb21]
*** 代入式 [#yeb8cb21]
C++と同様の代入式が使えます。
#code(c,){{
lvalue = rvalue;
}}

*** 代入演算式 [#r0faab26]
C++と同等の代入式が使えます。
ASのシフト演算はC++のものと異なり,左シフト,符号無し右シフト,符号有り右シフトの3種類のシフトが使えます。

#code(c,){{
lvalue += rvalue;
lvalue = value + rvalue;
}}

使用可能な代入演算記号は下記の通りです。
 += -= *= /= = &= |= ^= <<= >>= >>>=
*** 関数呼び出し [#w8040e1c]
C++と同様の関数呼び出しが使えます。
#code(c,){{
func();
func(arg);
func(arg1, arg2);
lvalue = func();
}}
*** 型変換式 [#u9e1576c]
*** 算術演算式 [#y7543ed9]
*** ビット演算式 [#m1f0b534]
*** 論理演算式 [#h7b6dcbb]
*** 等値式 [#de0709a3]
*** 比較式 [#j1bc3347]
*** インクリメンタル式・デクリメンタル式 [#l7f3b00c]
*** インデックス式 [#d8d6583e]
*** 条件式 [#f2128c3e]
*** メンバアクセス [#k8d2dc13]
*** オブジェクトハンドルアクセス [#p581d30b]
*** 丸括弧 [#ue94adc4]
*** スコープ解決 [#zae249e6]
** オブジェクトハンドル [#o1d47802]
*** 使い方 [#la326047]
*** オブジェクトの寿命 [#b7126457]
*** ポリフォリズム [#xe49a700]
** 関数 [#q7b2e2c2]
** 変数 [#d428e214]
** interface - インターフェース [#w64b11fd]
** インターフェース [#w64b11fd]
** import [#o4ad69c4]
** enum - 列挙型 [#ff101c74]
** 列挙型 [#ff101c74]
** typedef [#c9cfcf91]
** class - クラス [#ee65bf14]
** クラス [#ee65bf14]
*** 使い方 [#o29dc089]
*** 演算式オーバーロード [#wd33cb58]
*** プロパティアクセサ [#l3502fb8]


    ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS