例如,人们如何让模组在游戏中发挥作用?
我所说的 mods 是指对最终可执行文件的添加。

如果我要制作游戏(使用编译语言),我是否可以允许自己或其他人在无需创建某种脚本语言的情况下对其进行添加。

我的想法:(这行得通吗?)

  • 在基础程序本身中,创建一个堆栈或 FIFO 甚至一个链表。
  • 然后在程序之外,加载器将加载基础和任何模组,然后将模组的地址传递给基础程序。
  • 最后,基础程序做它的事情,然后将执行切换到 mods(也许有某种回调机制,比如 [gasp!] goto)。当它们完成时,代码执行回到基础,在那里它可以做自己的事情。
  • 最佳答案

    通常您会向模组编写者公开您的一些应用程序(游戏?)内部接口(interface)和对象。 mod 编写器将构建一个 dll,它使用这些对象和接口(interface)来做一些有用的事情。然后应用程序将动态加载 mod dll 并在必要时调用 mod 实现。

    另一种思考方式是,假设您的游戏是一个操作系统(Windows),而您的 mod 是一个应用程序(Word)。操作系统提供了一些 API 来创建和管理窗口,应用程序在必要时使用它们。

    因此,作为游戏开发者,您可以创建和分发以下界面:

    //mod.h
    class Mod {
        //takes suggested damage as an arg and returns modified damage
        virtual int takeDamage(int damage);
    };
    

    并指导用户提供导出函数来实例化和删除mod对象。

    实现它:
    //godmod.h
    class GodMod : public Mod {
        int takeDamage(int damage) { return 0; } // god mode!!
    }
    
    __declspec(dllexport) Mod *create_mod() { return new GodMode(); }
    __declspec(dllexport) void delete_mod(Mod *mod) { delete mod; }
    

    然后你必须加载 dll(Windows 上的 LoadLibrary API),使用 create_mod API 导出 delete_modGetProcAddress 符号。之后在游戏中的某个地方,您将使用 create_mod 实例化 mod,并在需要时使用它:
    int damage = 100; //original damage
    for (int i = 0; i < mods_count; i++) {
        damage = mods[i]->tageDamage(damage);
    }
    decrease_health(damage);
    

    毕竟,您必须从相应的 dll 中使用 delete_mod 发布 mod。

    关于c++ - mods是如何工作的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4978568/

    10-17 00:29