c++ - 如何做更简单的 UT kismet 版本(C++ 和 Lua)

标签 c++ lua game-engine

我知道这是一个不平凡的问题,但上周我一直在思考如何做到这一点,但我找不到好的方法。

主要是我有一个 2D 关卡编辑器。我可以在世界中放置实体、添加瓷砖、碰撞等……我想要的是能够以可视化方式编写简单的脚本。例如,如果我有一个杠杆和一扇门,我想选择关卡,选择它的“onactivate”事件并将其链接到门的“关闭” Action 。

对于杠杆(激活/停用)和门(打开/关闭),编辑器加载一个包含可能实体的 xml,以及每个实体发布的 Action 。

现在是困难的部分。我需要将其转换为运行代码。我已经考虑过一些解决方案,但对我来说似乎都很尴尬。例如,对于杠杆/门事件,我可以在名为 Lever1_onactivate_Door1_open() 的 lua 函数中自动生成代码,它将在 Lever1 实例监听器提示中为 onactivate 事件(在 C++ 中)注册一个 LuaListener,并让它稍后被调用,当触发器的 onEnter 被触发。

谁能解释一下这种事情通常是如何完成的?我的一个问题是我想将它集成到我公开的事件系统中,以获得正交架构。

提前致谢, 马莱拉。

最佳答案

在像 Doom 这样的游戏中,这大致是这样完成的:当按下 Use 键时 [func: P_UseLines] ,它会应用到最近的墙搜索 [func: P_UseTraverse] 并且,如果你在范围内并且有正确的转弯角度,调用与 [func: P_ActivateLine] 中的线关联的 Action (称为“特殊”) ,最终将其映射到一个预先存在的函数。

换句话说,函数指针数组中的简单查找:

/* Premise */
struct line_t {
    ...
    int special;
    ...
};
struct line_t *line = activation_line;

/* Function call from p_spec.cpp */
LineSpecials[line->special](line, ...);

LineSpecials 将是一个函数指针数组:

int LS_Door_Open(struct line_t *, ...)
{
     ...
}

typedef int (*lnSpecFunc)(struct line_t *, ...);
lnSpecFunc LineSpecials[256] = {
    ...
    /* 13 */ LS_Door_Open,
    ...
};

关于c++ - 如何做更简单的 UT kismet 版本(C++ 和 Lua),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4603834/

相关文章:

c++ - 类构造函数和数组

c++ - Boost 测试使用变体

c++ - 从C++中的Content-Disposition header 正确提取文件名的更快方法

lua - 管理Lua 5.3 ".0"行为

c++ - 什么时候应该让一个类不可复制?

lua - 如何在c中获取lua表的表长度?

c++ - Ogre3D 与 CEGUI

javascript - 用 JavaScript 制作游戏

php - 使用 PHP 编写脚本的游戏引擎?

Lua表删除重复项