EventManager.h
上传用户:lian_0917
上传日期:2013-03-24
资源大小:1151k
文件大小:5k
源码类别:

其他游戏

开发平台:

MultiPlatform

  1. #pragma once
  2. #include "stdafx.h"
  3. /*
  4.  * 表示场景效果的枚举类型
  5.  */
  6. enum RanderState
  7. {
  8. BackGround_Fadein, // 淡入
  9. BackGround_Fadeout, // 淡出
  10. BackGround_Blank, // 黑屏
  11. BackGround_Normal // 一般状态
  12. };
  13. /*
  14.  * 保存脚本调用环境信息的结构体
  15.  */
  16. struct CallInfo
  17. {
  18. std::string proc_name ; // 过程名,相当于cs
  19. size_t ip ; // 过程内偏移,相当于ip
  20. int logical_map ; // 全局量,当前逻辑地图
  21. std::string Scene ; // 全局量,当前场景
  22. std::string Mask ; // 全局量,当前场景的掩码
  23. };
  24. class CGameLogic ;
  25. /*
  26.  * 事件管理器,处理所有脚本
  27.  */
  28. class CEventManager
  29. {
  30. public:
  31. CEventManager(CGameLogic* contex);
  32. ~CEventManager(void);
  33. /*
  34.  * 从文件读取某一幕的脚本
  35.  *  参数:
  36.  *  scenefile - 文件名
  37.  */
  38. void LoadScene(std::string scenefile) ;
  39. /*
  40.  * 执行预定的入口函数
  41.  */
  42. void Do_Default_Event() ;
  43. /*
  44.  * 跳转到某事件,比如进出房屋,相当与jump
  45.  */
  46. void Do_Event( const std::string& Proc, std::vector<std::string>* ArguList = NULL ) ;
  47. /*
  48.  * 重载函数
  49.  */
  50. void Do_Event( int ID, std::vector<std::string>* ArguList = NULL ) ;
  51. /*
  52.  * 调用过程,相当与call
  53.  */
  54. void Call_Event( const std::string& Proc, std::vector<std::string>* ArguList = NULL) ;
  55. void Call_Event( int ID, std::vector<std::string>* ArguList = NULL) ;
  56. /*
  57.  * 强行从当前过程中返回
  58.  */
  59. void Return_from_Event() ;
  60. /*
  61.  * 查询事件的后续事件,如没有,则返回-1
  62.  */
  63. int Following_Event( int ID ) ;
  64. /*
  65.  * 是否在执行脚本过程
  66.  */
  67. bool Has_something_todo() ;
  68. /*
  69.  * 执行下一句脚本
  70.  */
  71. bool Continue_Doing() ;
  72. /*
  73.  * 得到当前背景图片ID
  74.  */
  75. int GetBackImg() { return BackBmpID; }
  76. /*
  77.  * 得到当前背景掩码ID
  78.  */
  79. int GetMaskImg() { return MaskBmpID; }
  80. /*
  81.  * 绘图引擎得到状态,整体淡入BackGround_Fadein,淡出,全黑
  82.  */
  83. int GetState() ;
  84. /*
  85.  * 设置场景显示效果,见RanderState
  86.  */
  87. void SetState( RanderState state ) ;
  88. /*
  89.  * 是否在等待用户的回车
  90.  */
  91. bool is_wait_for_enter() ;
  92. /*
  93. * 开始逻辑等待,不执行脚本
  94. *   参数:
  95. *   count - 需要等待的帧数
  96. */
  97. void Wait( size_t count ) ;
  98. /*
  99.  * 处理用户按下的回车
  100.  */
  101. void UserPressedEnter() ;
  102. bool m_is_in_state ;
  103. protected:
  104. /*
  105.  * 从文件读入一行脚本代码
  106.  */
  107. std::string  readin(std::ifstream& in ) ;
  108. /*
  109.  * 切换场景
  110.  */
  111. void  ChangeScene( const std::string& scene_name, const std::string& mask_name, int logical_map ) ;
  112. /*
  113.  * 执行某条语句
  114.  */
  115. void  Executer( std::stringstream& stream ) ;
  116. /*
  117.  * 根据段代码和ip放置读指令指针,int版本用来兼容老的设计,根据过程号寻址
  118.  */
  119. void  PosIterator( int cs, size_t ip, std::vector< std::string >::iterator& pos ) ;
  120. /*
  121.  * 根据段代码和ip放置读指令指针,新的版本,根据过程名寻址
  122.  */
  123. void  PosIterator(const std::string& proc, size_t ip, std::vector< std::string>::iterator& pos) ;
  124. /*
  125.  * 根据过程名返回代码段的引用
  126.  */
  127. std::vector<std::string>& FindProc( const std::string& ProcName ) ;
  128. std::vector<std::string>& FindProc( int ProcID ) ;
  129. /*
  130.  * 判断是否在逻辑等待,不执行脚本
  131.  *  返回值:
  132.  *  true表示继续等待,不执行脚本,false表示不在等待状态
  133.  */
  134. bool is_logic_waiting() ;
  135. private:
  136. /* 环境变量 */
  137. CGameLogic* contex ;
  138. /* 指向过程的指针,相当于cs */
  139. std::string now_event ;
  140. /* 所有的过程 */
  141. std::list< std::pair< std::string, std::vector< std::string > > > event_lib ;
  142. /* 执行过的脚本名集合,用于统计数据 */
  143. std::set<std::string> call_record ;
  144. /* 指向具体语句的指针,相当于ip */
  145. std::vector< std::string >::iterator pos_in_a_event ; 
  146. /* 过程调用栈 */
  147. std::vector<CallInfo> Call_Stack ;
  148. /* 调用参数栈 */
  149. std::list< std::vector<std::string> > Arguments_Stack ;
  150. /* 当前过程参数列表 */
  151. std::vector< std::string > Arguments_list ;
  152. /* 事件关系库,记录一个事件的后续事件 */
  153. std::map<int, int> relation_lib ;
  154. /* 需要等待的帧数 */
  155. size_t m_waiting_frame ;
  156. /* 开始等待时候的帧数 */
  157. size_t m_frame_count ;
  158. /* 是否在执行逻辑等待 */
  159. bool m_is_doing_logic_wait ;
  160. /* 背景图片资源号 */
  161. int BackBmpID ;
  162. /* 掩码图片资源号 */
  163. int MaskBmpID ;
  164. /* 背景图片资源名字 */
  165. std::string BackBmpResName ;
  166. /* 掩码图片资源名字 */
  167. std::string MaskBmpResName ;
  168. /* 是否执行脚本过程中 */
  169. bool is_doing_event ;
  170. /* 是否等待用户回车 */
  171. bool wait_for_enter ;
  172. /* 场景显示效果 */
  173. RanderState m_background_state ;
  174. };
  175. inline int CEventManager::GetState()
  176. {
  177. return m_background_state ;
  178. }
  179. inline void CEventManager::SetState(RanderState state )
  180. {
  181. m_background_state = state ;
  182. }
  183. inline bool CEventManager::is_wait_for_enter()
  184. {
  185. return wait_for_enter ;
  186. }
  187. inline void CEventManager::UserPressedEnter()
  188. {
  189. wait_for_enter = false ;
  190. }