DXSquirrel의 예제를 봤지만 클래스를 만드는게 아니라 각각의 함수를 만들어 바인드 하는 식인거 같았습니다.
클래스에 있는 D3DXVECTOR3 맴버 변수를 바인딩하고 싶은데, 마땅한 방법이 위키를 찾아봐도 없어서 질문을...
class CObject
{
protected:
D3DXVECTOR3 m_vecPos;
.
.
.
}
m_vecPos를 스크립트에서도 쓰고 싶은데, DXSquirrel에 쓰이는 방식은 안되더라고요. 어떻게 해야하나요?
SqPlus::BindVariable( root, &m_vecTestVector, TEXT( "vecTest" ) );
했더니 에러...
int constructD3DXVECTOR3( HSQUIRRELVM v )
{
StackHandler sa(v);
int paramCount = sa.GetParamCount();
if (paramCount == 1) {
return SqPlus::PostConstruct<D3DXVECTOR3>(v,new
D3DXVECTOR3(),releaseD3DXVECTOR3);
} else if (paramCount == 2) {
D3DXVECTOR3 *vecParam = (D3DXVECTOR3 *)sa.GetUserPointer( 2 );
return SqPlus::PostConstruct<D3DXVECTOR3>(v,new
D3DXVECTOR3( vecParam->x, vecParam->y, vecParam-
>z ),releaseD3DXVECTOR3);
} else if (paramCount == 4) {
return SqPlus::PostConstruct<D3DXVECTOR3>(v,new
D3DXVECTOR3(sa.GetFloat(2),sa.GetFloat(3),sa.GetFloat(4)),releaseD3DXVECTOR3);
} // if
return sq_throwerror(v,_T("Invalid Constructor arguments"));
}
.
.
.
D3DXVECTOR3 *CObject::GetTest( void ) { return &m_vecPos; }
.
.
.
SqPlus::SQClassDef<D3DXVECTOR3>( TEXT( "D3DXVECTOR3" ) ).
staticFuncVarArgs(constructD3DXVECTOR3,_T("constructor"),_T("*")). //
Using a global constructor: useful in cases where a custom constructor/
destructor are required and the original class is not to be modified.
var( &D3DXVECTOR3::x, TEXT( "x" ) ).
var( &D3DXVECTOR3::y, TEXT( "y" ) ).
var( &D3DXVECTOR3::z, TEXT( "z" ) );
SqPlus::RegisterGlobal( v, *this, &CObject::GetTest,
TEXT( "GetTest" ) );
이렇게 코드 추가하고, 스크립트에서...
local test = D3DXVECTOR3( GetTest() );
이런 식으로 해서 해결봤습니다. 그런데 미심쩍은 부분이 한 두개가 아니라는거....
1) 직접 변수를 바인딩을 하는 방법은 없을까요? 꼭 Get*()함수가 필요한건지...
2) 꼭, D3DXVECTOR3( GetTest() )처럼 생성자에다 인자로 넘겨주어야 하는지요? local test =
GetTest() 같이 안되는건가요?
2) 생성인자로 구지 넘기지 않고 원하시는대로 동작합니다.
아래와 같이 했는데 문제없이 동작하는군요.
class MyVector
{
public:
float m_fX;
float m_fY;
float m_fZ;
};
DECLARE_INSTANCE_TYPE(MyVector);
SqPlus::SQClassDef<MyVector>(_T("MyVector"))
.var(&MyVector::m_fX,_T("x"))
.var(&MyVector::m_fY,_T("y"))
.var(&MyVector::m_fZ,_T("z"));
MyVector kVector;
SqPlus::BindVariable(&kVector, _T("bindVector"));
- test.nut -
local vector = MyVector();
bindVector.y = 1.0;
DECLARE_INSTANCE_TYPE()이 키포인트였던듯...