⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gscene.h

📁 RPG游戏源代码,里面有RPG游戏的制作流程,供大家学习如何制作RPG游戏
💻 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 + -