C++的脚本语言

我需要使用一个脚本语言,但是我的需求列表很糟糕。 大学的工作站(PS2 Linux)不允许我们拥有管理员访问权限,而且有一个非常旧的版本的 GCC)。

有人能推荐一个脚本语言吗,它需要...

  • 在 Linux 上工作
  • GCC 2.95.2 :(
  • 不需要管理员权限
  • 易于与 C++ 集成
  • 不需要额外的库
  • 没有 boost(在大学的网络驱动器上太大了,我已经多次抱怨过了,但他们认为 1GB 适合所有学生,无论是计算机课程还是护理课程。)

这些脚本将为游戏对象执行少量的逻辑。

Luabind 将是我的首选,但 boost 使其不可能,而且由于工作站经常重置,我必须重新安装所有东西 :(

原文链接 https://stackoverflow.com/questions/6799410

点赞
stackoverflow用户481547
stackoverflow用户481547

只用 Lua,并且不要使用他们的机器。如果必须,把你完整的开发环境和依赖项都放在闪存盘上。他们行业标准就是 Lua。

2011-07-23 09:15:51
stackoverflow用户88888888
stackoverflow用户88888888

我想推荐 Angelscript:

http://www.angelcode.com/angelscript/

它与 C++ 集成非常容易,同时支持线程。示例集成代码如下:

r = engine->RegisterGlobalFunction("void print(const string &in)", asFUNCTION(print), asCALL_CDECL); assert( r >= 0 );

你无法更简单了。类的语法与 C++ 相同,只是用 asMETHOD 代替 asFUNCTION。它还支持导出类、拥有工厂和一些预定义类型,例如字符串和数学运算。

该语言本身是 C++、Java 和 Python 的混合,但真的很出色。

尝试一下,学会使用它后我就迷上了。

我尝试过很多脚本语言,例如 Python、LUA 和 Javascript,但没有一种像 Angelscript 这样轻松易集成。

编辑:下面是我的一些程序代码,展示了一个类的集成示例:

// 注册 Angelscript 接口
void NLBoundingBox::registerWithAngelScript( asIScriptEngine* e )
{
    AS_ERR_CHECK(e->RegisterObjectType("NLBoundingBox", 0, asOBJ_REF));
    AS_ERR_CHECK(e->RegisterObjectMethod("NLBoundingBox", "bool intersects(const NLBoundingBox@)", asMETHOD(NLBoundingBox, intersects), asCALL_THISCALL));
    AS_ERR_CHECK(e->RegisterObjectMethod("NLBoundingBox", "bool isPointInside(f32 x, f32 y)", asMETHODPR(NLBoundingBox, isPointInside, (f32,f32), bool), asCALL_THISCALL));
    AS_ERR_CHECK(e->RegisterObjectMethod("NLBoundingBox", "void translate(f32 x, f32 y)", asMETHODPR(NLBoundingBox, translate, (f32,f32), void), asCALL_THISCALL));
    AS_ERR_CHECK(e->RegisterObjectMethod("NLBoundingBox", "void translateTo(f32 x, f32 y)", asMETHODPR(NLBoundingBox, translateTo, (f32,f32), void), asCALL_THISCALL));
    AS_ERR_CHECK(e->RegisterObjectMethod("NLBoundingBox", "void rotateAroundCenter(f32 angle)", asMETHOD(NLBoundingBox, rotateAroundCenter), asCALL_THISCALL));

    // 行为:工厂和引用计数
    AS_ERR_CHECK(e->RegisterObjectBehaviour("NLBoundingBox", asBEHAVE_FACTORY, "NLBoundingBox@ NLBoundingBox()", asFUNCTIONPR(factory, (void), NLBoundingBox*), asCALL_STDCALL));
    AS_ERR_CHECK(e->RegisterObjectBehaviour("NLBoundingBox", asBEHAVE_RELEASE, "void NLBoundingBox()", asMETHOD(NLBoundingBox, release), asCALL_THISCALL));
    AS_ERR_CHECK(e->RegisterObjectBehaviour("NLBoundingBox", asBEHAVE_ADDREF, "void NLBoundingBox()", asMETHOD(NLBoundingBox, addRef), asCALL_THISCALL));
}
2011-07-23 09:53:18