gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:25:08 33 4
gpt4 key购买 nike

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

主要是我有一个 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com