来自 C++ 的 Angelscript 传输数组

Angelscript transfer array from C++

我需要将一组图块从 C++ 传输到 Angelscript,我尝试添加一个 returns 和 std::vector 的函数,但 returns 这个错误

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); 

是否DumbTileGetTilesAt()注册之前注册了?

是否array<T>GetTilesAt()注册之前注册了?

两者都需要先注册,然后才能注册您的函数。

您使用的是库存数组实现 (sdk/add_on/scriptarray/) 还是您自己的基于 std::vector<> 的实现?使用股票插件时,应用程序必须首先将 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;
            }
        }
    }
}

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