#pragma once #include "emacros.h" #include "ecommon.h" namespace e2d { class Game; class Input; class Renderer; class Node; class Timer; class Action; class Music; class Collider; class Transition; class InputListener; class CollisionListener; // 对象管理器 class ObjectManager final { friend Game; public: // 将一个对象放入内存池 static void add( Object * nptr ); // 释放垃圾对象的内存空间 static void clear(); private: // 更新对象管理器 static void __update(); // 清空所有对象 static void __uninit(); }; // 场景管理器 class SceneManager final { friend Game; friend Renderer; public: // 切换场景 static void enter( Scene * scene, /* 下一个场景的指针 */ Transition * transition = nullptr, /* 场景切换动画 */ bool saveCurrentScene = true /* 是否保存当前场景 */ ); // 返回上一场景 static void back( Transition * transition = nullptr /* 场景切换动画 */ ); // 清空保存的所有场景 static void clear(); // 获取当前场景 static Scene * getCurrentScene(); // 获取场景栈 static std::stack getSceneStack(); // 是否正在进行转场动画 static bool isTransitioning(); private: // 更新场景内容 static void __update(); // 渲染场景画面 static void __render(); // 初始化场景 static bool __init(); // 回收场景资源 static void __uninit(); }; // 定时器管理器 class TimerManager final { friend Game; friend Node; friend Timer; public: // 等待一段时间后执行指定函数 static void start( double timeOut, /* 等待的时长(秒) */ Function func /* 执行的函数 */ ); // 启动具有相同名称的定时器 static void start( String name ); // 停止具有相同名称的定时器 static void stop( String name ); // 删除具有相同名称的定时器 static void clear( String name ); // 获取名称相同的定时器 static std::vector get( String name ); // 启动所有定时器 static void startAll(); // 停止所有定时器 static void stopAll(); // 停止并清除所有定时器 static void stopAndClearAll(); // 获取所有定时器 static std::vector getAll(); private: // 更新定时器 static void __update(); // 添加一个定时器 static void __add( Timer * pTimer ); // 重置定时器状态 static void __resetAllTimers(); // 清空定时器 static void __uninit(); }; // 动作管理器 class ActionManager final { friend Game; friend Node; friend Action; public: // 继续名称相同的所有动作 static void resume( String strActionName ); // 暂停名称相同的所有动作 static void pause( String strActionName ); // 停止名称相同的所有动作 static void stop( String strActionName ); // 继续所有动作 static void resumeAll(); // 暂停所有动作 static void pauseAll(); // 停止所有动作 static void stopAll(); // 获取所有名称相同的动作 static std::vector get( String strActionName ); // 获取所有动作 static std::vector getAll(); private: // 更新动画状态 static void __update(); // 添加动作 static void __add( Action * pAction ); // 删除动作 static void __remove( Action * pAction ); // 执行动作 static void __startAction( Action * pAction, Node * pTargetNode ); // 继续绑定在节点上的所有动作 static void __resumeAllBindedWith( Node * pTargetNode ); // 暂停绑定在节点上的所有动作 static void __pauseAllBindedWith( Node * pTargetNode ); // 停止绑定在节点上的所有动作 static void __stopAllBindedWith( Node * pTargetNode ); // 清空绑定在节点上的所有动作 static void __clearAllBindedWith( Node * pTargetNode ); // 重置所有动作状态 static void __resetAllActions(); }; // 音乐管理工具 class MusicManager final { friend Game; public: // 预加载音乐资源 static bool preload( String strFilePath /* 音乐文件路径 */ ); // 播放音乐 static bool play( String strFilePath, /* 音乐文件路径 */ int nLoopCount = 0 /* 重复播放次数,设置 -1 为循环播放 */ ); // 暂停音乐 static void pause( String strFilePath /* 音乐文件路径 */ ); // 继续播放音乐 static void resume( String strFilePath /* 音乐文件路径 */ ); // 停止音乐 static void stop( String strFilePath /* 音乐文件路径 */ ); // 获取指定音乐的 Music 对象 static Music * get( String strFilePath /* 音乐文件路径 */ ); // 暂停所有音乐 static void pauseAll(); // 继续播放所有音乐 static void resumeAll(); // 停止所有音乐 static void stopAll(); #if HIGHER_THAN_VS2010 // 获取 IXAudio2 对象 static IXAudio2 * getIXAudio2(); // 获取 IXAudio2MasteringVoice 对象 static IXAudio2MasteringVoice * getIXAudio2MasteringVoice(); #else // 获取 HINSTANCE static HINSTANCE getHInstance(); #endif private: // 初始化 XAudio2 static bool __init(); // 回收相关资源 static void __uninit(); }; // 键盘和鼠标消息管理器 class InputManager final { friend Input; friend InputListener; public: // 添加输入监听 static void add( Function func, /* 监听到用户输入时的执行函数 */ String name = L"" /* 监听器名称 */ ); // 启动输入监听 static void start( String name ); // 停止输入监听 static void stop( String name ); // 清除输入监听 static void clear( String name ); // 启动所有监听器 static void startAll(); // 停止所有监听器 static void stopAll(); // 清除所有监听器 static void clearAll(); // 获取监听器 static std::vector get( String name ); // 获取全部监听器 static std::vector getAll(); private: // 添加输入监听 static void __add( InputListener * pListener ); // 更新监听器 static void __update(); }; // 碰撞管理器 class ColliderManager final { friend Node; friend Collider; friend CollisionListener; public: // 开启或关闭碰撞监听功能(默认关闭) static void setEnable( bool bEnable ); // 添加碰撞监听 static void add( Function func, /* 监听到碰撞时的执行函数 */ String name = L"" /* 监听器名称 */ ); // 启动碰撞监听 static void start( String name ); // 停止碰撞监听 static void stop( String name ); // 清除碰撞监听 static void clear( String name ); // 启动所有监听器 static void startAll(); // 停止所有监听器 static void stopAll(); // 清除所有监听器 static void clearAll(); // 获取监听器 static std::vector get( String name ); // 获取全部监听器 static std::vector getAll(); // 获取碰撞发生时的主动体 static Node * getActiveNode(); // 获取碰撞发生时的被动体 static Node * getPassiveNode(); // 判断碰撞是否由该节点引发(如果是,返回与其相撞的节点指针,否则返回空) static Node * isCausedBy( Node * pNode ); // 判断发生碰撞的节点名称是否相同(若相同返回其指针,否则返回空) static Node * isCausedBy( String name ); private: // 添加碰撞监听 static void __add( CollisionListener * pListener ); // 更新监听器 static void __update(); // 更新碰撞体 static void __updateCollider( Collider * pActiveCollider ); // 添加碰撞体 static void __addCollider( Collider * pCollider ); // 删除已绑定的碰撞体 static void __removeCollider( Collider * pCollider ); }; }