📄 gscene.h
字号:
//////////////////////////////////////////////////////////////////////
// GScene.h: interface for the CGScene class.
// RPGDemo框架程序 场景类
// written by 萧萧落木(Roc.j.Wood)
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_GSCENE_H__91974847_E910_4D44_A2F0_A6DE71B95E3A__INCLUDED_)
#define AFX_GSCENE_H__91974847_E910_4D44_A2F0_A6DE71B95E3A__INCLUDED_
#include "RPGGame.h"
#include "GRole.h"
#include "ObjectManager.h"
#include "FightMenuManager.h"
#define CG_NUM_MAXROLEINSCENE 64 //场景里最多精灵个数
#define CG_NUM_MAXEXITINSCENE 16 //场景里最多出口个数
#define CG_NUM_MAXOBJECTINSCENE 16 //场景里最多道具个数
typedef struct CGSceneExit //出口定义
{
RECT rt; //触发区域
WORD TX,TY; //对应目标地点
CHAR TargetScene[32]; //对应的目标场景
BOOL Enable;
}CGSceneExit,*LPCGSceneExit;
class CScript;
class fstream;
class CGSceneLayer
{
public:
CGSceneLayer() { RectCount=0; pRectArray=NULL; }
~CGSceneLayer() { ClearLayer(); }
HRESULT LoadLayer(::fstream &fs);
HRESULT RenderLayer(CGAFDDrawSurface &gDDSurface,LONG XOff,LONG YOff);
void ClearLayer() { RectCount=0;SAFE_DELETE_ARRAY(pRectArray); }
private:
DWORD RectCount;
RECT *pRectArray;
};
#define COMBAT_SUCCEEDED S_OK //战斗胜利
#define COMBAT_FAILED 1 //战斗失败
#define COMBAT_ERROR E_FAIL //战斗程序发生错误
class CGScene
{
friend class CScript;
public:
CGScene(CRPGGame *pGameApp);
virtual ~CGScene();
///////////////////////////// 场景类接口部分 /////////////////////////////
public:
HRESULT InitNewGame(); //创建新游戏场景
HRESULT LoadScene(LPCTSTR szFileName); //装载场景
HRESULT RenderScene(); //绘制场景
HRESULT ProcessScene(); //场景控制
HRESULT RunScript(LPCTSTR szScriptFileName); //运行脚本
HRESULT RunCombat(LPCTSTR EnemyName); //进入战斗
void FinalClearup(); //结束场景扫尾
public:
HRESULT RenderAttack(LPCGRole pHero, LPCGRole pEnemy, bool bHero=TRUE);
////////////////////////// 屏幕和地图坐标变换 ////////////////////////////
void MapToScreen(LONG &X,LONG &Y) const { X-=XPosition; Y-=YPosition; }
void ScreenToMap(LONG &X,LONG &Y) const { X+=XPosition; Y+=YPosition; }
void MapToCell(LONG &X,LONG &Y) const { X/=16; Y/=16; }
void SetScenePosition(int nx,int ny); //场景定位
void FocusSceneCenter(int cx,int cy); //以cx,cy为中心定位场景
BOOL CanWalk(LONG mx,LONG my,LPCGRole sender) const; //检测sender角色是否可以走到(mx,my)坐标
SHORT GetLevel(LONG mx,LONG my) const; //检测(mx,my)坐标的层次信息
////////////////////////// 读取场景宽度/高度 /////////////////////////////
LONG GetWidth() const { return (LONG)Width; }
LONG GetHeight() const { return (LONG)Height; }
////////////////////////// 获取和设置地图出口状态 ////////////////////////
void SetExitFlag(int idx,BOOL bEnable=TRUE);
BOOL GetExitFlag(int idx) const;
////////////////////////// 角色列表支持 //////////////////////////////////
//增加新的角色
SHORT AddNewRole(LPCTSTR szFileName,int rXM,int rYM,SHORT rDirection);
void RemoveRole(SHORT roleindex);
void ClearupROLEArray(BOOL bClearAllRole); //清除角色列表
//bClearAllRole为FALSE的时候不清除主角精灵
SHORT GetLeaderRoleIndex() const; //获取场景主控主角
SHORT GetRoleIndex(const LPCTSTR szName) const; //获取名称对应的角色的索引
inline LPCGRole GetRole(SHORT roleindex) const; //获取对应的角色对象
LPCGRole GetRoleByName(const LPCTSTR szName) { return GetRole(GetRoleIndex(szName)); } //获取对应的角色对象
////////////////////////// 脚本相关处理 //////////////////////////////////
HRESULT MsgBox(const LPCTSTR Captain, const LPCTSTR Msg); //显示对话框
//////////////////////////////////////////////////////////////////////////
protected:
void SortRoleList(); //角色列表排序
SHORT CheckEnterExit(); //检测是否到了出口
HRESULT LoadMAP(LPCTSTR szFileName); //装载场景图像
void RenderLeaderStatus(); //渲染主角状态
void RenderBossStatus(LPCGRole pBossRole); //渲染Boss的状态
private:
CRPGGame *m_pGameApp; //场景对应的主程序框架类实例
CGObjectManager m_gObjManager; //道具管理器
CGFightMenuManager m_gFightMenuManager; //战斗菜单管理
CGAFDDrawSurface m_gGraph;
CGSceneLayer m_gSceneLayers[256];
DWORD Width; //场景宽度
DWORD Height; //场景高度
DWORD HCells; //Width/16,水平格子数(方格大小16*16)
DWORD VCells; //Height/16,垂直格子数
int XPosition; //场景X卷动参数
int YPosition; //场景Y卷动参数
WORD *m_pMapInfo; //地图信息
DWORD ScreenWidth; //屏幕宽度
DWORD ScreenHeight; //屏幕高度
CHAR m_szName[16]; //场景名称
WORD ObjCount;
WORD ExitCount; //出口个数
CGSceneExit m_ExitArray[CG_NUM_MAXEXITINSCENE]; //出口列表
WORD RoleCount; //角色个数
LPCGRole m_RoleArray[CG_NUM_MAXROLEINSCENE]; //角色列表
};
typedef CGScene *LPCGSCENE;
//////////////////////////////////////////////////////////////////////
//CGScene的inline函数
//////////////////////////////////////////////////////////////////////
//设置地图出口状态
inline void CGScene::SetExitFlag(int idx,BOOL bEnable)
{
assert(idx>=0 && idx<ExitCount && ExitCount<=CG_NUM_MAXEXITINSCENE);
m_ExitArray[idx].Enable = bEnable;
}
//获取地图出口状态
inline BOOL CGScene::GetExitFlag(int idx) const
{
assert(idx>=0 && idx<ExitCount && ExitCount<=CG_NUM_MAXEXITINSCENE);
return m_ExitArray[idx].Enable;
}
//获取对应的角色对象
inline LPCGRole CGScene::GetRole(SHORT roleindex) const
{
if(roleindex>=0 && roleindex<RoleCount && RoleCount<=CG_NUM_MAXROLEINSCENE)
return m_RoleArray[roleindex];
return NULL;
}
inline void CGScene::RemoveRole(SHORT roleindex)
{
assert(roleindex>=0 && roleindex<RoleCount && RoleCount<=CG_NUM_MAXROLEINSCENE);
SAFEDELETE(m_RoleArray[roleindex]);
--RoleCount;
}
#endif // !defined(AFX_GSCENE_H__91974847_E910_4D44_A2F0_A6DE71B95E3A__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -