- 追加された行はこの色です。
- 削除された行はこの色です。
* 概要 [#r6930bf3]
#contents
** このページについて [#ie2b0c1a]
AngelScript(以下AS)を全く知らない人が,ASについてなんとなく理解してもらえるような記事を書きます。
細かいことについては各ページを参照してください。
** 特徴 [#laa17591]
- 静的型付け。
- 構文がC++にとても似ている。
- C/C++バインディング可能。
- コールーチン対応。
*** 構文がC++にとても似ている [#e7d5afb5]
構文がC++にとても似ているため,C++経験者であれば構文について少し勉強するだけでコーディングを始められます。
ASは構文がC++にとても似ているため,C++経験者であれば構文について少し勉強するだけでコーディングを始められます。
また,C++ソースコードをメインとして使用するプロジェクトでは
ASソースコードとC++ソースコードの2つをコーディングしていくことになります。
そのような状況で,両者の構文が似ているため,頭を大きく切り換える必要がないため,混乱が少なくて済みます。
そのような状況では,両者の構文が似ていることから頭を大きく切り換える必要がなくなります。
これが意外と重要なことで,ミスや変な混乱が少なくなります。
以下がASのソースコードの例です。
#code(c,){{
// Vector3型の宣言。
// クラスの宣言。
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メンバ関数もあります
// 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#のように未初期化変数が発生しなくていい感じです
// 未確認情報:最新版では初期化値を指定しないと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文が使えます
int ifElseValue = 3;
if ( ifElseValue == 4 )
if ( true )
{
}
else
{
}
// for文が使えます
for ( int i = 0; i < 10; ++i )
{
if ( i < 5 )
{
continue; // continueが使えます
}
break; // breakが使えます
break; // continue/breakが使えます
}
// while文が使えます
while ( true )
{
break; // continue/breakが使えます
}
// do-while文が使えます
do
{
break; // continue/breakが使えます
} while( false );
// switch文が使えます
int switchVal = 2;
switch( switchVal )
switch( 3 )
{
case 1 : break;
case 1 : break; // breakが使えます
case 2 : break;
default : 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でないスコープローカル変数の参照カウンタは減ります
}
}}