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