* 概要 [#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でないスコープローカル変数の参照カウンタは減ります

}

}}

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