GetInstance()는?

3 views
Skip to first unread message

Farts

unread,
Oct 14, 2007, 8:33:32 AM10/14/07
to squirrelusers-kr
안녕하세요.

현재 SqPlus를 쓰고 있는데, 파일 여러개를 쓰고있습니다. 방법은
http://wiki.squirrel-lang.org/default.aspx/SquirrelWiki/MultiVMs.html

근데, 사용하다가 SqPlus::GetInstance()가 계속 말썽을 부리네요.

한번은 제대로 값을 받아오는데, 똑같은 파일에 똑같은 스크립트인데, 두번이상에서는 반드시

값이 NULL이라서 에러가 나네요. 혹시 참고할만한 것 있나요?

yagur

unread,
Oct 14, 2007, 4:15:26 PM10/14/07
to squirrelusers-kr
멀티 버추얼 머신을 쓰시는데서 문제가 생긴다고 하셨는데 위의 함수는 잘 동작하는것으로 알고 있습니다.
좀더 구체적인 예를 들어주실수 있을까요. 또 어떤 값이 NULL이 되는지, 또 언제 NULL이 되는지를 알면 같이 고민하는데
도움이 될것 같습니다.

On 10월14일, 오후9시33분, Farts <chaja...@gmail.com> wrote:
> 안녕하세요.
>

> 현재 SqPlus를 쓰고 있는데, 파일 여러개를 쓰고있습니다. 방법은http://wiki.squirrel-lang.org/default.aspx/SquirrelWiki/MultiVMs.html

Farts

unread,
Oct 15, 2007, 5:46:59 AM10/15/07
to squirrelusers-kr
역시 제 문제였더군요. 특히 멀티 버츄얼 머신을 썼을때, 항상 SetVMSys()하기 전에 옛날것을 저장해놨다 다시 복원시키는
걸 생활화 되야될거 같아요.

Update부분에 옛날 것을 복원 안했던게 문제였던듯...

혹시 멀티 버츄얼 쓸 때 도움되는 팁이라도 있나요?

> > 값이 NULL이라서 에러가 나네요. 혹시 참고할만한 것 있나요?- 따온 텍스트 숨기기 -
>
> - 따온 텍스트 보기 -

yagur

unread,
Oct 16, 2007, 6:29:59 PM10/16/07
to squirrelusers-kr
음... 이게 도움이 되련지 모르겠군요.

class MyVector
{
public:
float m_fX;
float m_fY;
float m_fZ;
};

DECLARE_INSTANCE_TYPE(MyVector);

int Add(HSQUIRRELVM v)
{
MyVector* pSelf = GetInstance<MyVector,true>(v, 1);
MyVector* pArg = GetInstance<MyVector,true>(v, 2);

MyVector kResult;
kResult.m_fX = pSelf->m_fX + pArg->m_fX;
kResult.m_fY = pSelf->m_fY + pArg->m_fY;
kResult.m_fZ = pSelf->m_fZ + pArg->m_fZ;

return ReturnCopy(v, kResult);
}

int main()
{
SquirrelVM::Init();
SquirrelVMSys kVMSys1;
SquirrelVM::GetVMSys(kVMSys1);

SqPlus::SQClassDef<MyVector>(_T("MyVector"))
.var(&MyVector::m_fX,_T("x"))
.var(&MyVector::m_fY,_T("y"))
.var(&MyVector::m_fZ,_T("z"))
.staticFuncVarArgs(&Add, _T("Add"));

SquirrelVM::Init();
SquirrelVMSys kVMSys2;
SquirrelVM::GetVMSys(kVMSys2);

SqPlus::SQClassDef<MyVector>(_T("MyVector"))
.var(&MyVector::m_fX,_T("x"))
.var(&MyVector::m_fY,_T("y"))
.var(&MyVector::m_fZ,_T("z"))
.staticFuncVarArgs(&Add, _T("Add"));

try
{
SquirrelVM::SetVMSys(kVMSys1);
SquirrelObject kTest1 = SquirrelVM::CompileScript((const SQChar
*)"test.nut");
SquirrelVM::RunScript(kTest1);
}
catch(SquirrelError & e)
{
scprintf(_T("Error: %s\n"),e.desc);
}

try
{
SquirrelVM::SetVMSys(kVMSys2);
SquirrelObject kTest2 = SquirrelVM::CompileScript((const SQChar
*)"test.nut");
SquirrelVM::RunScript(kTest2);
}
catch(SquirrelError & e)
{
scprintf(_T("Error: %s\n"),e.desc);
}

SquirrelVM::SetVMSys(kVMSys1);
SquirrelVM::Shutdown();
SquirrelVM::SetVMSys(kVMSys2);
SquirrelVM::Shutdown();

return 0;
}

---------- test.nut ----------------

local Vec1 = MyVector();
local Vec2 = MyVector();
Vec1.x = 1;
Vec1.y = 2;
Vec1.z = 3;
Vec2.x = 1;
Vec2.y = 2;
Vec2.z = 3;

local Vec3 = Vec1.Add(Vec2);

Farts

unread,
Oct 16, 2007, 11:32:29 PM10/16/07
to squirrelusers-kr
^^ 감사합니다.

제가 아직 Squirrel에 익숙하지가 않아서... 지금 하고 있는 프로젝트에 D3DXVECTOR3하고 D3DXMATRIX를 스
크립트에서 쓸 수 있게 하고 있는데, 코드가 정리되는대로 올릴 생각입니다. (물론, 저보다 더 잘하시는 분들이 많으셔셔 도움이
될진 모르겠지만... orz...)

저기에 제가 하고 있는 방식은...

CObject::Update( float fElapsed )
{
SquirrelVMSys pOld;
SquirrelVM::GetVMSys( pOld );

{
SquirrelVM::SetVMSys( m_pScriptVM );

.
.
.
}

SquirrelVM::SetVMSys( pOld );
}

이런식으로, 매 함수마다 예전 포인터를 저장하고, 복원하고 있습니다. 이렇게 해야 런타임이 나지 않더라고요.

이 부분에 왠지 귀찮아서... ㅎㅎ

> > > - 따온 텍스트 보기 -- 따온 텍스트 숨기기 -

Reply all
Reply to author
Forward
0 new messages