AI提示词:一个通用C++ ECS系统实现(事件条件动作系统)

AI提示词

using eca_cond = bool(*)(...);
using eca_action = void(*)(...);

class eca_info
{
public:
    eca_cond m_cond;
    eca_action m_action;
    void* m_handler_owner;
};

using eca_infos = std::vector;

void listen(const std::string& key, eca_action action, void* handler_owner = nullptr);
void listen(const std::string& key, eca_cond cond, eca_action action, void* handler_owner = nullptr);
const eca_infos& get_infos(const std::string& key);

template
inline void trigger(const std::string& key, Args ...args)
{
    auto infos get_infos(key);
    for (auto& info : infos)
    {
        if (info.m_cond && !info.m_cond(...args))
        {
            continue;
        }

        if (info.handler_owner)
        {
            // 调用对象方法
            (info.handler_owner)->info.m_action()...args);
        }
        else
        {
            // 调用全局函数
            info.m_action(...args);
        }
    }
}

补全上面的功能

修改后的ECA系统:eca.h

#pragma once

#include 
#include 
#include 
#include 

// 定义条件和动作的类型
using eca_cond = bool(*)(...);
using eca_action = void(*)(...);

// 事件信息结构体,包含条件、动作和事件处理者的所有者
class eca_info {
public:
    eca_cond m_cond;       // 条件函数
    eca_action m_action;   // 动作函数
    void* m_handler_owner; // 事件处理者的所有者,用于对象方法调用
};

// 使用向量存储事件信息,以便管理多个事件
using eca_infos = std::vector;

// 模拟的全局存储,用于保存不同键对应的事件信息列表
using eca_map = std::unordered_map;
inline eca_map& get_eca_map()
{
    static eca_map eca_map_;
    return eca_map_;
}

// 监听事件,注册动作
void listen(const std::string& key, eca_action action, void* handler_owner = nullptr)
{
    get_eca_map()[key].push_back({nullptr, action, handler_owner});
}

// 监听事件,注册条件和动作
void listen(const std::string& key, eca_cond cond, eca_action action, void* handler_owner = nullptr)
{
    get_eca_map()[key].push_back({cond, action, handler_owner});
}

// 获取特定事件键对应的事件信息列表
const eca_infos& get_infos(const std::string& key)
{
    static const eca_infos empty; // 空列表用于未找到的情况
    auto map = get_eca_map();
    return map.count(key) ? map[key] : empty;
}

// 触发事件
template
inline void trigger(const std::string& key, Args... args) {
    auto& infos = get_infos(key); // 获取对应事件的所有信息
    for (auto& info : infos) {
        // 如果存在条件函数且条件不满足,则跳过此动作
        if (info.m_cond && !info.m_cond(args...)) {
            continue;
        }

        // 判断是否有事件处理者的所有者(对象方法调用)
        if (info.m_handler_owner)
        {
            // 调用对象方法,假设动作函数是该对象的成员函数
            // 注意:这里可能需要调整,以正确调用成员函数
            (static_cast(info.m_action))(info.m_handler_owner, args...);
        }
        else
        {
            // 调用全局函数或静态函数
            info.m_action(args...);
        }
    }
}

From:https://www.cnblogs.com/ygluu/p/18835416
码客-ygluu
100+评论
captcha