📄 rpggame.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 + -