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

📄 cbattle.h

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 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 + -