我需要将一个tile数组从C++转移到Angelscript,我尝试添加一个返回std::vector的函数,但它返回这个错误
Failed in call to function 'RegisterGlobalFunction' with 'array<DumbTile> GetTilesAt(int x, int y)' (Code: asINVALID_DECLARATION, -10)
我的代码:
std::vector<DumbTile> GetTilesAt(int x, int y) {
std::vector<DumbTile> output;
for (DumbTile t : tiles) {
if (t.x == x && t.y == y) {
output.push_back(t);
}
}
return output;
}
engine->RegisterGlobalFunction("array<DumbTile> GetTilesAt(int x, int y)", asFUNCTIONPR(GetTilesAt, (int, int), std::vector<DumbTile>), asCALL_CDECL);
DumbTile
是否在GetTilesAt()
注册之前注册?
array<T>
是否在GetTilesAt()
注册之前注册?
两者都需要先注册,然后才能注册函数。
您使用的是库存阵列实现(sdk/add_on/scriptarray/
(还是您自己的基于std::vector<>
的实现?当使用stock插件时,应用程序必须首先将std::vector
转换为CScriptArray
,因为由于数组的工作方式,angelscript本身并不能真正做到这一点。
有一个明显的替代方案——在您希望脚本访问数据的任何地方,都可以从使用std::vector
切换到使用CScriptArray
,但这可能会很烦人。
示例std::vector<Object*> <-> CScriptArray*
转换
template<typename Type>
void AppendVectorToArrayRef( vector<Type>& vec, CScriptArray* arr )
{
if( !vec.empty() && arr )
{
uint i = (uint)arr->GetSize();
arr->Resize( (asUINT)(i + (uint)vec.size() ) );
for( uint k = 0, l = (uint)vec.size(); k < l; k++, i++ )
{
Type* p = (Type*)arr->At( i );
*p = vec[k];
(*p)->AddRef();
}
}
}
template<typename Type>
void AssignScriptArrayInVector( vector<Type>& vec, CScriptArray* arr )
{
if( arr )
{
uint count = (uint)arr->GetSize();
if( count )
{
vec.resize( count );
for( uint i = 0; i < count; i++ )
{
Type* p = (Type*)arr->At( i );
vec[i] = *p;
}
}
}
}
代码有点旧,但我认为它应该仍然可以工作,即使它需要一些刷新。