PDA

View Full Version : سوال: اضافه کردن کلاس به angel script



mohammadali1375
سه شنبه 07 خرداد 1392, 17:51 عصر
سلام دوباره.
یه سوال برام پیش اومده میخام ببینم اصلا میشه همچین کاری کرد و اگه میشه چجوری و اگه هم نشد بجاش باید چی کار کرد :لبخند: .
در کل میخام یک کلاس که توی برنامه اصلی ( cpp‌ ) تعریف شده رو به angel اضافه کنم. که بشه اون کلاس رو توی اسکریپت ازش شی ساخت ، توابعشو صدا زد یا ...
و مهم تر از همه این که بشه تابعی Register کرد توی برنامه اصلی که ورودی اون یک شی از اون کلاس خاص باشه. خوب تا وقتی اون کلاس توی اسکریپت نباشه توی اسکریپت هم نمیشه ازش شیی درست کرد و اصلا تابعی هم نمیشه Register کرد که شیی از اون کلاس ورودیش باشه. پس باید چی کار کرد ؟:متفکر:

سپول
چهارشنبه 08 خرداد 1392, 14:15 عصر
مثال یک کلاس ساده (vector) وصل شده به angelscript . که در موتور قبلیم نوشته بودم اینجا می گذازم :




r = engine->RegisterObjectType( "vec3", 0, asOBJ_REF | asOBJ_SCOPED );

// member variables
r = engine->RegisterObjectProperty( "vec3", "float x", offsetof(Vector3f, x)); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectProperty( "vec3", "float y", offsetof(Vector3f, y)); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectProperty( "vec3", "float z", offsetof(Vector3f, z)); HMR_ASSERT( r >= 0 );

// contructor/destructor
r = engine->RegisterObjectBehaviour( "vec3", asBEHAVE_FACTORY, "vec3@ f()", asFUNCTION(_Vec3Construct), asCALL_CDECL ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectBehaviour( "vec3", asBEHAVE_FACTORY, "vec3@ f( const vec3& in )", asFUNCTION(_Vec3CopyConstruct), asCALL_CDECL ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectBehaviour( "vec3", asBEHAVE_FACTORY, "vec3@ f(float, float, float)", asFUNCTION(_Vec3AssignConstruct), asCALL_CDECL ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectBehaviour( "vec3", asBEHAVE_RELEASE, "void f()", asFUNCTION(_Vec3Destruct), asCALL_CDECL_OBJLAST ); HMR_ASSERT( r >= 0 );

// operators
r = engine->RegisterObjectMethod( "vec3", "vec3& opAssign(const vec3& in)", asMETHODPR(Vector3f, operator=, (const Vector3f&), Vector3f&), asCALL_THISCALL ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "vec3& opAddAssign(const vec3& in)", asMETHODPR(Vector3f, operator+=, (const Vector3f&), Vector3f&), asCALL_THISCALL ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "vec3& opSubAssign(const vec3& in)", asMETHODPR(Vector3f, operator-=, (const Vector3f&), Vector3f&), asCALL_THISCALL ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "vec3& opMulAssign(float)", asMETHODPR(Vector3f, operator*=, (fl32), Vector3f&), asCALL_THISCALL ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "vec3& opDivAssign(float)", asMETHODPR(Vector3f, operator/=, (fl32), Vector3f&), asCALL_THISCALL ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "bool opEquals(const vec3& in) const", asFUNCTION(Vec3Equal), asCALL_CDECL_OBJFIRST ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "vec3@ opAdd(const vec3& in) const", asFUNCTION(_Vec3Add), asCALL_CDECL_OBJFIRST ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "vec3@ opSub(const vec3& in) const", asFUNCTION(_Vec3Sub), asCALL_CDECL_OBJFIRST ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "vec3@ opMul(float) const", asFUNCTION(_Vec3MulScalar), asCALL_CDECL_OBJFIRST ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "vec3@ opMul_r(float) const", asFUNCTION(_Vec3MulScalar_r), asCALL_CDECL_OBJFIRST ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "vec3@ opDiv(float) const", asFUNCTION(_Vec3DivScalar), asCALL_CDECL_OBJLAST ); HMR_ASSERT( r >= 0 );

// functions
r = engine->RegisterObjectMethod( "vec3", "float length() const", asFUNCTION(Vec3Length), asCALL_CDECL_OBJFIRST ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "float dot(const vec3& in) const", asFUNCTION(Vec3Dot), asCALL_CDECL_OBJFIRST ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "vec3@ normalize() const", asFUNCTION(_Vec3Normalize), asCALL_CDECL_OBJFIRST ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "float angle(const vec3& in) const", asFUNCTION(Vec3Angle), asCALL_CDECL_OBJFIRST ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "vec3@ cross(const vec3& in) const", asFUNCTION(_Vec3Cross), asCALL_CDECL_OBJFIRST ); HMR_ASSERT( r >= 0 );
r = engine->RegisterObjectMethod( "vec3", "vec3@ lerp(const vec3& in, float) const", asFUNCTION(_Vec3Lerp), asCALL_CDECL_OBJFIRST ); HMR_ASSERT( r >= 0 );



این بایندینگ برای کلاس ساده Vector (عملیات ریاضی) هست که سه متغیر x, y, z داره.
اولا کامنت هارو بخون که هر قسمت برای تعریف چه جور توابعی هست.
مثلا برایx, y, z میشه خط 4 تا 6.

مهم هم اینه که موقع رجیستر کردن کلاس رو بصورت REF و SCOPED تعریف کنی.
توابع destructor , constructor هم دقت کن که به یک تابعی که خودم نوشتم وصل کردم. اون تابع (مثلا _Vec3Construct) میاد یک vector رو new می کنه و pointer اش رو بر می گردونه.
operator ها هم که همونطور در نمونه می بینی تعریف های خاص خودشون رو دارند (opAssign، opAddAssign، ...)
سوالی داشتی بپرس

mohammadali1375
پنج شنبه 09 خرداد 1392, 14:39 عصر
ایول آقا. دمت گرم. دقیقا دنبال همین بودم :قلب: