스크립트 처리 방법에 대해 질문입니다.

17 views
Skip to first unread message

피군

unread,
Jan 11, 2008, 5:15:55 AM1/11/08
to squirrelusers-kr
스크립트를 많이 써보지 않아 조금 궁금한 점이 생깁니다.

squirrel 스크립트를 작성하고 어떤 이벤트가 왔을때 squirrel 스크립트를 실행하고
지금 클래스의 어떤 상태를 바꿔주려고 합니다.

// test.nut 파일입니다.
function ClassTest()
{
local myClass = CMyClass;
myClass.Test();
}

////////
// 그리고 이건 c++ 코드입니다.
CMyClass::Initialize()
{
SqPlus::SQClassDef<CMyClass>(_T("CMyClass")).
func(&CMyClass::Test, _T("Test"));
m_callClassFunc = SquirrelVM::CompileScript(_T("test.nut"));
}

CMyClass::Event()
{
SquirrelVM::RunScript(m_callClassFunc );
}

CMyClass::Test()
{
if( m_bTest )
SendPacket();
else
m_bTest = TRUE;
}

원하는 것은 Event가 들어왔을 때 자신의 멤버변수를 확인해서 패킷을 보낼 것인지
변수를 바꿔 줄 것인지를 결정하고자 하는 것인데..

스크립트에서 local로 변수를 잡기 때문에 원하는 결과가 나오지 않고
단지 로컬에서 처리를 하고 끝납니다.

CMyClass::Test()
{
// 현재 클래스의 포인터를 얻는다.
CMyClass* pClass = GetCurrentClassPt();

if(pClass -> m_bTest )
pClass ->SendPacket();
else
pClass ->m_bTest = TRUE;
}

이런식으로 처리하면 당연히 되겠지만 좀 그렇네요.
포인터를 넘겨 현재 실행되는 클래스의 함수를 실행할 수 있는 좋은 방법이 없을지 궁금하네요.
제가 뭔가 잘못 생각하고 있는건가요?

피군

unread,
Jan 11, 2008, 11:28:03 PM1/11/08
to squirrelusers-kr
음.. 자답이네요..

SqPlus::BindVariable 을 이용해서 현재 사용하는 변수를 넘겨서 처리하는 방법을 사용했더니 또 되는군요.

유저포인터를 사용하는 방법은 아직 잘 모르겠지만.. 좀 더 찾아봐야 될 거 같아요.. >.<

yagur

unread,
Jan 12, 2008, 11:55:09 AM1/12/08
to squirrelusers-kr

흠 제 생각엔 조금 오해신것 같습니다. 제 추측엔 CMyClass 객체를 복수로 사용하실거로 보입니다(싱글톤 인가요 혹
시..).
스크립트에서 지역변수를 선언하면 새로운 객체가 생기게 됩니다. 이벤트가 호출될때마다 CMyClass 지역 객체를
만들고 사용하게 되는거니 Event()를 진행중인 객체가 아닌 스크립트에서 선언한 새 지역 객체의 Test() 멤버함수가
호출되겠지요. 전역 테이블에 현제 참조해야할 객체를 넣는 방법을 사용하신듯 하군요(전역으로 바인딩하는것도 좋은방법입니다.)

일단 아래는 질문하신분의 스크립트입니다.
// test.nut 파일
> // test.nut 파일입니다.
> function ClassTest()
> {
> local myClass = CMyClass;
> myClass.Test();
>
> }

이 스크립트의 오류는 스크립트를 컴파일해서 매번 실행한다고 해서 ClassTest()가 실행되진 않습니다. 단지
ClassTest()를 선언
할뿐이지요(다른 언어와 크게 다르지 않습니다). 아마 ClassTest(); 부분을 질문에 첨부하지 않으신것 같습니다. 따로
ClassTest(); 문자열 버퍼를
컴파일해서 호출하느게 좋을듯합니다.

음 이게 도움이 될지 모르겠지만 질문하신분은 레퍼런스를 이용하면 될듯합니다.
// new test.nut
function ClassTest(Target)
{
Target.Test();
}

// C/C++ 소스
CMyClass::Event()
{
SquirrelFunction<void>(_T("ClassTest"))(this);
}
Message has been deleted

피군

unread,
Jan 13, 2008, 2:11:27 AM1/13/08
to squirrelusers-kr
아 그렇군요.

이렇게 사용할 수 있군요.


감사합니다.


많은 도움이 되었습니다.


제가 스크립트는 처음 해보는 거라서 많이 헷갈리는군요.. ㅠㅠ;


확실하게 yagur님이 설명하시는 방법이 제가 원하는 방법이였습니다.


^^
Reply all
Reply to author
Forward
0 new messages