📄 cbattle.h
字号:
//战斗类
//创建于:2003/6/17 by Kylinx
//作者:吴振华(kylinx)(中国科大01级11系)
//E-mail:game-diy@163.com
//最后修改于2003/7/28 by Kylinx
#ifndef LOA_BATTLE_H_
#define LOA_BATTLE_H_
#include<windows.h>
#include"CRender.h"
#include"CDataBase.h"
#include"CGoods.h"
#include"CMagic.h"
#include"CEffect.h"
#include"CGraph.h"
#include"dxlib\\ddutil.h"
#include"dxlib\\dsutil.h"
#define LOA_MAX_BATTLE_ENEMY 3 //最多3个Enemy
#define LOA_CMD_NORMAL_ATTACK 0 //角色指令——普通攻击
#define LOA_CMD_ATTACK_2 1 //角色指令——怒气攻击(2倍攻击力)
#define LOA_CMD_DEFEND 10 //角色指令——防御
#define LOA_CMD_MAGIC 100 //角色指令——魔法
#define LOA_CMD_USE_GOOD 1000 //角色指令——使用物品
#define LOA_CMD_ESCAPE 10000 //角色指令——逃跑
#define LOA_BATTLE_STATE_WAIT 0
#define LOA_BATTLE_STATE_ATTACK 1
#define LOA_BATTLE_STATE_BE_ATTACK 2
#define LOA_BATTLE_STATE_DEFEND 3
#define LOA_BATTLE_STATE_DEAD 4
struct STRoleCmd
{
int iCmd; //什么指令
int iCmdParam; //指令参数
BOOL bToPlayer; //此指令是否针对玩家
int nObject; //目标是谁,-1表示全体
};
class CIcon;
class CBattle;
class CRole;
class CFont;
class CRenderBattleMenu;
struct STBattleRoleAni
{
CSurface*pSurface;
int nCurrentFrame;
int nFrames;
DWORD dwOldTime;
DWORD dwDelay;
int*aXOffsite;
int*aYOffsite;
RECT*aRect;
STEffect*pEffect;
int xEffectShow;
int yEffectShow;
int nKeyFrame;
int Height;
CSound*pSound;
};
struct STBattleRole //战斗中的角色属性结构
{
int nCurrentState;
CSurface*pSurfMain;
CSound*pSoundAttack;
CSound*pSoundDead;
CSound*pSoundBeAttack;
CSound*pSoundDefend;
BOOL bShow;
int Pos;
int ShowPosX; //角色在战场中角色的x位置
int ShowPosY; //角色在战场中角色的y位置
int CurPosX;
int CurPosY;
STBattleRoleAni*pStayAni; //角色等待的动画
STBattleRoleAni*pAttackAni; //角色攻击的动画
STBattleRoleAni*pDefendAni; //角色防御的动画
STBattleRoleAni*pBeAttackedAni; //角色被攻击的动画效果
STBattleRoleAni*pDeadAni; //死亡的动画效果
// STBattleRoleAni*pWinAni; //战斗胜利后的动画效果(相对于玩家)
STRoleCmd m_RoleCmd;
CRole*pRole;
STBattleRole()
{
pSurfMain=NULL;
pSoundAttack=NULL;
pSoundDead=NULL;
pSoundBeAttack=NULL;
pSoundDefend=NULL;
pStayAni=NULL;
pDeadAni=NULL;
pAttackAni=NULL;
pDefendAni=NULL;
pBeAttackedAni=NULL;
pRole=NULL;
nCurrentState=LOA_BATTLE_STATE_WAIT;
}
~STBattleRole();
};
class CRenderBattleRole:public CRenderTask
{
STBattleRole *m_pEnemy[LOA_MAX_BATTLE_ENEMY];
STBattleRole *m_pPlayer;
CGame *m_pGame;
CBattle *m_pBattle;
int m_nPosY[LOA_MAX_BATTLE_ENEMY];
void RenderRole(STBattleRole*pRole);
public:
CRenderBattleRole(){}
~CRenderBattleRole(){Release();}
BOOL InitRender(CGame*pGame,CBattle*pBattle,STBattleRole*pPlayer,STBattleRole*pEnemy[],int nPos[]);
protected:
virtual void LOA_RENDER_API Render(); //渲染
virtual BOOL LOA_RENDER_API IsRenderComplete(); //是否渲染结束
virtual void LOA_RENDER_API Release(); //释放派生类的资源
};
class CRenderBattleText:public CRenderTask
{
CGame *m_pGame;
int m_nShowTime;
int m_nSpeed;
DWORD m_dwOldTime;
char *m_szStr;
CFont *m_pFont;
int m_x;
int m_y;
DWORD m_dwColor;
public:
CRenderBattleText(){}
~CRenderBattleText(){Release();}
BOOL InitRender(CGame*pGame,int x,int y,DWORD dwColor,int speed,int showtime,char*txt,...);
protected:
virtual void LOA_RENDER_API Render(); //渲染
virtual BOOL LOA_RENDER_API IsRenderComplete(); //是否渲染结束
virtual void LOA_RENDER_API Release(); //释放派生类的资源
};
class CGame;
class CRenderBattleRoleState;
class CBattle
{
int bNeedBattleWin; //是否需要玩家必须在本次战斗中胜利
BOOL m_bIsBattle;
BOOL m_bFightBoss;
STBattleRole *m_pEnemy[LOA_MAX_BATTLE_ENEMY]; //敌人,最多3个,如果为NULL则代表没有敌人
STBattleRole *m_pPlayer; //单主角
CGame*m_pGame;
CIcon*m_pRenderIcon;
CRender*m_pRender;
CRenderMap*m_pRenderBattleMap;
CRenderBattleMenu*m_pBattleMenu;
CRenderBattleRole*m_pRenderBattleRole;
CRenderBattleRoleState*m_pRenderRoleState;
CMap*m_pBattleMap;
int m_nPosY[LOA_MAX_BATTLE_ENEMY];
static CLog m_sLog; //战斗的错误日志,由于整个游戏战斗就是用一个日志,所以用static声明
private:
inline BOOL IsBattle() const {return m_bIsBattle;}
BOOL CheckBattleWin(); //检查战斗是否胜利
BOOL CheckBattleLost(); //检查战斗是否失败
int EnemyTurn(); //敌人攻击回合
int PlayerTurn(); //玩家攻击回合
int GameOver();
void EnemyAI(int index); //敌人的AI
void EndBattle();
BOOL DeleteEnemy(STBattleRole**pRole); //删除敌人
BOOL LoadRoleAni(char*szFile,char*szSegment,CSurface*pSurfDefault,CSound*pSoundDefault,STBattleRoleAni*pRoleAni);
BOOL LoadBattleRoleFromFile(char*szFile,STBattleRole*pRole);
int BattleLoop();
void ShowBattleRoleAni(STBattleRole*pRole,STBattleRoleAni*pRoleAni);
void ShowBattleRole();
int SelectAttack();
public:
CRender*GetRender(){return m_pRender;}
BOOL InitBattle(CGame*pGame,
char*szBattleMap,
char*szBattleMusic,
CRole*pPlayer, //玩家的数据
CRole*pEnemy1, //第一个敌人数据(若为NULL表示这个位置没有敌人)
char*szBattleFile1,
int posy1,
CRole*pEnemy2, //第二个敌人数据(若为NULL表示这个位置没有敌人)
char*szBattleFile2,
int posy2,
CRole*pEnemy3, //第三个敌人数据(若为NULL表示这个位置没有敌人)
char*szBattleFile3,
int posy3,
BOOL bFightBoss,
BOOL bNeedWin); //是否必须胜利
void ExecuteCommand(STBattleRole*pRole,STRoleCmd cmd); //执行指令
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -