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

📄 rpggame.cpp

📁 一个RPG游戏演示全部源代码。使用Visual C++ 6.0
💻 CPP
字号:
///////////////////////////////////////////////////////////////////////////////////////////
//	GAF-Game Application Framework
//  GAF游戏开发框架程序
//	
//  File			RPGGame.CPP
//  Comment			GAF游戏程式框架
//  Write			本程式是由GAF AppWizard(GB)创建
///////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "res\resource.h"

#include "RPGGame.h"
#include "GScene.h"

//////////////////////////////////////////////////////////////////////
// 唯一的全局GAFApp对象实例,整个程序的入口
//////////////////////////////////////////////////////////////////////
CRPGGame		theApp;			

//////////////////////////////////////////////////////////////////////
// GAF的全局DirectX成员变量
//////////////////////////////////////////////////////////////////////
CGAFDDraw		GAFDDraw;
CGAFDInput		GAFDInput;
CGAFDSound		GAFDSound;
CGAFDMusic		GAFDMusic;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRPGGame::CRPGGame()
{
	GAFGameStatus = GAF_GAMESTATUS_NONE;

}

CRPGGame::~CRPGGame()
{

}

//////////////////////////////////////////////////////////////////////
// 初始化游戏进程实例
//////////////////////////////////////////////////////////////////////
BOOL CRPGGame::InitInstance()
{
	BindWndIcon(IDI_GAFGAME);					//设置窗口图标
	BindWndWidth(640);	BindWndHeight(480);		//设置宽度高度
	BindWndClassName(IDS_STR_WNDCLASS);			//设置窗口类名
	BindWndTitle(IDS_STR_WNDTITLE);				//设置窗口标题
	BindWndStyle(WS_EX_APPWINDOW,WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU);	//设置窗口风格
	

	TESTBOOL_MSGRET(CGAFApp::InitInstance(),"GAF程式创建窗口出错,程式终止!");	//继承父类函数创建窗口
	TESTBOOL_MSGRET(InitDXMember(),"GAF程式初始化DX成员出错,程式终止!");		//初始化DirectX成员

	return TRUE;
}

//////////////////////////////////////////////////////////////////////
// 初始化DirectX成员变量
//////////////////////////////////////////////////////////////////////
BOOL CRPGGame::InitDXMember()
{
	try
	{
		//为了如果是Debug调试方便我们在Debug模式下使用窗口模式

#ifdef _DEBUG
		TESTHR_MSGTRW(GAFDDraw.CreateWindowMode(m_hWnd,640,480),"GAFDDraw创建窗口方式发生错误!");
#else
		TESTHR_MSGTRW(GAFDDraw.CreateFullScreen(m_hWnd,640,480),"GAFDDraw创建全屏幕方式发生错误!");
#endif


		TESTHR_MSGTRW(GAFDInput.InitDInput(m_hInstance,m_hWnd),"GAFDInput初始化发生错误!");
		GAFDInput.SetMouseLimit(0,0,640,480);
		GAFDInput.SetMouseAcceleration(TRUE);
			
		TESTHR_MSGTRW(GAFDSound.InitDSound(m_hWnd,FALSE),"GAFDSound初始化发生错误!");
		
		//TESTHR_MSGTRW(GAFDMusic.Init(m_hWnd,&GAFDSound),"GAFDMusic初始化发生错误!");
	}
	catch(...)
	{
		return FALSE;
	}
	
	return TRUE;
}

//////////////////////////////////////////////////////////////////////
// 释放游戏进程实例
//////////////////////////////////////////////////////////////////////
int CRPGGame::ExitInstance()
{
	// TODO: 请把释放程式各种资源的代码放在这里

	
	return 0;
}

