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

📄 fightinit.cpp

📁 圣剑二完整的游戏代码。附作者写的三篇文章。游戏的开发过程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//   ******************************
//   *      战斗系统类函数
//   *     创建于 5月29日
//   ******************************
//  ************************************
//  *     战斗系统的初始化函数文件 
//  *   创建于  8月10日  
//  ************************************

#include <stdio.h>
#include "..\gamelib\goldpoint2.h"
#include "..\interface\interface2.h"
#include "..\menu\menu_inc.h"
#include "..\main.h"
#include "..\map.h"
#include "..\script.h"
#include "..\menu\title.h"
#include "..\Cursor.h"
#include "Fight.h"

int CFight::m_nEnemyNum = 0;				// 敌人类型的数量
CFight::stEnemyList* CFight::m_listEnemy = NULL;	// 敌人名称列表

// 读入敌人列表
void CFight::LoadEnemyList(char* file, char* index)
{
	//初始化所有敌人列表框
	CIniSet Ini(file);
	m_nEnemyNum = Ini.GetContinueDataNum(index);
	if( m_nEnemyNum > 0  )
	{
		m_listEnemy = new stEnemyList[m_nEnemyNum];
		for(int i=0; i<m_nEnemyNum; i++)
		{
			char* str = Ini.ReadText("敌人列表", i);
			strcpy( m_listEnemy[i].strName, str );
			_FREE(str);
		}
	}
}

CFight::CFight()
{
	bRandomFight=true;

	CIniSet FightSystemInit("ini\\fight\\FightSystemInit.ini");

	//初始化主角和敌人数据
	FightRole[0].ready=1;				//没有进攻
	FightRole[0].status=0;				//状态正常
	FightRole[0].x=FightSystemInit.ReadInt("战斗初始化","Role1_x");		//站位	
	FightRole[0].y=FightSystemInit.ReadInt("战斗初始化","Role1_y");	
	FightRole[0].use=0;					//不使用
	FightRole[0].stop_temp=1;			//动作序列
	FightRole[0].surf=FightRole[0].header=NULL;		//头像

	FightRole[1].ready=1;
	FightRole[1].status=0;
	FightRole[1].x=FightSystemInit.ReadInt("战斗初始化","Role2_x");
	FightRole[1].y=FightSystemInit.ReadInt("战斗初始化","Role2_y");
	FightRole[1].use=0;
	FightRole[1].stop_temp=2;
	FightRole[1].surf=FightRole[1].header=NULL;

	FightRole[2].ready=1;
	FightRole[2].status=0;
	FightRole[2].x=FightSystemInit.ReadInt("战斗初始化","Role3_x");
	FightRole[2].y=FightSystemInit.ReadInt("战斗初始化","Role3_y");
	FightRole[2].use=0;
	FightRole[2].stop_temp=3;
	FightRole[2].surf=FightRole[2].header=NULL;

	EnemyRole[0].use=0;
	EnemyRole[0].ready=1;
	EnemyRole[0].status=0;
	EnemyRole[0].x=FightSystemInit.ReadInt("战斗初始化","Enemy1_x");
	EnemyRole[0].y=FightSystemInit.ReadInt("战斗初始化","Enemy1_y");
	EnemyRole[0].stop_temp=1;
	EnemyRole[0].surf=NULL;

	EnemyRole[1].use=0;
	EnemyRole[1].ready=1;
	EnemyRole[1].status=0;
	EnemyRole[1].x=FightSystemInit.ReadInt("战斗初始化","Enemy2_x");
	EnemyRole[1].y=FightSystemInit.ReadInt("战斗初始化","Enemy2_y");
	EnemyRole[1].stop_temp=2;
	EnemyRole[1].surf=NULL;

	EnemyRole[2].use=0;
	EnemyRole[2].ready=1;
	EnemyRole[2].status=0;
	EnemyRole[2].x=FightSystemInit.ReadInt("战斗初始化","Enemy3_x");
	EnemyRole[2].y=FightSystemInit.ReadInt("战斗初始化","Enemy3_y");
	EnemyRole[2].stop_temp=3;
	EnemyRole[2].surf=NULL;

	EnemyRole[3].use=0;
	EnemyRole[3].ready=1;
	EnemyRole[3].status=0;
	EnemyRole[3].x=FightSystemInit.ReadInt("战斗初始化","Enemy4_x");
	EnemyRole[3].y=FightSystemInit.ReadInt("战斗初始化","Enemy4_y");
	EnemyRole[3].stop_temp=1;
	EnemyRole[3].surf=NULL;

	//初始画指令
	Command[0].player=1;
	Command[1].player=1;
	Command[2].player=1;
	Command[0].kill_who=1;
	Command[1].kill_who=1;
	Command[2].kill_who=1;
	command_count=0;

	Enemy_Command[0].player=0;
	Enemy_Command[1].player=0;
	Enemy_Command[2].player=0;
	Enemy_Command[3].player=0;
	Enemy_Command[0].kill_who=1;
	Enemy_Command[1].kill_who=1;
	Enemy_Command[2].kill_who=1;
	Enemy_Command[3].kill_who=1;

	main_count=MAIN;		//初始主控制循环 
	nNonce = 0;				//要攻击的对象

	Role_Temp = NULL;

	m_nAttackCountMove = 0;
	m_nAttackCountLife = 0;
	m_nLifeupCountMove = 0;
	m_nLifeupCountLife = 0;

	m_bBoss = false;
	m_bHidden = false;
	m_nRoundCount = 1;
	m_nMagicCount = 1;
}

CFight::~CFight()
{
	_DELETE_ARRAY( m_listEnemy );
}

//初始化
void CFight::Init(void)
{
	CreateBitmap(status_pic, 0, 0, "pic\\fight\\status.bmp");//人物状态:血……
	DDSetColorKey(status_pic,RGB(255,0,255));

	//读入光标
	cursor_role.LoadAni("ini\\fight\\cursor.ini", "选人光标");
	cursor_enemy.LoadAni("ini\\fight\\cursor.ini", "扁人光标");

	//初始化按钮
	Button[0].LoadIni("ini\\fight\\button.ini", "重复");
	Button[1].LoadIni("ini\\fight\\button.ini", "攻击");
	Button[2].LoadIni("ini\\fight\\button.ini", "魔法");
	Button[3].LoadIni("ini\\fight\\button.ini", "道具");
	Button[4].LoadIni("ini\\fight\\button.ini", "逃跑");

	font.InitFont(16, "宋体");

	//音乐	
	FMusic.g_pMIDISeg=NULL;
	WCHAR* str = WChar("music\\fight.mid");
	FMusic.LoadMusic(str);
	_DELETE( str );

	//音效
	Sound_Click.LoadSoundFX(hWnd, "sound\\fight\\click.wav");
	Sound_High.LoadSoundFX(hWnd, "sound\\fight\\high.wav");
	
	//道具初始化
	m_fightgoods.LoadWindowIni("ini\\fight\\fightgoodslist.ini", "物品列表框");
	//魔法初始化
	m_fightmagic.LoadWindowIni("ini\\fight\\fightmagiclist.ini", "魔法列表框");
	//战斗字体初始化
	char *strTemp = GameIni.ReadText("配置文件","字体");
	FightFont.LoadFont(strTemp, "战斗字体");
	_FREE(strTemp);
}

//战斗结束的清理工作
void CFight::Clear(void)
{
	KillTimer(hWnd, 2);

	main_count=MAIN;
	command_count=0;
	enemy_count=0;
	temp_swap=0;
	kill_count=0;

	m_bBoss = false;
	m_bHidden = false;

	for(int i=0; i<3; i++)
	{
		FightRole[i].ready=1;
		FightRole[i].status=0;
		FightRole[i].use=0;
		FightRole[i].stop_temp=i+1;
		Command[i].player=1;
		_RELEASE( FightRole[i].surf );
		_RELEASE( FightRole[i].header );
	}

	for(i=0; i<4; i++)
	{
		EnemyRole[i].use=0;
		EnemyRole[i].ready=1;
		EnemyRole[i].status=0;
		EnemyRole[i].stop_temp=i+1;
		Enemy_Command[i].player=0;
		_RELEASE( EnemyRole[i].surf);
	}

	//释放背景图
	for(i=0; i<Number; i++)
	{
		_RELEASE( background[i] );
	}
	_RELEASE(background_build[0]);
	_DELETE(background_build);
	_DELETE( background );
}

// background:本战役的背景图片以及数据的数据文件名
// enemy_1~enemy_4是四个敌人的名字
// 如果enemy1~4的值为NULL则那个位置没有敌人
CFight::Start(char *bg_name,
			 stRolePropertiy * role_1,
			 stRolePropertiy * role_2,
			 stRolePropertiy * role_3,
			 char *enemy_1,
			 char *enemy_2,
			 char *enemy_3,
			 char *enemy_4)
{
	int ret=0;
	m_nRoundCount = 1;			//回合计数置1
	m_nMagicCount = 1;
	g_ePlayState=PS_FIGHT;		//进入战斗循环标志

	//战斗音乐
	Music.Pause();				//停止原背景音乐
	FMusic.Play();				//开始战斗音乐
	// 背景图片的设置与读取
	CIniSet FightBackGroundInit(bg_name);
	Number = FightBackGroundInit.ReadInt("背景数据","Number");

	background = new LPDIRECTDRAWSURFACE[Number];
	background_build = new LPDIRECTDRAWSURFACE[1];	// 战斗时的背景遮挡:前面的树木

	char* strTemp = FightBackGroundInit.ReadText("背景数据","Background_Name");
	CreateBitmap(background[Number-1], 0, 0, strTemp);
	_FREE(strTemp);

	CreateBitmap(background_build[0], 0, 0, "pic\\fight\\background_build.bmp");
	DDSetColorKey(background_build[0],RGB(255,0,255));

	// 角色的读取
	FightRoleInit.Open("ini\\fight\\FightRoleInit.ini");

	for(int i=2; i>=0; i--)
	if( i==0 && role_1 || i==1 && role_2 ||	i==2 && role_3 )
	{
		FightRole[i].bLive=true;
		command_count=i;				//初始化成排在最前面的主角
		switch( i )	
		{
		case 0: Hero[i]=role_1; break;	//保存人物属性
		case 1: Hero[i]=role_2; break;
		case 2: Hero[i]=role_3; break;
		}
		FightRole[i].use=1;				//使用这个角色
		FightRole[i].status=1;			

		strTemp = FightRoleInit.ReadText(Hero[i]->Fight_Ini_Name,"Header");//头像
		CreateBitmap(FightRole[i].header,0,0, strTemp);
		_FREE(strTemp);

		strTemp = FightRoleInit.ReadText(Hero[i]->Fight_Ini_Name,"Role_Pic_File");//人物进攻图片
		CreateBitmap(FightRole[i].surf,0,0, strTemp);
		_FREE(strTemp);

		strTemp = FightRoleInit.ReadText(Hero[i]->Fight_Ini_Name,"Move_Ini");
		Role_Move[i].Open(strTemp);//人物移动数据
		_FREE( strTemp );

		strTemp = FightRoleInit.ReadText(Hero[i]->Fight_Ini_Name,"Tool_Ini");
		Role_Tool[i].Open(strTemp);
		_FREE(strTemp);

		DDSetColorKey(FightRole[i].surf, ColorKey);
		
		//血槽—气槽的长度
		FightRole[i].BroodLong=Hero[i]->Hp * 100 / Hero[i]->MaxHp;
		FightRole[i].MagicLong=Hero[i]->Mp * 100 / Hero[i]->MaxMp;
		//静止的动作序列数据
		FightRole[i].Rstop[0].left=FightRoleInit.ReadInt(Hero[i]->Fight_Ini_Name,"1静止的位图_x");
		FightRole[i].Rstop[0].top=FightRoleInit.ReadInt(Hero[i]->Fight_Ini_Name,"1静止的位图_y");
		FightRole[i].Rstop[0].right=FightRoleInit.ReadInt(Hero[i]->Fight_Ini_Name,"1静止的位图_x1");

⌨️ 快捷键说明

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