* 概要 [#r6930bf3] #contents ** このページについて [#ie2b0c1a] AngelScript(以下AS)を全く知らない人が,ASについてなんとなく理解してもらえるような記事を書きます。 細かいことについては各ページを参照してください。 ** 特徴 [#laa17591] - 静的型付け。 - 構文がC++にとても似ている。 - C/C++バインディング可能。 - コールーチン対応。 *** 構文がC++にとても似ている [#e7d5afb5] ASは構文がC++にとても似ているため,C++経験者であれば構文について少し勉強するだけでコーディングを始められます。 また,C++ソースコードをメインとして使用するプロジェクトでは ASソースコードとC++ソースコードの2つをコーディングしていくことになります。 そのような状況では,両者の構文が似ていることから頭を大きく切り換える必要がなくなります。 これが意外と重要なことで,ミスや変な混乱が少なくなります。 以下がASのソースコードの例です。 #code(c,){{ // クラスの宣言。 class Vector3 { // メンバ変数の宣言 // public,privateなどのアクセス修飾子はありません float x; float y; float z; // デフォルトコンストラクタ Vector3() { } // コンストラクタ Vector3(float aX, float aY, float aZ) { mX = aX; mY = aY; mZ = aZ; } // デストラクタ ~Vector3() { } // メンバ関数 void add( const Vector3 &in aVec // 引数にconstや参照修飾子を付けることができます ) { mX += aVec.x; mY += aVec.y; mZ += aVec.z; } // constメンバ関数 float sum()const { return mX + mY + mZ; } // 演算子のオーバーロード // これは += をオーバーロードしています Vector3@ opAddAssign( const Vector3 &in aVec ) { add( aVec ); return this; } }; // セミコロンはあってもなくても可能。 // グローバル変数 int globalInt32Value = 0; // グローバル関数 void func() { // 組み込み型の紹介 int8 int8val; int16 int16val; int int32val; int32 int32val2; int64 int64val; uint8 uint8val; uint16 uint16val; uint uint32val; uint32 int32val2; uint64 uint64val; bool boolVal; float floatVal; double doubleVal; // 変数は明示的に初期化値を指定できます int initializedValue = 10; // 未確認情報:最新版では初期化値を指定しないと0(boolはfalse)で初期化されるようです。 // D言語やC#のように未初期化変数が発生しない仕組みは素晴らしいですね // (手元はかなり古いr320版を使っており,この当時ではまだ実装されていません) int notInitializedValue; // 0で初期化される // boolの値としてtrue,falseが使えます bool trueValue = true; bool falseValue = false; // const変数が使えます const int constantValue = 100; // 16進数が使えます const int hexValue = 0xFFFF; // float値の接尾語が使えます const float floatValue = 1.2f; // if-else文が使えます if ( true ) { } else { } // for文が使えます for ( int i = 0; i < 10; ++i ) { break; // continue/breakが使えます } // while文が使えます while ( true ) { break; // continue/breakが使えます } // do-while文が使えます do { break; // continue/breakが使えます } while( false ); // switch文が使えます switch( 3 ) { case 1 : break; // breakが使えます case 2 : break; default : break; // defaultが使えます } // クラスのインスタンスはC++と同じように書きます Vector3 vec(1,1,1); // オブジェクトハンドルというポインタのような概念があります Vector3@ vecHandle = @Vector3(); // オブジェクトの寿命は参照カウンタで管理されます // 参照カウンタが0になるとデストラクタが呼ばれます { Vector3@ objA = @Vector3(); // カウンタ1 Vector3@ objB = @objA; // カウンタ2 @objA = null; // カウンタ1 @objB = null; // カウンタ0 デストラクタが呼ばれる }// スコープを抜けるタイミングでnullでないスコープローカル変数の参照カウンタは減ります } }} |