//////////////////////////////////////////////////////////////////////
// 主动式游戏主循环
//////////////////////////////////////////////////////////////////////
int CRPGGame::Run()
{
	ShowCursor(TRUE);
	SetCursor(::LoadCursor(NULL,IDC_ARROW));

	while(GAFGameStatus!=GAF_GAMESTATUS_ENDING)
	{
		//检测到退出消息
		if(ProcessMessage()==FALSE) GAFGameStatus=GAF_GAMESTATUS_ENDING;

		switch(GAFGameStatus)
		{	
			case GAF_GAMESTATUS_NONE:		//由于我们的RPG演示不包含片头字幕等等
			case GAF_GAMESTATUS_START:		//所以我们直接进入标题画面
			case GAF_GAMESTATUS_LOGO:
				GAFGameStatus=GAF_GAMESTATUS_MAINTITLE;
				break;


			case GAF_GAMESTATUS_MAINTITLE:		//标题画面状态
				if(FAILED(ProcessMainTitle()))
					GAFGameStatus=GAF_GAMESTATUS_ENDING;
				break;


			case GAF_GAMESTATUS_INSCENE:		//游戏场景状态
				if(FAILED(ProcessScene()))
					GAFGameStatus=GAF_GAMESTATUS_ENDING;
				break;


			case GAF_GAMESTATUS_CREDIT:			//没有片尾工作组字幕
			case GAF_GAMESTATUS_ENDING:			//直接关闭窗口
				PostQuitMessage(0);
				GAFGameStatus=GAF_GAMESTATUS_ENDING;
				break;
			default:
				ALARMMSG("GAF程式检测到未知的游戏状态,程式终止!");
				PostQuitMessage(0);
				break;
		}
	}
	
	return 0;
}

//////////////////////////////////////////////////////////////////////
// 处理标题画面状态
//////////////////////////////////////////////////////////////////////
HRESULT CRPGGame::ProcessMainTitle()
{
	CGAFDDrawSurface gMainTitleSurface;

	//装入标题画面图片
	TESTHR_MSGRET(gMainTitleSurface.CreateByJPEG(&GAFDDraw,"GUI\\MainTitle.JPG",GAFMEM_VIDTHENSYS),
					"GAF程式处于标题画面状态,无法打开标题画面图片!");

	const RECT NewGameRect={0,90,180,260};
	const RECT ExitGameRect={485,85,630,260};
	
	while(TRUE)
	{
		if(GAFAppProcessMessage()==FALSE)
		{
			GAFGameStatus = GAF_GAMESTATUS_ENDING;
			return E_FAIL;
		}
		
		gMainTitleSurface.BltFastTo(GAFDDraw.GetBack(),0,0,FALSE);	//刷新画面
		GAFDDraw.Present(TRUE,TRUE);
		
		GAFDInput.Update();		//更新输入数据
		
		//按下鼠标左键
		if(GAFDInput.GetMouseKeyState(DIK_MOUSELEFT)==GAFDIKEY_RELEASE)
		{
			LONG lX,lY;
			GAFDInput.GetSysMousePos(&lX,&lY);	//读取鼠标位置
			POINT Pt; Pt.x=lX; Pt.y=lY;
			AdjustMousePosition(&Pt);
			if(PtInRect(&NewGameRect,Pt))		//点击NewGame进入场景状态
			{
				GAFGameStatus=GAF_GAMESTATUS_INSCENE;
				return S_OK;
			}

			if(PtInRect(&ExitGameRect,Pt))		//点击ExitGame退出
			{
				GAFGameStatus=GAF_GAMESTATUS_CREDIT;
				return S_OK;
			}
		}
	}
	
	return S_OK;
}

//////////////////////////////////////////////////////////////////////
// RPG游戏核心程式:处理场景状态
//////////////////////////////////////////////////////////////////////
HRESULT CRPGGame::ProcessScene()
{
	CGScene gScene(this);
	
	HRESULT hr=gScene.InitNewGame();
	TESTHR_MSGRET(hr,"场景引擎初始化新游戏失败,程式终止!");
		
	return gScene.ProcessScene();
}

void AdjustMousePosition(LPPOINT Pt)
{
	if(!GAFDDraw.isFullScreen())
		ScreenToClient(GAFGetMainWnd(),Pt);
}

void AdjustMousePosition(LONG *pX,LONG *pY)
{
	POINT point;
	point.x=*pX; point.y=*pY;
	AdjustMousePosition(&point);
	*pX=point.x; *pY=point.y;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -