class ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„์—์„œ ๋˜ ๋‹ค๋ฅธ class์˜ instance๋ฅผ return ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?

26 views
Skip to first unread message

odyssey

unread,
Nov 15, 2007, 3:56:53โ€ฏAM11/15/07
to squirrelusers-kr
์•ˆ๋…•ํ•˜์„ธ์š”. squirrel์„ ์—”์ง„์— ๋ถ™์—ฌ์„œ ์—”์ง„์˜ Entity ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ œ์–ดํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์˜ ๊ฐ„๋žตํ•œ ์†Œ์Šค๋ฅผ ํ†ตํ•ด ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆฌ๊ณ  ๋จผ์ € ์‹œ๋„ํ•ด ๋ณด์‹  ๋ถ„๋“ค์˜ ์˜๊ฒฌ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
Engine ๋‚ด๋ถ€์—์„œ GameEntity๋ฅผ ๋ชจ๋‘ ์ƒ์„ฑํ•œ ํ›„์— script์—์„œ๋Š” GameEntity์˜ ํฌ์ธํ„ฐ ์ฐธ์กฐ๋กœ
๋ฉค๋ฒ„๋ฅผ ๋ฆฌํ„ด๋ฐ›์•„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.


// c++, ์—”์ง„ ์†Œ์Šค ์ฝ”๋“œ
// GameEntity ======================
class GameEntity {
GameField* GetField(const char* name); // ์ด๋ฆ„์œผ๋กœ ๋ฉค๋ฒ„ ํ•„๋“œ๋ฅผ ์ฐพ์•„์„œ ๋ฆฌ
ํ„ด
};








// c++, ์Šคํฌ๋ฆฝํŠธ ์ œ์–ด ์ธํ„ฐํŽ˜์ด์Šค
// CVector3 ======================
struct CVector3 {
float x;
float y;
float z;
CVector3() { x = y = z = 0.f; }
CVector3(float _x, float _y, float _z) { x = _x; y = _y; z =
_z; }
};

_MEMBER_FUNCTION_IMPL(Vector3,_get) {
StackHandler sa(v);
_CHECK_SELF(CVector3,Vector3);
const SQChar *s = sa.GetString(2);
if(s && (s[1] != 0)) return SQ_ERROR;
int index = s && (s[1] == 0)?s[0]:sa.GetInt(2);
switch(index) {
case 0: case 'x': case 'r': return sa.Return(self->x); break;
case 1: case 'y': case 'g': return sa.Return(self->y); break;
case 2: case 'z': case 'b': return sa.Return(self->z); break;
} // switch
return SQ_ERROR;
}




// EntityRef ===================
class EntityRef {
GameEntity* entity;
};

_MEMBER_FUNCTION_IMPL(EntityRef,_get) {
StackHandler sa(v);
_CHECK_SELF(CEntityRef,EntityRef);
const SQChar *s = sa.GetString(2);
if (! s) return SQ_ERROR;

GameEntity* pEntity = self->entity;
if (! pEntity) return SQ_ERROR;

GameField* pField = pEntity->GetField(s);
if (! pField) return SQ_ERROR;

switch (pField->type)
{
. . .
case EGTF_VEC3F :
{
float* pVal = ((float*) pField->ptr); // ํ•„๋“œ์— ์ €์žฅ๋œ ptr
๋Š” ๊ฐ์ฒด์˜ vec3 ํ˜• ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ž„.

// ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” sa.Return()์—์„œ User Pointer๋กœ ๋“ฑ๋ก๋˜์–ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
// class instance ํ˜•์‹์œผ๋กœ return ๋˜์–ด์•ผ script์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๋ฐ ๋ฐฉ๋ฒ•
์„ ๋ชจ๋ฅด๊ฒ ๋„ค์š”.

CVector3* newv = new CVector3(pVal[0], pVal[1],
pVal[2]);
return sa.Return(newv);
}
. . .
}
return SQ_ERROR;
}




// main.cpp, ์Šคํฌ๋ฆฝํŠธ ์ดˆ๊ธฐํ™” ๋ถ€๋ถ„

SquirrelProcessor::Init();
SquirrelProcessor::RegistOutputStr( m_strOutput,
MAX_OUTPUT_LENGTH );

// VM ์ดˆ๊ธฐํ™” ํ›„์— ์Šคํฌ๋ฆฝํŠธ class๋ฅผ ๋“ฑ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.
_INIT_CLASS(EntityRef);
_INIT_CLASS(Vector3);





