AngelScript

рдкрд░рд┐рдЪрдп


LUA рдФрд░ Python рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдХрд┐ LUA рдХрд╛рдлреА рддреЗрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рдеред рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдпреЛрдЧреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдирд┐рдХрд▓рд╛, рдФрд░ рд╕реА ++ рдХреЛ рдмрд╛рдВрдзрдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реИред рдФрд░ рдлрд┐рд░ рдХрд╛рдо рдкрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдПрдВрдЬреЗрд▓рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛, рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмрдВрдбрд▓ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдПрд▓рдпреВрдП рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕реА рдЬреИрд╕рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд╕рдкрдиреЛрдВ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИред

рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди


рдпрд╣рд╛рдБ рдЖрдк рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:

рдПрдВрдЬреЗрд▓рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдЗрдВрдЬрди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕, рдкреНрд░реЙрдкрд░реНрдЯреАрдЬрд╝ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд░реВрд░рддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИред рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, GUI, AI, рдЖрджрд┐ред

рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ "рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛" рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

void main() { print("Hello world\n"); } 


рд╣рд╛рдБ, рднрд╛рд╖рд╛ рдХрд╛ рд╡рд╛рдХреНрдп рд╡рд┐рдиреНрдпрд╛рд╕ рд╢реБрд░реВ рд╕реЗ рд╣реА рдкреНрд░рд╕рдиреНрди рдХрд░рддрд╛ рд╣реИред рднрд╛рд╖рд╛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ OOP рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА, рдпрд╣ рдкрдВрдЬреАрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ, рдЪрд░, рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдкрдиреА рд╕рд╛рджрдЧреА рдХреЗ рд╕рд╛рде рд▓реБрднрд╛рд╡рдирд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рджрд░реНрдЬ рдХрд░рдирд╛:

 g_Engine->RegisterGlobalProperty("int SomeVal",&SomeVal); 


рдЬрд╣рд╛рдБ SomeVal рдПрдХ рдЗрдВрдЯрд┐рдиреЗрд╢рдирд▓ рд╡реИрд░рд┐рдПрдмрд▓ рд╣реИред

рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдкрдВрдЬреАрдХрд░рдг:
 g_Engine->RegisterGlobalFunction("void Print(string val)", asFUNCTION(Print), asCALL_CDECL); void Print(string val) { cout<<val.data(); } 


рд╣рд╛рдВ, рдПрдВрдЬреЗрд▓рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИред рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рдХрд╛рд░-рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдФрд░ рдПрдХ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛, рдФрд░ рдкреНрд░рдХрд╛рд░-рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рдлрд╝реНрд▓реЛрдЯ 3 рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

 //    class RefC { private: int refC; public: RefC(){refC=1;} void AddRef(){refC++;} void Release() { if(!--refC) delete this; } }; // ,     class float3:public RefC { public: float x; float y; float z; float3(){x=y=z=0;} void Normalize() { float Len=sqrt(x*x+y*y+z*z); Len=Len?Len:1; x/=Len; y/=Len; z/=Len; } } //  float3* Float3FactoryE() { return new float3(); } //     void PrintF3(float3* val) { cout<<"x="<<val->x<<",y="<<val->y<<",z="<<val->z; } 


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░-рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХрд╛рд░рдЦрд╛рдиреЗ, рд▓рд┐рдВрдХ рдХрд╛рдЙрдВрдЯрд░, рд╡рд┐рдзрд┐ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЗрд╕реА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

 g_Engine->RegisterObjectType("float3",0,asOBJ_REF); g_Engine->RegisterObjectMethod("float3"," void Normalize()",asMETHOD(float3, Normalize),asCALL_THISCALL); g_Engine->RegisterObjectBehaviour("float3",asBEHAVE_FACTORY,"float3@ new_float3()",asFUNCTION(Float3FactoryE),asCALL_CDECL); g_Engine->RegisterObjectBehaviour("float3",asBEHAVE_ADDREF,"void AddRef()",asMETHOD(float3,AddRef),asCALL_THISCALL); g_Engine->RegisterObjectBehaviour("float3",asBEHAVE_RELEASE,"void Release()",asMETHOD(float3,Release),asCALL_THISCALL); g_Engine->RegisterGlobalFunction("void Print(float3@ val)",asFUNCTION(PrintF3),asCALL_CDECL); 


рдмреЗрд╢рдХ, рд╣рдо рд╡рд╣рд╛рдБ рдирд╣реАрдВ рд░реБрдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ xyz рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рднреА рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
 g_Engine->RegisterObjectProperty("float3","float x",offsetof(float3,x)); g_Engine->RegisterObjectProperty("float3","float y",offsetof(float3,y)); g_Engine->RegisterObjectProperty("float3","float z",offsetof(float3,z)); 


рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЕрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
 float3@ ObjPos; ObjPos.x=1; ObjPos.y=2; ObjPos.z=3; ObjPos.Normalize(); Print( ObjPos ); 


рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡реЗрдХреНрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред

рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ



рдореБрдЭреЗ рдПрдВрдЬреЗрд▓рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реБрдИред C ++ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП, рдСрдкрд░реЗрдЯрд░ рдХреАрд╡рд░реНрдб рдФрд░ рдСрдкрд░реЗрдЯрд░ рдкреНрд░рддреАрдХ рдореМрдЬреВрдж рд╣реИрдВред рдПрдВрдЬреЗрд▓рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

Eg - opNeg
Com ~ opCom
┬ж ++ opPreInc
Re - opPreDec
┬ж ++ opPostInc
Ost - opPostDec
┬ж == opEquals
E! = OpEquals
┬ж <opCmp
┬ж <= opCmp
Mp> opCmp
C> = opCmp
Ss = opAssign
┬ж + = opAddAssign
S - = opSubAssign
┬ж * = opMulAssign
┬ж / = opDivAssign
┬ж & = opAndAssign
O | = opOrAssign
┬ж ^ = opXorAssign
┬ж% = opModAssign
S << = opShlAssign
┬ж >> = opShrAssign
┬ж >>> = opUShrAssign
Dd + opAdd opAdd_r
Ub - opSub opSub_r
Ul * opMul opMul_r
Iv / opDiv opDiv_r
┬ж% opMod opMod_r
┬ж & opAnd opAnd_r
┬ж | opOr opOr_r
Or ^ opXor opXor_r
Hl << opShl opShl_r
┬ж >> opShr opShr_r
┬ж >>> opushhr opUShr_r
┬ж [] opIndex

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рдорд░реНрдерди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

 class float3:public RefC { public: float x; float y; float z; float3(){x=y=z=0;} void Normalize() { float Len=sqrt(x*x+y*y+z*z); Len=Len?Len:1; x/=Len; y/=Len; z/=Len; } float3* operator+=(float3* _rval) { x+=_rval->x; y+=_rval->y; z+=_rval->z; this->AddRef(); return this; } }; 

рдХреЗрд╡рд▓ рдкрдВрдЬреАрдХреГрдд рдирдИ рд╡рд┐рдзрд┐ рдмрдиреА рд╣реБрдИ рд╣реИред
 g_Engine->RegisterObjectMethod("float3", "float3@ opAddAssign(float3@ _rval)", asMETHOD(float3, operator+=), asCALL_THISCALL); 


рдФрд░ рдЕрдм рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 float3@ ObjPos; ObjPos.x=1; ObjPos.y=2; ObjPos.z=3; float3@ ObjOffset; ObjOffset .x=3; ObjOffset .y=1; ObjOffset .z=5; ObjPos+=ObjOffset ; Print( ObjPos ); 

рдФрд░ рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рджреЗрдЦреЗрдВрдЧреЗ x = 4, y = 3, z = 8ред

рдПрдВрдЬреЗрд▓рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЧреБрдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 class MyObj { type get_ValueName(); type set_ValueName(type Val); } MyObj a; type tmp=a.ValueName;//  get_ValueName a.ValueName = tmp; //  set_ValueName 


рд╕реВрдЪрдХрд╛рдВрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЧреБрдг рднреА рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ:
 class MyObj { float get_opIndex(int idx) ; void set_opIndex(int idx, float value); } MyObj a; float val=a[1];//  get_opIndex a[2]=val;//  set_opIndex 


рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ


рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рд╛рдЗрдЯ www.angelcode.com
WIP рдПрдВрдЬреЗрд▓реНрд╕рд╕реНрдХреНрд░рд┐рдкреНрдЯред Svn.sourceforge.net/svnroot/angelscript/trunk рдкрд░ SVN рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА
рд░реВрд╕реА рдореИрдиреБрдЕрд▓ 13d-labs.com/angelscript_manual/main.html
рдЕрдВрдЧреНрд░реЗрдЬреА рдореИрдиреБрдЕрд▓ www.angelcode.com/angelscript/sdk/docs/manual/index.html
JIT рдХрдореНрдкрд╛рдЗрд▓рд░ github.com/BlindMindStudios/AngelScript-JIT-Compiler

Source: https://habr.com/ru/post/In145340/


All Articles