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

其他游戏

开发平台:

MultiPlatform

  1. #pragma once
  2. #include <list>
  3. #include "GameObj.h"
  4. #include "ActorManager.h"
  5. #include "EventManager.h"
  6. class CGameLogic
  7. {
  8. public:
  9. /*
  10.  * 构造函数:创建ActorManager和EventManager得对象
  11.  */
  12. CGameLogic(void) ;
  13. /*
  14.  * 析构
  15.  */
  16. ~CGameLogic(void) ;
  17. /*
  18.  * 游戏各种状态的枚举
  19.  */
  20. enum state { STOP = 0, /* 用户控制的人物处于静止状态 */
  21.  WALKING = 1,   /* 用户控制的人物处于奔跑状态 */
  22.  FIGHTING = 2,  /* 游戏处于战斗场景状态 */
  23.  TALKING,       /* 说话状态 */
  24.  MENUING, /* 菜单状态 */
  25.  NORMAL /* 一般状态 */
  26. };
  27. /* 
  28.  * 枚举屏幕对象:对外接口
  29.      *  参数:
  30.  *  object - 指向对象结构体CBaseStruct的指针,依次copy对象内容到指针,枚举结束copy空对象
  31.  */
  32. void enumObj( void* object ) ;
  33. /*
  34.  * 逻辑状态更新,接受外界的调用
  35.  */
  36. void AutoUpdate() ;
  37. /*
  38.  * 处理用户输入
  39.  *  参数:
  40.  *  keymap - 若干个按键的按位map,某一位置1,表示键被按下
  41.  */
  42. void UserInput( int keymap ) ;
  43. /*
  44.  * 查询对话,通过此机制来判断何时需要显示人物之间的对话
  45.  *  返回值:
  46.  *  返回对话板的指针,见STalking_Board
  47.  */
  48. const STalking_Board* QueryTalking() ;
  49. /*
  50.  * 查询发现物品对话框,机制同CGameLogic::QueryTalking
  51.  */
  52. const SDiscovery_Board* QueryDiscovery() ;
  53. /*
  54.  * 根据环境已经游戏状态移动当前的目标物体
  55.  *  参数:
  56.  *  dx - x方向的目标偏移
  57.  *  dy - y方向的目标偏移
  58.  */
  59. void ActiveMove( int dx, int dy ) ;
  60. /*
  61.  * 从文件读入逻辑地图
  62.  *  参数:
  63.  *  name - 文件名
  64.  */
  65. void LoadLogicalMap( const std::string& name) ;
  66. /*
  67.  * 选择使用逻辑地图
  68.  *  参数:
  69.  *  map_id - 逻辑地图的编号
  70.  */
  71. void UseLogicalMap(int map_id) ;
  72. /*
  73.  * 获取图片资源信息,包括colorkey等
  74.  *  参数:
  75.  *  res_name - 资源名
  76.  */
  77. GameRes* GetRes(const std::string& res_name) ;
  78. /*
  79.  * 查询当前菜单标题,没有菜单返回NULL
  80.  */
  81. int QueryCurrentMenu( char** title ) ;
  82. /*
  83.  * 查询战斗场景的位置以及大小
  84.  *  参数
  85.  *  x - 指向圆心x坐标的指针
  86.  *  y - 指向圆心y坐标的指针
  87.  *  radius - 指向半径的int型指针
  88.  */
  89. void QueryBattleState( int* x, int* y, int* radius ) ;
  90. /*
  91.  * 当前人物调查地图
  92.  */
  93. void Research() ;
  94. /*
  95.  * 对选择菜单项的处理
  96.  */
  97. void SelectItem() ;
  98. /*
  99.  * 枚举菜单项
  100.  *  参数:
  101.  *  pItem - 指向菜单项的指针
  102.  */
  103. void enumMenuItem( void* pItem ) ;
  104. /*
  105.  * 设置人物移动速度
  106.  *  参数:
  107.  *  speed - 一次移动的象素
  108.  */
  109. void SetWalkingSpeed( int speed ) ;
  110. /*
  111.  * 得到人物移动速度
  112.  *  返回值:
  113.  *  一次移动的象素
  114.  */
  115. int  GetWalkingSpeed() ;
  116. /*
  117.  * 得到npc的敏感距离
  118.  *  返回值:
  119.  *  象素为单位
  120.  */
  121. int  GetSensitiveLength() ;
  122. /*
  123.  * 开始战斗模式
  124.  *  参数:
  125.  *  name - 玩家控制人物的名字
  126.  *  npc_name - npc人物的名字
  127.  */
  128. void StartFight(const std::string& name, const std::string& npc_name) ;
  129. /*
  130.  * 结束战斗模式
  131.  */
  132. void EndFight(const std::string& name);
  133. /*
  134.  * 设置屏幕光圈焦点
  135.  *  参数:
  136.  *  x - 圆心x坐标
  137.  *  y - 圆心y坐标
  138.  *  radius - 圆心半径
  139.  */
  140. void SetLightSpot( int x, int y, int radius ) ;
  141. /*
  142.  * 得到当前逻辑地图某个位置的信息
  143.  *  参数:
  144.  *  x - x坐标
  145.  * y - y坐标
  146.  *  返回值:
  147.  *  如实返回逻辑地图某个位置的值
  148.  */
  149. int GetLogicalMapInfo(int x, int y) ;
  150. /*
  151.  * 是否在战斗模式
  152.  *  返回值:
  153.  *  true - 在战斗模式,false - 不在战斗模式
  154.  */
  155. bool is_fighting() ;
  156. /*
  157.  * 主角是否死掉
  158.  *  返回值:
  159.  *  true - 死掉, false - 没死
  160.  */
  161. bool is_dead() ;
  162. /*
  163.  * 本幕是否打通关,既完成既定任务
  164.  */
  165. bool is_success() ;
  166. /*
  167.  * 设置上下方向的移动角度
  168.  *  参数:
  169.  *  angel - 角度
  170.  */
  171. void set_up_walking_angel(double angel) ;
  172. /*
  173. *  设置左右方向的移动角度
  174. *  参数:
  175. *  angel - 角度
  176. */
  177. void set_left_walking_angel(double angel) ;
  178. /*
  179.  * 得到战斗中电脑对手的名字
  180.  */
  181. std::string& get_npc_fighter();
  182. /* 事件管理器 */
  183. CEventManager* m_EventManager ;
  184. /* 人物管理器 */
  185. CActorManager* m_ActorManager ;
  186. friend class CEventManager ;
  187. friend class CPlayer ;
  188. protected:
  189. /*
  190.  * 从文件读取图片资源信息
  191.  */
  192. void LoadResInfo() ;
  193. /*
  194.  * 判断菜单项是否枚举到结尾
  195.  */
  196. bool is_enum_item_end(const std::vector<SPropertyItem>::iterator& pos) ;
  197. /*
  198.  * 判断菜单项是否在枚举的开始位置
  199.  */
  200. bool is_enum_item_begin(const std::vector<SPropertyItem>::iterator& pos) ;
  201. /*
  202.  * 重置枚举指针到开始位置
  203.  */
  204. void reset_enum_pointer(std::vector<SPropertyItem>::iterator& pos) ;
  205. /*
  206.  * 判断是否能够在预期方向卷动菜单
  207.  * 参数:
  208.  *  way - 卷动方向,见CGameLogic::SCROLLINFO
  209.  *  返回值:
  210.  *  bool型,代表能否卷动
  211.  */
  212. bool Scrolled(int way) ;
  213. /*
  214.  * 打开指定的菜单
  215.  *  参数:
  216.  *  id - 需要打开的菜单号,见CGameLogic::MENUNAME
  217.  */
  218. void BringUpMenu( int id ) ;
  219. /*
  220.  * 拷贝ActiveActor的属性列表到通用菜单
  221.  */
  222. void dump_property_menu() ;
  223. private:
  224. enum { granularity = 10,
  225.   maxmap = 11, /* 最大逻辑地图数目 */
  226.   FASTMODE = 10, SLOWMODE = 5   /* 人物走路速度 */
  227. };
  228. enum    SCROLLINFO { UPWARD = 0, DOWNWARD = 1, MAXSCROLLITEM = 4 };
  229. enum MENUNAME { NOMENU = -1, MENU1 = 1, MENU2 = 2, MENU3 = 3, MENU4 = 4 }; /* 菜单状态 */
  230. private:
  231. /* 记录对话信息的结构体 */
  232. STalking_Board m_talking_board ;
  233. /* 记录消息框信息的结构体 */
  234. SDiscovery_Board m_discovery_board ;
  235. /* 游戏状态,参见CGameLogic::state */
  236. state m_GameState ;
  237. /* 是否接受用户输入 */
  238. bool m_bAccept_user_inputs ;
  239. /* 逻辑地图 */
  240. int m_LogicMap[maxmap][800/granularity][600/granularity] ;
  241. /* 当前场景的地图编号 */
  242. int m_current_map ;
  243. /* 当前菜单编号 */
  244. int m_current_menu ;
  245. /* 走路速度,一次update所行走的距离 */
  246. int m_walking_speed ;
  247. /*  npc 的敏感距离 */
  248. int m_sensitive_length ;
  249. // 屏幕亮点坐标
  250. int m_lightspot_x ;
  251. /* 屏幕亮点坐标 */
  252. int m_lightspot_y ;
  253. /* 屏幕亮点半径 */
  254. int m_lightspot_radius ;
  255. /* 战斗中npc的名字 */
  256. std::string m_npcFighter ;
  257. /* 是否在战斗模式 */
  258. bool m_is_fighting ;
  259. /* 主角是否死掉 */
  260. bool m_is_dead ;
  261. /* 是否通关 */
  262. bool m_is_success ;
  263. /* 向上下方向移动的角度 */
  264. double m_walking_angel_up ;
  265. /* 向左右方向移动的角度 */
  266. double m_walking_angel_left ;
  267. private:
  268. /* 把游戏中使用到的资源与外部文件联系起来 */
  269. std::map< std::string, GameRes > m_game_res ;
  270. /* 枚举菜单项用的指针 */
  271. std::vector<SPropertyItem>::iterator m_enumPointer ;
  272. /* 菜单焦点迭代器 */
  273. std::vector<SPropertyItem>::iterator    m_focused_menu_item;
  274. /* 菜单卷动开始点 */
  275. std::vector<SPropertyItem>::iterator    m_scroll_point ;
  276. /* 通用菜单 */
  277. std::vector<SPropertyItem> m_gerneral_menu ;
  278. };
  279. inline void CGameLogic::UseLogicalMap(int map_id)
  280. {
  281. if ( map_id < maxmap )
  282. {
  283. m_current_map = map_id ;
  284. }
  285. }
  286. inline int CGameLogic::QueryCurrentMenu( char** title )
  287. {
  288. switch (m_current_menu) 
  289. {
  290. case MENU1 :
  291.   *title = "属性" ;
  292. break;
  293. case MENU2 :
  294.   *title = "装备菜单" ;
  295. break;
  296. case MENU3:
  297. case MENU4:
  298.   *title = "空菜单" ;
  299. break;
  300. default:
  301. //throw exception("invalid menu id when query menu caption!") ;
  302. break;
  303. }
  304. return m_current_menu ;
  305. }
  306. inline void CGameLogic::SetWalkingSpeed(int speed )
  307. {
  308. m_walking_speed = speed ;
  309. // 敏感距离也跟随改变
  310. if ( speed <= SLOWMODE )
  311. {
  312. m_sensitive_length = 25 ;
  313. }
  314. else
  315. {
  316. m_sensitive_length = 55 ;
  317. }
  318. }
  319. inline void CGameLogic::SetLightSpot(int x, int y, int radius )
  320. {
  321. m_lightspot_x = x ;
  322. m_lightspot_y = y ;
  323. m_lightspot_radius = radius ;
  324. }
  325. inline int CGameLogic::GetWalkingSpeed()
  326. {
  327. return m_walking_speed ;
  328. }
  329. inline int CGameLogic::GetLogicalMapInfo(int x, int y)
  330. {
  331. return m_LogicMap[ m_current_map ][x / granularity][y / granularity] ;
  332. }
  333. inline int CGameLogic::GetSensitiveLength()
  334. {
  335. return m_sensitive_length ;
  336. }
  337. inline bool CGameLogic::is_fighting()
  338. {
  339. return m_is_fighting ;
  340. }
  341. inline bool CGameLogic::is_dead()
  342. {
  343. return m_is_dead ;
  344. }
  345. inline bool CGameLogic::is_success()
  346. {
  347. return m_is_success ;
  348. }
  349. inline void CGameLogic::set_up_walking_angel(double angel)
  350. {
  351. m_walking_angel_up = angel ;
  352. }
  353. inline void CGameLogic::set_left_walking_angel(double angel)
  354. {
  355. m_walking_angel_left = angel ;
  356. }
  357. inline std::string& CGameLogic::get_npc_fighter()
  358. {
  359. return m_npcFighter ;
  360. }
  361. extern CGameLogic* LogicEngine ;