GameObj.h
上传用户:lian_0917
上传日期:2013-03-24
资源大小:1151k
文件大小:9k
- /********************************************************************
- created: 2004/05/25
- created: 25:5:2004 13:25
- filename: d:WorksGamelibGameObj.h
- file path: d:WorksGamelib
- file base: GameObj
- file ext: h
- author: lazybug
-
- purpose: 定义游戏中常用的基本结构体和类
- *********************************************************************/
- #pragma once
- #include <string>
- #include <vector>
- #include "./callback_functions.h"
- class CGameLogic ;
- /*
- * 描述说话窗口的结构体
- */
- struct STalking_Board
- {
- int Talker_id ; // 说话人的头像资源号
- int Lisenner_id ; // 听者的头像资源号
- std::string words ; // 说话内容(可以带有tag标记)
- bool actived ; // 是否激活(显示在屏幕)
- };
- /*
- * 描述发现物品窗口的结构体
- */
- struct SDiscovery_Board
- {
- int item ; // 显示图片的资源号
- std::string description ; // 对应的文本描述
- bool actived ; // 是否激活(显示在屏幕)
- };
- /*
- * 菜单项
- */
- struct SMenuItem
- {
- int pic_id ; // 菜单项的小图片
- const char* description ; // 菜单的文字描述
- int x ; // 相对于菜单图片的坐标x
- int y ; // 相对于菜单图片的坐标y
- int width ; // 菜单项宽度
- int height ; // 菜单项高度
- int is_focus ; // 菜单项是否聚焦
- };
- /*
- * 游戏图片资源结构体
- */
- struct GameRes
- {
- std::string filename ; // 图片文件名
- int h_frame ; // 图片的水平帧数
- int v_frame ; // 图片的垂直帧数
- DWORD color_key ; // 掩码色
- };
- /*
- * 人物属性结构体
- */
- struct SPropertyItem
- {
- std::string name ; // 属性名
- std::string description ; // 属性描述
- int icon_id ; // 对应的图片资源号
- int val ; // 属性值
- };
- /*
- * 游戏对象的基类,包涵一些基本信息,用于提供给Delphi引擎
- */
- class CBaseStruct
- {
- public:
- int ResID ; // 图片资源号
- int x ; // x坐标
- int y ; // y坐标
- int facing ; // 正面朝向(仅用于Actor)
- int state ; // frame状态,静止或者跑步或者战斗(仅用于Actor)
- const char* attack_str ; // 信息字符串指针,用于人物头部渐升的字符,比如“攻击升级”(仅用于Actor)
- } ;
- /*
- * 简单对象类,表示一些简单的物品图片对象,比如胡萝卜的图
- */
- class CSimpleObj : public CBaseStruct
- {
- public:
- /*
- * 构造函数
- * 参数:
- * res_info - 表示资源信息的结构体
- */
- CSimpleObj(GameRes* res_info)
- {
- (*LoadActor)( res_info->filename.c_str(), res_info->h_frame, res_info->v_frame, res_info->color_key, &ResID ) ;
- };
- /*
- * 析构函数(空)
- */
- ~CSimpleObj() {};
- };
- /*
- * 用来表示人物对象的类,包括npc和用户控制的人物
- */
- class CPlayer : public CBaseStruct
- {
- public :
- /*
- * 构造函数
- * 参数:
- * name - 人物名
- */
- CPlayer( const std::string& name ) ;
- /*
- * 析构函数
- */
- ~CPlayer() ;
- // 用来表示人物的形象状态
- enum RanderState {
- BIG, // 室内用BIG
- SMALL, // 室外用SMALL
- MID, // 大厅等地的中等大小
- };
- // npc对话的模式
- enum TalkState { RANDOM, // 随机选一个说话脚本执行
- CONDITIONAL, // 有条件的执行连续的几个脚本,脚本中控制条件
- CONTINUAL, // 顺序执行几个预定的说话脚本
- LOOP // 循环执行预定的说话脚本
- };
- /*
- * 返回Actor的属性结构体指针
- * 参数:
- * name - 属性名,比如“生命力”
- * 返回值:
- * 结构体指针,保证不为NULL,如果没有此属性,则抛出异常
- */
- SPropertyItem* Property(const std::string& name) ;
- /*
- * 返回Actor的技能结构体指针
- * 参数:
- * name - 技能名,比如“斗鸡刀法”
- * 返回值:
- * 结构体指针,保证不为NULL,如果没有此技能,则抛出异常,参考CPlayer::Property()
- */
- SPropertyItem* Skill( const std::string& name ) ;
- /*
- * Actor学会某项技能
- * 参数:
- * skill - 技能结构体的引用
- */
- void LearnSkill( const SPropertyItem& skill ) ;
- /*
- * 根据物品描述来寻找装备
- */
- SPropertyItem* FindTools(const std::string& description) ;
- /*
- * 根据装备描述来去除装备
- */
- void DelTools(const std::string& description) ;
- /*
- * 给人物添加装备
- * 参数:
- * tool - 装备(属性)结构体的引用
- */
- void AddTool( SPropertyItem& tool ) ;
- /*
- * 设置人物使用的图片资源
- * 参数:
- * s - 枚举型,参见CPlayer::RanderState
- */
- void SetActiveRes( RanderState s ) ;
- /*
- * 在队列末尾加入新的路点
- */
- void push_way_point(int x, int y) ;
- /*
- * 在队列头加入路点,改变现有路径
- */
- void insert_way_point(int x, int y) ;
- /*
- * 清空原有路点
- */
- void flush_all_way_point();
- /*
- * 设置路线是否循环
- * 参数:
- * is_loop - true表示路线循环,false表示仅一次路线
- */
- void set_task_loop(bool is_loop) ;
- /*
- * 状态自更新
- */
- bool AutoUpdate() ;
- /*
- * 进入自等待状态,傻乎乎的啥都不做
- * 参数:
- * time - 等待的事件,ms为单位
- */
- void EnterWaitingMode( unsigned int time ) ;
- /*
- DetectOtherActor 用来测试目标位置是否会遇到其他Actor
- Parameters
- dx - 从当前位置开始的X方向目标偏移量
- dy - 从当前位置开始的Y方向目标偏移量
- */
- bool DetectOtherActor(int dx, int dy) ;
- /*
- * 在npc内置对话库末尾加入新的脚本过程名
- * 参数:
- * ProcName - 脚本的过程名,不作存在性检查
- */
- void push_script( std::string& ProcName ) ;
- /*
- * 根据Actor当前状态,返回Actor的对话脚本
- * 返回值:
- * npc对话脚本的过程名
- */
- std::string& TalkScript() ;
- /*
- * 设置npc对话的模式
- * 参数:
- * state - 枚举型变量,表示不同的对话模式
- */
- void SetTalkState(TalkState state) ;
- /*
- * 根据脚本更改Talking状态
- * 参数:
- * ProcName - 下一次对话的过程名
- */
- void NextTalking( std::string& ProcName ) ;
- /*
- * 设置人物形象上的信息字符串,并在预定的帧数之后消失
- * 参数:
- * info - 信息字符串
- */
- void SetInfoText( const std::string& info ) ;
- /*
- * npc的简单智能,选择招数,对另一Actor进行攻击
- * 参数:
- * fighter_name - 对手的名字,通常是用户控制的人物
- */
- void NpcFight( std::string& fighter_name ) ;
- /*
- * 开始播放人物攻击动画帧,并在预定帧数之后停止
- */
- void PlayFightMovie() ;
- /*
- * Actor攻击另一个人物,执行相应的操作
- * 参数:
- * skill - 使用的技能,必须包涵在技能列表里,否则抛出异常
- * name - 受攻击的Actor的名字
- */
- void Attack( std::string& skill, std::string& name ) ;
- /*
- * Actor尝试逃跑,可能成功,可能不成功,执行相应操作
- * 参数:
- * name - npc对手的名字
- */
- void TryEscape( const std::string& name ) ;
- /*
- * 改变人物一个属性的值(饱和加减法,以及处理升级)
- * 参数:
- * property - 属性名
- * val - 变化的相对值
- */
- void ChangeProperty( const std::string& property, int val ) ;
- /*
- * 设Actor死掉
- */
- void Die() ;
- /*
- * 设置Actor是否处于自动攻击模式
- * val - true 表示自动攻击
- */
- void AutoAttack( bool val ) ;
- protected:
- /*
- * 类内常量
- */
- enum CONSTANTS { FRAMENUMFORTEXT = 30, FRAMENUMFORMOV = 10 };
- /*
- * 根据现在节点,计算到目的节点的平均偏移
- */
- double compute_dxy() ;
- /*
- * 测试是否能一步到达目的地
- */
- bool test_goal() ;
- /*
- * 动态计算地图上两点间距离
- */
- double ActiveLength(int x1, int y1, int x2, int y2) ;
- /*
- * 检查动画帧和信息字符串是否播放完毕,如完毕则关闭动画
- */
- void CheckMovFrameEnd() ;
- private:
- /* 当前选择的路线偏移x */
- int way_point_dx ;
- /* 当前选择的路线偏移y */
- int way_point_dy ;
-
- /* 是否正在执行预定路线 */
- bool is_doing_task ;
- /* 坚持路线的时间,frame为单位 */
- int consist_way_time ;
- /* 在等待状态下,需要等待的时间,ms为单位 */
- size_t waiting_time ;
- /* 在等待状态下,开始等待的时间,ms为单位 */
- size_t start_time ;
- /* 是否在等待状态 */
- bool waiting_mode ;
- /* 预定路线是否循环 */
- bool is_loop ;
- /* Actor是否会自动攻击 */
- bool is_auto_attack ;
- /* 人物对话的状态迁移 */
- TalkState m_talk_state ;
- /* 当前的对话指针 */
- size_t m_current_words ;
- /* 人物内置的对话脚本调用 */
- std::vector<std::string> m_talking_script ;
- /* 记录人物对象的信息字符 */
- std::string m_attack_str_buf ;
- /* 记录帧数,用于播放人物信息字符串 */
- size_t m_frame_count_for_info ;
- /* 记录帧数,用于播放人物动画 */
- size_t m_frame_count_for_movie ;
- public:
- /* 环境变量 */
- static CGameLogic* context ;
- /* 是否在场景中激活 */
- bool active_in_scene ;
- /* Actor 是否死掉(永远不出现在场景里) */
- bool is_dead ;
- /* 大图片的资源号,由Unicough引擎分配 */
- int Big_Res_id ;
- /* 中等大小图片的资源号,由Unicough引擎分配 */
- int Middle_Res_id ;
- /* 小图片的资源号,由Unicough引擎分配 */
- int Small_Res_id ;
- /* 人物头像的资源号 */
- int face_Res_id ;
- /* 出现在游戏中的人物名 */
- std::string name ;
- /* 人物的描述,用于查看生平简介 */
- std::string self_description ;
- std::vector<SPropertyItem> m_property ; // 属性list
- std::vector<SPropertyItem> m_tools ; // 装备list
- std::vector<SPropertyItem> m_skills ; // 技能list
- std::list< std::pair<int, int> > m_way_points ; // 走路点
- std::list< std::pair<int, int> > m_backup_way_points ; // 记录走过的路点
- };