// squirrel, ์Šคํฌ๋ฆฝํŠธ ์†Œ์Šค

local my_avt = EntityRef("my_avt");

local vec = Vector3(1,2,3); // ์ด ๊ฒฝ์šฐ๋Š” ์Šคํฌ๋ฆฝํŠธ์—์„œ
vector3๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ๋™์ž‘ํ•จ.
print(vec.x);

local pos = my_avt.position; // EntityRef์˜ get()
ํ•จ์ˆ˜์—์„œ return ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ UserPointer๋กœ๋งŒ ์ธ์‹๋˜์–ด '.x' ์„ index๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ•จ.
print(pos.x); //
ERROR !!!







์ด๋ ‡๊ฒŒ ์Šคํฌ๋ฆฝํŠธ ์†Œ์Šค์˜ ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑํ•˜๋ฉด ๋™์ž‘ํ•˜๋Š” ๋ฐ, c++ ํ•จ์ˆ˜์—์„œ ์ƒ์„ฑํ•˜๋ฉด ์ธ์‹๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ• ๊นŒ์š”?

์˜๊ฒฌ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

yagur

unread,
Nov 15, 2007, 5:15:10โ€ฏAM11/15/07
to squirrelusers-kr

On 11์›”15์ผ, ์˜คํ›„5์‹œ56๋ถ„, odyssey <vrdevelo...@paran.com> wrote:
>
> CVector3* newv = new CVector3(pVal[0], pVal[1],
> pVal[2]);
> return sa.Return(newv);
> }
> . . .
> }
> return SQ_ERROR;

ํฌ์ธํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ๋˜๋ฉด VM์ด ์œ ์ €ํฌ์ธํ„ฐ๋กœ ์ธ์‹์„ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค๋กœ ๋งŒ๋“ค์–ด ์ฃผ์…”์•ผํ•˜๋Š”๋ฐ,

_IMPL_NATIVE_CONSTRUCTION(Vector3, CVector3);

๋ฅผ ๋จผ์ € ํ•ด์ฃผ์‹ ํ›„.

CVector3* newv = new CVector3(pVal[0], pVal[1], pVal[2]);
return construct_Vector3(newv);
}
. . .
}
return SQ_ERROR;

์ด๋ ‡๊ฒŒ ๋ฐ”๊พธ๋ฉด ์ธ์Šคํ„ด์Šค๋กœ ์ธ์‹ํ• ๊ฒƒ์ž…๋‹ˆ๋‹ค.

yagur

unread,
Nov 15, 2007, 5:39:58โ€ฏAM11/15/07
to squirrelusers-kr
์ž˜๋ชป์“ด ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
return construct_Vector3(newv); <= ์ด ๋ถ€๋ถ„์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ณ ์น˜๋ฉด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

return push_Vector3(newv);

odyssey

unread,
Nov 15, 2007, 8:24:00โ€ฏPM11/15/07
to squirrelusers-kr
๋‹ต๋ณ€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ ์งˆ๋ฌธ์„ ์˜ฌ๋ฆฌ๊ณ  ๋‚˜์„œ ์ธํ„ฐ๋„ท์„ ์—ฌ๊ธฐ์ €๊ธฐ ๋’ค์ ธ๋ณด๋‹ˆ

SquirrelObject root = SquirrelVM::GetRootTable();
SquirrelObject vector3class = root.GetValue("Vector3");
SquirrelObject so =
SquirrelVM::CreateInstance(vector3class);
CVector3* newv = new CVector3(pVal[0], pVal[1],
pVal[2]);
so.SetInstanceUP(newv);
return sa.Return(so);

์ด๋Ÿฐ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์„œ ์šฐ์„  ํ•ด๋ณด์•˜๋”๋‹ˆ ๋™์ž‘ํ•˜๊ธธ๋ž˜ ๊ทธ๋ ‡๊ฒŒ ๋‘๊ธฐ๋กœ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ๋‹ต๋ณ€ ์ฃผ์‹  ๋ฐฉ๋ฒ•๋ฐ๋กœ ํ•ด๋ณด์•˜๋”๋‹ˆ ์—ญ์‹œ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ์ฝ”๋“œ๋„ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ตฐ์š”.
push_Vector3()์˜ ๋‚ด๋ถ€๋ฅผ trace ํ•ด๋ณด๋‹ˆ ์œ„์™€ ๊ฐ™์€ ์›๋ฆฌ๋กœ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ”๋“œ๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์„œ
์ด ๋ฐฉ๋ฒ•์ด ์ •๋‹ต์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
Reply all
Reply to author
Forward
0 new messages