Angelscript从C++传输数组



我需要将一个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;
}
}
}
}

代码有点旧,但我认为它应该仍然可以工作,即使它需要一些刷新。

最新更新