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

其他游戏

开发平台:

MultiPlatform

  1. /********************************************************************
  2. created: 2004/05/25
  3. created: 25:5:2004   13:25
  4. filename:  d:WorksGamelibGameObj.h
  5. file path: d:WorksGamelib
  6. file base: GameObj
  7. file ext: h
  8. author: lazybug
  9. purpose: 定义游戏中常用的基本结构体和类
  10. *********************************************************************/
  11. #pragma    once
  12. #include <string>
  13. #include <vector>
  14. #include "./callback_functions.h"
  15. class CGameLogic ;
  16. /*
  17.  * 描述说话窗口的结构体
  18.  */ 
  19. struct STalking_Board
  20. {
  21. int Talker_id ;  // 说话人的头像资源号
  22. int Lisenner_id ;  // 听者的头像资源号
  23. std::string words ;  // 说话内容(可以带有tag标记)
  24. bool actived ;  // 是否激活(显示在屏幕)
  25. };
  26. /*
  27.  * 描述发现物品窗口的结构体
  28.  */
  29. struct SDiscovery_Board
  30. {
  31. int item ; // 显示图片的资源号
  32. std::string description ; // 对应的文本描述
  33. bool actived ; // 是否激活(显示在屏幕)
  34. };
  35. /*
  36.  * 菜单项
  37.  */
  38. struct SMenuItem
  39. {
  40. int pic_id ; // 菜单项的小图片
  41. const char* description ; // 菜单的文字描述
  42. int x ; // 相对于菜单图片的坐标x
  43. int y ; // 相对于菜单图片的坐标y
  44. int width ; // 菜单项宽度
  45. int height ; // 菜单项高度
  46. int is_focus ; // 菜单项是否聚焦
  47. };
  48. /*
  49.  * 游戏图片资源结构体
  50.  */
  51. struct GameRes
  52. {
  53. std::string filename ; // 图片文件名
  54. int h_frame ; // 图片的水平帧数
  55. int v_frame ; // 图片的垂直帧数
  56. DWORD color_key ; // 掩码色
  57. };
  58. /*
  59.  * 人物属性结构体
  60.  */
  61. struct SPropertyItem
  62. {
  63. std::string name ; // 属性名
  64. std::string description ; // 属性描述
  65. int icon_id ; // 对应的图片资源号
  66. int val ; // 属性值
  67. };
  68. /*
  69.  * 游戏对象的基类,包涵一些基本信息,用于提供给Delphi引擎
  70.  */
  71. class CBaseStruct
  72. {
  73. public:
  74. int ResID ; // 图片资源号
  75. int x ; // x坐标
  76. int y ; // y坐标
  77. int facing ; // 正面朝向(仅用于Actor)
  78. int state ; // frame状态,静止或者跑步或者战斗(仅用于Actor)
  79. const char* attack_str ; // 信息字符串指针,用于人物头部渐升的字符,比如“攻击升级”(仅用于Actor)
  80. } ;
  81. /*
  82.  * 简单对象类,表示一些简单的物品图片对象,比如胡萝卜的图
  83.  */
  84. class CSimpleObj : public CBaseStruct
  85. {
  86. public:
  87. /*
  88.  * 构造函数
  89.  *  参数:
  90.  *  res_info - 表示资源信息的结构体
  91.  */
  92. CSimpleObj(GameRes* res_info) 
  93. {
  94. (*LoadActor)( res_info->filename.c_str(), res_info->h_frame, res_info->v_frame, res_info->color_key, &ResID ) ;
  95. };
  96. /*
  97.  * 析构函数(空)
  98.  */
  99. ~CSimpleObj() {};
  100. };
  101. /*
  102.  * 用来表示人物对象的类,包括npc和用户控制的人物
  103.  */
  104. class CPlayer : public CBaseStruct
  105. {
  106. public :
  107. /*
  108.  * 构造函数
  109.  *  参数:
  110.  * name - 人物名
  111.  */
  112. CPlayer( const std::string& name ) ;
  113. /*
  114.  * 析构函数
  115.  */
  116. ~CPlayer() ;
  117. // 用来表示人物的形象状态
  118. enum RanderState { 
  119. BIG,     // 室内用BIG
  120. SMALL,     // 室外用SMALL
  121. MID, // 大厅等地的中等大小
  122.  };
  123. // npc对话的模式
  124. enum TalkState { RANDOM, // 随机选一个说话脚本执行
  125.  CONDITIONAL,   // 有条件的执行连续的几个脚本,脚本中控制条件
  126.  CONTINUAL, // 顺序执行几个预定的说话脚本
  127.  LOOP // 循环执行预定的说话脚本
  128.    };
  129. /*
  130.  * 返回Actor的属性结构体指针
  131.  *  参数:
  132.  *  name - 属性名,比如“生命力”
  133.  *  返回值:
  134.  *  结构体指针,保证不为NULL,如果没有此属性,则抛出异常
  135.  */
  136. SPropertyItem* Property(const std::string& name) ;
  137.    /*
  138. *  返回Actor的技能结构体指针
  139. *  参数:
  140. *  name - 技能名,比如“斗鸡刀法”
  141. *  返回值:
  142. *  结构体指针,保证不为NULL,如果没有此技能,则抛出异常,参考CPlayer::Property()
  143. */
  144. SPropertyItem* Skill( const std::string& name ) ;
  145. /*
  146.  * Actor学会某项技能
  147.  *  参数:
  148.  *  skill - 技能结构体的引用
  149.  */
  150. void LearnSkill( const SPropertyItem& skill ) ;
  151. /*
  152.  * 根据物品描述来寻找装备
  153.  */
  154. SPropertyItem* FindTools(const std::string& description) ;
  155. /*
  156.  * 根据装备描述来去除装备
  157.  */
  158. void DelTools(const std::string& description) ;
  159. /*
  160.  * 给人物添加装备
  161.  *  参数:
  162.  *  tool - 装备(属性)结构体的引用
  163.  */
  164. void AddTool( SPropertyItem& tool ) ;
  165. /*
  166.  * 设置人物使用的图片资源
  167.  *  参数:
  168.  *  s - 枚举型,参见CPlayer::RanderState
  169.  */
  170. void SetActiveRes( RanderState s ) ;
  171. /*
  172.  * 在队列末尾加入新的路点
  173.  */
  174. void push_way_point(int x, int y) ;
  175. /*
  176.  * 在队列头加入路点,改变现有路径
  177.  */
  178. void insert_way_point(int x, int y) ;
  179. /*
  180.  * 清空原有路点
  181.  */
  182. void flush_all_way_point();
  183. /*
  184.  * 设置路线是否循环
  185.  *  参数:
  186.  *  is_loop - true表示路线循环,false表示仅一次路线
  187.  */
  188. void set_task_loop(bool is_loop) ;
  189. /*
  190.  * 状态自更新
  191.  */
  192. bool AutoUpdate() ;
  193. /*
  194.  * 进入自等待状态,傻乎乎的啥都不做
  195.  *  参数:
  196.  *  time - 等待的事件,ms为单位
  197.  */
  198. void EnterWaitingMode( unsigned int time ) ;
  199. /* 
  200. DetectOtherActor 用来测试目标位置是否会遇到其他Actor
  201. Parameters
  202. dx  - 从当前位置开始的X方向目标偏移量
  203. dy   - 从当前位置开始的Y方向目标偏移量 
  204. */
  205. bool DetectOtherActor(int dx, int dy) ;
  206.    /*
  207. * 在npc内置对话库末尾加入新的脚本过程名
  208. *   参数:
  209. *   ProcName - 脚本的过程名,不作存在性检查
  210. */
  211. void push_script( std::string& ProcName ) ;
  212. /*
  213.  * 根据Actor当前状态,返回Actor的对话脚本
  214.  *  返回值:
  215.  *  npc对话脚本的过程名
  216.  */
  217. std::string& TalkScript() ;
  218. /*
  219.  * 设置npc对话的模式
  220.  *  参数:
  221.  *  state - 枚举型变量,表示不同的对话模式
  222.  */
  223. void SetTalkState(TalkState state) ;
  224. /*
  225.  * 根据脚本更改Talking状态
  226.  *  参数:
  227.  *  ProcName - 下一次对话的过程名
  228.  */
  229. void NextTalking( std::string& ProcName ) ;
  230. /*
  231.  * 设置人物形象上的信息字符串,并在预定的帧数之后消失
  232.  *  参数:
  233.  *  info - 信息字符串
  234.  */
  235. void SetInfoText( const std::string& info ) ;
  236. /*
  237.  * npc的简单智能,选择招数,对另一Actor进行攻击
  238.  *  参数:
  239.  *  fighter_name - 对手的名字,通常是用户控制的人物
  240.  */
  241. void NpcFight( std::string& fighter_name ) ;
  242. /*
  243.  * 开始播放人物攻击动画帧,并在预定帧数之后停止
  244.  */
  245. void PlayFightMovie() ;
  246. /*
  247.  * Actor攻击另一个人物,执行相应的操作
  248.  *  参数:
  249.  *  skill - 使用的技能,必须包涵在技能列表里,否则抛出异常
  250.  *  name - 受攻击的Actor的名字
  251.  */
  252. void Attack( std::string& skill, std::string& name ) ;
  253. /*
  254.  * Actor尝试逃跑,可能成功,可能不成功,执行相应操作
  255.  *  参数:
  256.  *  name - npc对手的名字
  257.  */
  258. void TryEscape( const std::string& name ) ;
  259. /*
  260.  * 改变人物一个属性的值(饱和加减法,以及处理升级)
  261.  * 参数:
  262.  *  property - 属性名
  263.  * val - 变化的相对值
  264.  */
  265. void ChangeProperty( const std::string& property, int val ) ;
  266. /*
  267.  * 设Actor死掉
  268.  */
  269. void Die() ;
  270. /*
  271.  * 设置Actor是否处于自动攻击模式
  272.  *  val - true 表示自动攻击
  273.  */
  274. void AutoAttack( bool val ) ;
  275. protected:
  276. /*
  277.  * 类内常量
  278.  */
  279. enum CONSTANTS { FRAMENUMFORTEXT = 30, FRAMENUMFORMOV = 10 };
  280. /*
  281.  * 根据现在节点,计算到目的节点的平均偏移
  282.  */
  283. double compute_dxy() ;
  284. /*
  285.  * 测试是否能一步到达目的地
  286.  */
  287. bool test_goal() ;
  288. /*
  289.  * 动态计算地图上两点间距离
  290.  */
  291. double ActiveLength(int x1, int y1, int x2, int y2) ;
  292. /*
  293.  * 检查动画帧和信息字符串是否播放完毕,如完毕则关闭动画
  294.  */
  295. void CheckMovFrameEnd() ;
  296. private:
  297. /* 当前选择的路线偏移x */
  298. int way_point_dx ;
  299. /* 当前选择的路线偏移y */
  300. int way_point_dy ;
  301. /* 是否正在执行预定路线 */
  302. bool is_doing_task ;
  303. /* 坚持路线的时间,frame为单位 */
  304. int consist_way_time ;
  305. /* 在等待状态下,需要等待的时间,ms为单位 */
  306. size_t  waiting_time ;
  307. /* 在等待状态下,开始等待的时间,ms为单位 */
  308. size_t  start_time ;
  309. /* 是否在等待状态 */
  310. bool waiting_mode ;
  311. /* 预定路线是否循环 */
  312. bool    is_loop ;
  313. /* Actor是否会自动攻击 */
  314. bool    is_auto_attack ;
  315. /* 人物对话的状态迁移 */
  316. TalkState m_talk_state ;
  317. /* 当前的对话指针 */
  318. size_t m_current_words ;
  319. /* 人物内置的对话脚本调用 */
  320. std::vector<std::string> m_talking_script ;
  321. /* 记录人物对象的信息字符 */
  322. std::string m_attack_str_buf ;
  323. /* 记录帧数,用于播放人物信息字符串 */
  324. size_t m_frame_count_for_info ;
  325. /* 记录帧数,用于播放人物动画 */
  326. size_t m_frame_count_for_movie ;
  327. public:
  328. /* 环境变量 */
  329. static CGameLogic* context ;
  330. /* 是否在场景中激活 */
  331. bool active_in_scene ;
  332. /* Actor 是否死掉(永远不出现在场景里) */
  333. bool is_dead ;
  334. /* 大图片的资源号,由Unicough引擎分配 */
  335. int Big_Res_id ;
  336. /* 中等大小图片的资源号,由Unicough引擎分配 */
  337. int Middle_Res_id ;
  338. /* 小图片的资源号,由Unicough引擎分配 */
  339. int Small_Res_id ;
  340. /* 人物头像的资源号 */
  341. int face_Res_id ;
  342. /* 出现在游戏中的人物名 */
  343. std::string name ;
  344. /* 人物的描述,用于查看生平简介 */
  345. std::string self_description ;
  346. std::vector<SPropertyItem>  m_property ; // 属性list
  347. std::vector<SPropertyItem>  m_tools ; // 装备list
  348. std::vector<SPropertyItem>  m_skills ; // 技能list
  349. std::list< std::pair<int, int> > m_way_points ; // 走路点
  350. std::list< std::pair<int, int> >    m_backup_way_points ; // 记录走过的路点
  351. };