0

我需要将一组图块从 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); 
4

1 回答 1

0

DumbTile在注册前GetTilesAt()注册的吗?

array<T>在注册前GetTilesAt()注册的吗?

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

您是在使用 stock 数组实现 ( sdk/add_on/scriptarray/) 还是您自己std::vector<>的基于 - 的实现?使用股票插件时,应用程序必须转换std::vectorCScriptArray第一个,因为由于数组的工作方式,angelscript 无法真正做到这一点。

有一个明显的替代方案 - 从使用切换std::vectorCScriptArray您希望脚本访问数据的任何地方,但这可能很烦人。


示例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;
            }
        }
    }
}

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

于 2020-07-12T12:00:21.277 回答