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

📄 gscene_combat.cpp

📁 RPG游戏源代码,里面有RPG游戏的制作流程,供大家学习如何制作RPG游戏
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////
// GScene_Combat.cpp: implementation of the CGScene::RunCombat
// RPGDemo框架程序	场景类
// written by 萧萧落木(Roc.j.Wood)
// Modified by 
//////////////////////////////////////////////////////////////////////

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

#include <string>
using namespace std;

//////////////////////////////////////////////////////////////////////
// 战斗返回值
//////////////////////////////////////////////////////////////////////
#define COMBAT_SUCCEEDED	S_OK		//战斗胜利
#define COMBAT_FAILED		1			//战斗失败
#define COMBAT_ERROR		E_FAIL		//战斗程序发生错误

extern CRPGGame		theApp;			

HRESULT CGScene::RunCombat(LPCTSTR EnemyName)
{	
	//装入战斗场景图片
	static CGAFDDrawSurface COMBATScene;
	if(COMBATScene.GetSurface()==NULL)	//还没有分配Surface
	{
		HRESULT hr=COMBATScene.CreateByJPEG(&GAFDDraw,"GUI\\COMBAT.JPG");
		TESTHR_MSGRET(hr,"无法装入战斗场景图片");
	}

	LPCGRole pHero=GetRole(GetLeaderRoleIndex());	//主角
	LPCGRole pEnemy=GetRoleByName(EnemyName);		//敌人
	if(!pHero||!pEnemy) return COMBAT_ERROR;

	bool bMenuOpen = true;		//菜单是否被打开
	bool bObjMenuOpen = false;	//道具菜单是否被打开

	LONG sel = -1;
	//战斗主循环
	while(TRUE)
	{
		if(GAFAppProcessMessage()==FALSE) return E_FAIL;	//收到WM_QUIT消息

		//绘制战斗场景
		COMBATScene.BltFastTo(GAFDDraw.GetBack(),0,0,FALSE);

		//鼠标移动
		POINT MousePos;
		GAFDInput.GetSysMousePos(&MousePos.x, &MousePos.y);
		AdjustMousePosition(&MousePos);
		
		switch (sel)
		{
		case -1:
			{
				//绘制角色战斗分镜,最后一个BOOL参数指明是否自动换帧(动画效果)
				pEnemy->RenderCombatRole(100,200,MousePos,FALSE);
				pHero->RenderCombatRole(400,200,MousePos,FALSE);
				
				//这里还可以绘制Menu,比如攻击/法术/道具
				if (bMenuOpen)
				{
					m_gFightMenuManager.RenderFightMenu();
					m_gFightMenuManager.ProcessFightMenu();

					RenderLeaderStatus();		
					RenderBossStatus(pEnemy);

					sel = m_gFightMenuManager.GetSel();
					if (sel != -1)
					{
						bMenuOpen = FALSE;
					}
				}	
			}
			break;
		case 0:
			//绘制角色战斗分镜,最后一个BOOL参数指明是否自动换帧(动画效果)
			{
				//主动攻击
				for (long i=0; i<2; i++)
				{
					//绘制战斗场景
					COMBATScene.BltFastTo(GAFDDraw.GetBack(),0,0,FALSE);
					
					pEnemy->RenderCombatRole(100,200,MousePos,FALSE);
					pHero->RenderCombatRole(200-i*10,200,MousePos,TRUE);
					RenderLeaderStatus();					
					RenderBossStatus(pEnemy);
					GAFDDraw.Present(FALSE,TRUE);
					Sleep(200);
				}
				//绘制战斗场景
				pEnemy->DecHP((pHero->GetEAP()-pEnemy->GetEDP())*2);
				COMBATScene.BltFastTo(GAFDDraw.GetBack(),0,0,FALSE);		
				pEnemy->RenderCombatRole(100,200,MousePos,FALSE);
				pHero->RenderCombatRole(400,200,MousePos,TRUE);
				RenderLeaderStatus();				
				RenderBossStatus(pEnemy);
				GAFDDraw.Present(FALSE,TRUE);
				if (pEnemy->GetHP() == 0)
					return COMBAT_SUCCEEDED;				
				//延时
				Sleep(500);
				//敌人还击
				for (i=0; i<2; i++)
				{
					COMBATScene.BltFastTo(GAFDDraw.GetBack(),0,0,FALSE);
					pEnemy->RenderCombatRole(300+i*10,200,MousePos,TRUE);
					pHero->RenderCombatRole(400,200,MousePos,FALSE);
					RenderLeaderStatus();					
					RenderBossStatus(pEnemy);
					GAFDDraw.Present(FALSE,TRUE);
					Sleep(200);
				}
				pHero->DecHP((pEnemy->GetEAP()-pHero->GetEDP())*2);
				pEnemy->RenderCombatRole(100,200,MousePos,TRUE);
				sel = -1;
				bMenuOpen = TRUE;
				m_gFightMenuManager.ResetSel();
			}
			break;
		case 1:
			{
				for (long i=0; i<2; i++)
				{
					COMBATScene.BltFastTo(GAFDDraw.GetBack(),0,0,FALSE);
					pEnemy->RenderCombatRole(300+i*10,200,MousePos,TRUE);
					pHero->RenderCombatRole(400,200,MousePos,FALSE);
					RenderLeaderStatus();
					RenderBossStatus(pEnemy);
					GAFDDraw.Present(FALSE,TRUE);
					Sleep(200);
				}
				pHero->DecHP(pEnemy->GetEAP()-pHero->GetEDP());
				sel = -1;
				bMenuOpen = true;
				m_gFightMenuManager.ResetSel();
			}
			break;
		case 2:
			{
				pEnemy->RenderCombatRole(100,200,MousePos,FALSE);
				pHero->RenderCombatRole(400,200,MousePos,FALSE);
				RenderLeaderStatus();
				RenderBossStatus(pEnemy);
				
				m_gObjManager.RenderOBJList();
				HRESULT hr = m_gObjManager.ProcessOBJList();
				TESTHR_RET(hr);
				if(hr==S_OK) 	//道具使用完毕
				{
					for (long i=0; i<2; i++)
					{
						COMBATScene.BltFastTo(GAFDDraw.GetBack(),0,0,FALSE);
						pEnemy->RenderCombatRole(300+i*10,200,MousePos,TRUE);
						pHero->RenderCombatRole(400,200,MousePos,FALSE);
						RenderLeaderStatus();
						RenderBossStatus(pEnemy);
						GAFDDraw.Present(FALSE,TRUE);
						Sleep(200);
					}
					pHero->DecHP(pEnemy->GetEAP()-pHero->GetEDP());
					pEnemy->RenderCombatRole(100,200,MousePos,TRUE);
					sel = -1;
					bMenuOpen = true;
					m_gFightMenuManager.ResetSel();
				}
			}
			break;
		case 3:
			return COMBAT_FAILED;
		}

		//更新GAFDInput
		GAFDInput.Update();	
		
		//按下ESC战斗直接失败
		if(GAFDInput.GetKeyState(DIK_ESCAPE)==GAFDIKEY_RELEASE) return COMBAT_FAILED;

		//更新屏幕
		GAFDDraw.Present(FALSE,TRUE);

		if (pEnemy->GetHP() == 0)	return COMBAT_SUCCEEDED;
		if (pHero->GetHP() == 0)	return COMBAT_FAILED;
	}
	
	return S_OK;
}

HRESULT CGScene::RenderAttack(LPCGRole pHero, LPCGRole pEnemy, bool bHero/*=TRUE*/)
{
	POINT MousePos;
	MousePos.x = -1;
	MousePos.y = -1;
	
	while (1)
	{
		if (bHero)
		{
			//绘制角色战斗分镜,最后一个BOOL参数指明是否自动换帧(动画效果)
			pEnemy->RenderCombatRole(100,200,MousePos,FALSE);
			pHero->RenderCombatRole(130,200,MousePos,TRUE);		
		}
		else
		{
		}
		GAFDDraw.Present();
	}

	return S_OK;
}

⌨️ 快捷键说明

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