C++/AngelScript/概要
をテンプレートにして作成
ホーム
検索
最終更新
ヘルプ
Wiki書式ヘルプ(整形ルール)
開始行:
* 概要 - Overview [#r6930bf3]
#contents
Last-modified: &lastmod();
** このページについて [#ie2b0c1a]
AngelScript(以下AS)を全く知らない人が,ASについてなんと...
詳細については各ページを参照してください。
** 特徴 [#laa17591]
ASはLightweightLanguage(以下LL)の1つでLuaやSquirrelな...
''静的型付け''
ASの最大の特徴は''静的型付け''にあります。
静的型付けとはC/C++などと同様に
未定義の型・シンボルの使用をコンパイル時にチェックするこ...
もしそのようなものが使用されていたらエラー扱いにできます。
LuaやSquirrelなど他のLLの多くは動的型付けを採用しています。
動的型付けですと,コンパイルという作業をスキップできる代...
実際にそのコードが実行されるまで未定義の型・シンボルのチ...
小規模・少人数なアプリケーションの開発では動的型付けでも...
大規模・多人数なアプリケーションの開発になればなるほど,
コンパイル時エラーチェックの重要性が増してきます。
Squirrelでゲームのほとんどを実装したという
「小さな王様と約束の国 ファイナルファンタジー・クリスタル...
「自前である程度のスクリプトコードの事前チェックをできる...
それぐらいアプリケーション実行前のエラーチェックはアプリ...
''構文がC++にとても似ている''
ASは構文がC++にとても似ているため,C++経験者であれば構文...
また,C++ソースコードをメインとして使用するプロジェクト(...
ASソースコードとC++ソースコードの2つをコーディングしてい...
そのような状況では,両者の構文が似ていることから頭を大き...
これが意外と重要なことで,ミスや変な混乱が少なくなります。
''C/C++バインディング機能''
ASのスクリプトからC/C++の関数や構造体・クラスなどにアクセ...
逆にC/C++からASの関数や構造体・クラスなどにアクセスができ...
C/C++の関数・構造体・クラスなどをASのスクリプトからアクセ...
ASライブラリの何個かの関数を呼ぶだけで大丈夫です。
''コルーチン機能''
途中で処理を中断するコルーチン機能に対応しています。
この機能があるためテキストアドベンチャースクリプトやRPGの...
ASを導入することが比較的簡単です。
''バイトコードをバイナリ保存可能''
スクリプトコードをデータとしてROM媒体(光ディスクやフラッ...
ソースコードを配布していることと同じになってしまいます。
これは会社・団体的にNGなことがよくあります。
ASではスクリプトコードをコンパイルしたあと,バイトコード...
バイトコードとは,C言語でいうところのコンパイル後のオブジ...
それだけを見てもぱっとは何をしているのか分からない状態に...
この機能を使い,製品版のROM媒体にはスクリプトコードでなく...
ソースコード配布状態を回避することができます。
''十分なデバッグ機能''
スクリプトをメインに使ってゲーム開発をするとなるとデバッ...
ASでは
・実行ファイル・行の取得
・変数の中身のダンプ
・コールトレースの取得
・エラー・例外ハンドリング
といった機能をライブラリが提供しています。
これらの機能をアプリケーション側で使えるようにさえすれば
バグ調査時も特別な苦労はせずにデバッグすることができます。
** HelloWorld [#n16ecae6]
ASのスクリプトを実行するサンプルコードです。
本家のsampleコードを参考にしています。
#code(c,){{
// include
#include <iostream> // cout
// AS用ヘッダのインクルード
#include <angelscript.h>
#include "../../../add_on/scriptstring/scriptstring.h" //...
// コンソール出力用関数
void PrintString(string &str)
{
std::cout << str;
}
// メイン関数
int main(int argc, char **argv)
{
using namespace std;
int r = int();
// スクリプトエンジンの作成
asIScriptEngine *engine = asCreateScriptEngine(ANGELS...
if( engine == 0 )
{// エラー
cout << "Failed to create script engine." << endl;
return -1;
}
// stringを扱えるようにする
RegisterScriptString(engine);
// PrintString関数をPrintという名前の関数として登録
r = engine->RegisterGlobalFunction("void Print(string...
if ( r < 0 )
{// エラー
engine->Release();
return -1;
}
// スクリプトをコンパイル
{
asIScriptModule *mod = engine->GetModule(0, asGM_...
// ソースコードを追加
r = mod->AddScriptSection("script",
"void main() "
"{"
" Print( \"Hello World!\" ); "
"}"
);
if( r < 0 )
{// エラー
cout << "AddScriptSection() failed" << endl;
engine->Release();
return -1;
}
// ビルド
r = mod->Build();
if( r < 0 )
{// エラー
cout << "Build() failed" << endl;
engine->Release();
return -1;
}
}
// コンテキストを作成
// 1つのコンテキストは1つの実行スレッドのようなもの。
asIScriptContext *ctx = engine->CreateContext();
if( ctx == 0 )
{// エラー
cout << "Failed to create the context." << endl;
engine->Release();
return -1;
}
// 実行する関数のIDを取得する
int funcId = engine->GetModule(0)->GetFunctionIdByDec...
if( funcId < 0 )
{// エラー
cout << "The function 'float calc(float, float)' ...
ctx->Release();
engine->Release();
return -1;
}
// 実行準備
r = ctx->Prepare(funcId);
if( r < 0 )
{// エラー
cout << "Failed to prepare the context." << endl;
ctx->Release();
engine->Release();
return -1;
}
// スクリプト実行
r = ctx->Execute();
// 後片付け
ctx->Release();
engine->Release();
return 0;
}
}}
** スクリプトのサンプルコード [#e7d5afb5]
以下が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;
}
}; // セミコロンはあってもなくても可能。
// enumの宣言
enum SampleKind
{
SampleKind_A
, SampleKind_B
// term
, SampleKind_TERMINATE
, SampleKind_MIN = 0
, SampleKind_MAX = SampleKind_TERMINATE-1
};
// interfaceを使ったサンプル
// C#やD言語のinterfaceと同様です
interface IUpdatable
{
void updatableUpdate();
};
interface IDrawable
{
void drawableDraw()const;
};
class Chara
: IUpdatable
, IDrawable
{
void updatableUpdate()
{
}
void drawableDraw()const
{
}
};
// クラスの継承
// D言語やC#のように1つのみ継承できます
class Base
{
};
class A : Base
{
};
// グローバル変数
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;
// 初期化値を指定しないと値は不定となります
int notInitializedValue; // 何の値になるかは不定
// 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でないスコープロー...
}
}}
終了行:
* 概要 - Overview [#r6930bf3]
#contents
Last-modified: &lastmod();
** このページについて [#ie2b0c1a]
AngelScript(以下AS)を全く知らない人が,ASについてなんと...
詳細については各ページを参照してください。
** 特徴 [#laa17591]
ASはLightweightLanguage(以下LL)の1つでLuaやSquirrelな...
''静的型付け''
ASの最大の特徴は''静的型付け''にあります。
静的型付けとはC/C++などと同様に
未定義の型・シンボルの使用をコンパイル時にチェックするこ...
もしそのようなものが使用されていたらエラー扱いにできます。
LuaやSquirrelなど他のLLの多くは動的型付けを採用しています。
動的型付けですと,コンパイルという作業をスキップできる代...
実際にそのコードが実行されるまで未定義の型・シンボルのチ...
小規模・少人数なアプリケーションの開発では動的型付けでも...
大規模・多人数なアプリケーションの開発になればなるほど,
コンパイル時エラーチェックの重要性が増してきます。
Squirrelでゲームのほとんどを実装したという
「小さな王様と約束の国 ファイナルファンタジー・クリスタル...
「自前である程度のスクリプトコードの事前チェックをできる...
それぐらいアプリケーション実行前のエラーチェックはアプリ...
''構文がC++にとても似ている''
ASは構文がC++にとても似ているため,C++経験者であれば構文...
また,C++ソースコードをメインとして使用するプロジェクト(...
ASソースコードとC++ソースコードの2つをコーディングしてい...
そのような状況では,両者の構文が似ていることから頭を大き...
これが意外と重要なことで,ミスや変な混乱が少なくなります。
''C/C++バインディング機能''
ASのスクリプトからC/C++の関数や構造体・クラスなどにアクセ...
逆にC/C++からASの関数や構造体・クラスなどにアクセスができ...
C/C++の関数・構造体・クラスなどをASのスクリプトからアクセ...
ASライブラリの何個かの関数を呼ぶだけで大丈夫です。
''コルーチン機能''
途中で処理を中断するコルーチン機能に対応しています。
この機能があるためテキストアドベンチャースクリプトやRPGの...
ASを導入することが比較的簡単です。
''バイトコードをバイナリ保存可能''
スクリプトコードをデータとしてROM媒体(光ディスクやフラッ...
ソースコードを配布していることと同じになってしまいます。
これは会社・団体的にNGなことがよくあります。
ASではスクリプトコードをコンパイルしたあと,バイトコード...
バイトコードとは,C言語でいうところのコンパイル後のオブジ...
それだけを見てもぱっとは何をしているのか分からない状態に...
この機能を使い,製品版のROM媒体にはスクリプトコードでなく...
ソースコード配布状態を回避することができます。
''十分なデバッグ機能''
スクリプトをメインに使ってゲーム開発をするとなるとデバッ...
ASでは
・実行ファイル・行の取得
・変数の中身のダンプ
・コールトレースの取得
・エラー・例外ハンドリング
といった機能をライブラリが提供しています。
これらの機能をアプリケーション側で使えるようにさえすれば
バグ調査時も特別な苦労はせずにデバッグすることができます。
** HelloWorld [#n16ecae6]
ASのスクリプトを実行するサンプルコードです。
本家のsampleコードを参考にしています。
#code(c,){{
// include
#include <iostream> // cout
// AS用ヘッダのインクルード
#include <angelscript.h>
#include "../../../add_on/scriptstring/scriptstring.h" //...
// コンソール出力用関数
void PrintString(string &str)
{
std::cout << str;
}
// メイン関数
int main(int argc, char **argv)
{
using namespace std;
int r = int();
// スクリプトエンジンの作成
asIScriptEngine *engine = asCreateScriptEngine(ANGELS...
if( engine == 0 )
{// エラー
cout << "Failed to create script engine." << endl;
return -1;
}
// stringを扱えるようにする
RegisterScriptString(engine);
// PrintString関数をPrintという名前の関数として登録
r = engine->RegisterGlobalFunction("void Print(string...
if ( r < 0 )
{// エラー
engine->Release();
return -1;
}
// スクリプトをコンパイル
{
asIScriptModule *mod = engine->GetModule(0, asGM_...
// ソースコードを追加
r = mod->AddScriptSection("script",
"void main() "
"{"
" Print( \"Hello World!\" ); "
"}"
);
if( r < 0 )
{// エラー
cout << "AddScriptSection() failed" << endl;
engine->Release();
return -1;
}
// ビルド
r = mod->Build();
if( r < 0 )
{// エラー
cout << "Build() failed" << endl;
engine->Release();
return -1;
}
}
// コンテキストを作成
// 1つのコンテキストは1つの実行スレッドのようなもの。
asIScriptContext *ctx = engine->CreateContext();
if( ctx == 0 )
{// エラー
cout << "Failed to create the context." << endl;
engine->Release();
return -1;
}
// 実行する関数のIDを取得する
int funcId = engine->GetModule(0)->GetFunctionIdByDec...
if( funcId < 0 )
{// エラー
cout << "The function 'float calc(float, float)' ...
ctx->Release();
engine->Release();
return -1;
}
// 実行準備
r = ctx->Prepare(funcId);
if( r < 0 )
{// エラー
cout << "Failed to prepare the context." << endl;
ctx->Release();
engine->Release();
return -1;
}
// スクリプト実行
r = ctx->Execute();
// 後片付け
ctx->Release();
engine->Release();
return 0;
}
}}
** スクリプトのサンプルコード [#e7d5afb5]
以下が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;
}
}; // セミコロンはあってもなくても可能。
// enumの宣言
enum SampleKind
{
SampleKind_A
, SampleKind_B
// term
, SampleKind_TERMINATE
, SampleKind_MIN = 0
, SampleKind_MAX = SampleKind_TERMINATE-1
};
// interfaceを使ったサンプル
// C#やD言語のinterfaceと同様です
interface IUpdatable
{
void updatableUpdate();
};
interface IDrawable
{
void drawableDraw()const;
};
class Chara
: IUpdatable
, IDrawable
{
void updatableUpdate()
{
}
void drawableDraw()const
{
}
};
// クラスの継承
// D言語やC#のように1つのみ継承できます
class Base
{
};
class A : Base
{
};
// グローバル変数
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;
// 初期化値を指定しないと値は不定となります
int notInitializedValue; // 何の値になるかは不定
// 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でないスコープロー...
}
}}
ページ名: