管理模式+配置表(游戏管理、数据管理):代码篇

stdafx.h(存放全局性的定义)

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>

#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

#define KEY_DOWN(vk_code) (GetAsyncKeyState(vk_code)&0x8000?1:0)

enum  //枚举控制页面切换
{
	E_GAME_MENU,
	E_GAME_MAP,
	E_GAME_ROLESELECT
};

主函数:plane.cpp(程序入口)

// Plane.cpp : 定义控制台应用程序的入口点。
// 主函数的地方

#include "stdafx.h"
#include "GameMgr.h"
#include "ConfigMgr.h"
#include "time.h"

//数据管理者对象,数据一定要放在最前面
SConfigMgr g_ConfigMgr;
SGameMgr g_GameMgr;


int _tmain(int argc, _TCHAR* argv[])
{
	//游戏管理者初始化
	g_GameMgr.init();
	srand(time(nullptr));

	//刷新
	while (true)
	{
		//数据更新、渲染
		g_GameMgr.update();
		g_GameMgr.onRender();
		system("cls");
	}

	return 0;
}

DataStruct.h(配置表数据的声明)

#pragma once

//定义一个结构体设置四个节点的行列值(注意)
struct SVec2
{
	void set(int nInRow, int nInCol){
		nRow = nInRow;
		nCol = nInCol;
	}
	int nRow;
	int nCol;
	int nRowBk;
	int nColBk;
};

//定义地图数据的结构体
struct SLevelDt
{
	SLevelDt()
	{
		nID = 0;
		nMaxRow = 0;
		nMaxCol = 0;
		nBirthRow = 0;
		nBirthCol = 0;
	}
	int nID;
	string strName;
	int nMaxRow;
	int nMaxCol;
	int nBirthRow;
	int nBirthCol;
	int arrMap[20][15];
};

struct SLevelDtMgr
{
	//加载数据
	void LoadFile(string strPath);
	//通过id获取数据  传入id,返回一个结构体数据
	SLevelDt getDataById(int nId);
	//容器
	vector<SLevelDt> vecLevelDt;

	int getSize();
};

struct SRoleDt
{
	SRoleDt()
	{
		nId = 0;
	}
	int nId;
	int nAck;
	int nHp;
	int nMp;
	int nInterval;
	int nBulletId;
	string strName;
	string strPic;
};

struct SRoleDtMgr
{
	void LoadFile(string strPath);
	SRoleDt getDataById(int nId);
	vector<SRoleDt> vecRoleData;
	int getSize();
};

struct SBulletDt
{
	int nBulletId;
	int nBulletAck;
	string strBulletName;
	string strBulletPic;
};

struct SBulletDtMgr
{
	void LoadFile(string strPath);
	SBulletDt getDataById(int nId);
	vector<SBulletDt> vecBulletDt;
	int getSize();

};

struct SEnemyDt
{
	SEnemyDt()
	{
		nEnemyId = 0;
		nEnemyAck = 0;
		nEnemyHp = 0;
		nEnemyDef = 0;
		nBuletId = 0;
		nAckTime = 0;
		nMoveTime = 0;
	}
	int nEnemyId;
	int nEnemyAck;
	int nEnemyHp;
	int nEnemyDef;
	int nBuletId;
	int nAckTime;
	int nMoveTime;
	string strEnemyName;
	string strEnemyPic;
};

struct SEnemyDtMgr
{
	void LoadFile(string strPath);
	SEnemyDt getDataById(int nId);
	vector<SEnemyDt> vecEnemyDt;
	int getSize();
};

DataStruct.cpp(配置表数据的实现:获取配置表数据的过程)

#include "stdafx.h"
#include "DataStruct.h"

void SLevelDtMgr::LoadFile(string strPath)
{
	ifstream infile(strPath);
	int nCount = 0;
	infile >> nCount;

	for (int m = 0; m < nCount; m++)  //第一关、第二关...
	{
		SLevelDt data;
		infile >> data.strName >> data.nID >> data.nMaxRow >> data.nMaxCol >> data.nBirthRow >> data.nBirthCol;

		for (int i = 0; i < data.nMaxRow; i++)
		{
			for (int j = 0; j < data.nMaxCol; j++)
			{
				infile >> data.arrMap[i][j];
			}
		}
		vecLevelDt.push_back(data);  
	}
}

SLevelDt SLevelDtMgr::getDataById(int nId)
{
	for (int i = 0; i < vecLevelDt.size();i++)
	{
		if (vecLevelDt[i].nID = nId)
		{
			return vecLevelDt[i];
		}
	}
	SLevelDt data;
	return data;
}

int SLevelDtMgr::getSize()
{
	return vecLevelDt.size();
}

void SRoleDtMgr::LoadFile(string strPath)
{
	fstream infile(strPath);
	if (infile)
	{
		int nCount = 0;  
		infile >> nCount;  

		for (int i = 0; i < nCount; i++)
		{
			//定义一个临时结构体变量,存每一行的数据
			SRoleDt roleData;
			infile >> roleData.nId >> roleData.nAck >> roleData.nHp >> roleData.nMp 
				>> roleData.nInterval >> roleData.nBulletId >> roleData.strName >> roleData.strPic;

			vecRoleData.push_back(roleData);
		}
	}
	infile.close();
}

SRoleDt SRoleDtMgr::getDataById(int nId)
{
	for (int i = 0; i < vecRoleData.size(); i++)
	{
		if (vecRoleData[i].nId == nId)
		{
			return vecRoleData[i];
		}
	}
	SRoleDt data;
	return data;
}

int SRoleDtMgr::getSize()
{
	return vecRoleData.size();
}

void SBulletDtMgr::LoadFile(string strPath)
{
	ifstream infile(strPath);
	if (infile)
	{
		int nCount = 0;
		infile >> nCount;

		for (int i = 0; i < nCount; i++)
		{
			SBulletDt data;
			infile >> data.nBulletId >> data.nBulletAck >> data.strBulletName >> data.strBulletPic;
			vecBulletDt.push_back(data); //一次压入一行数据
		}
	}
	infile.close();
}

SBulletDt SBulletDtMgr::getDataById(int nId)
{
	for (int i = 0; i < vecBulletDt.size(); i++)
	{
		if (vecBulletDt[i].nBulletId == nId)
		{
			return vecBulletDt[i];
		}
	}
	SBulletDt data;
	return data;
}

int SBulletDtMgr::getSize()
{
	return vecBulletDt.size();
}


void SEnemyDtMgr::LoadFile(string strPath)
{
	ifstream infile(strPath);

	if (infile)
	{
		string str;
		getline(infile, str);

		int nCount = 0;
		infile >> nCount;

		for (int i = 0; i < nCount; i++)
		{
			SEnemyDt data;
			infile >> data.nEnemyId >> data.nEnemyAck >> data.nEnemyHp>> data.nEnemyDef >> data.nBuletId 
				>> data.nAckTime >> data.nMoveTime >> data.strEnemyName >> data.strEnemyPic;
			vecEnemyDt.push_back(data);
		}
	}
	infile.close();
}

SEnemyDt SEnemyDtMgr::getDataById(int nId)
{
	for (int i = 0; i < vecEnemyDt.size(); i++)
	{
		if (vecEnemyDt[i].nEnemyId == nId)
		{
			return vecEnemyDt[i];
		}
	}
	SEnemyDt data;
	return data;
}

int SEnemyDtMgr::getSize()
{
	return vecEnemyDt.size();
}

ConfigMgr.h(数据管理者)

#pragma once
#include "DataStruct.h"

struct SConfigMgr
{
	SConfigMgr();

	SLevelDtMgr levelDtMgr;
	SRoleDtMgr roleDtMgr;
	SBulletDtMgr bulletDtMgr;
	SEnemyDtMgr enemyDtMgr;

};

extern SConfigMgr g_ConfigMgr; //全局变量

ConfigMgr.cpp

#include "stdafx.h"
#include "ConfigMgr.h"

SConfigMgr::SConfigMgr()
{
	levelDtMgr.LoadFile("Configs/LevelDt.txt");
	roleDtMgr.LoadFile("Configs/RoleDt.txt");
	bulletDtMgr.LoadFile("Configs/BulletDt.txt");
	enemyDtMgr.LoadFile("Configs/EnemyDt.txt");
}

GameMgr.h(游戏管理者)

#pragma once
#include "Menu.h"
#include "GameMap.h"
#include "RoleSelect.h"

struct SGameMgr
{
	SGameMgr();

	//声明游戏管理者需要的函数
	void init();
	void update();
	void onRender();

	//切换界面
	int nState;

	SMenu menu;
	SGameMap gameMap;
	SRoleSelect roleSelect;
};

extern SGameMgr g_GameMgr;

GameMgr.cpp

#include "stdafx.h"
#include "GameMgr.h"

SGameMgr::SGameMgr()
{
}

void SGameMgr::init(){
	nState = E_GAME_MENU;
}


void SGameMgr::update()
{
	if (E_GAME_MENU == nState)
	{
		menu.update();
	}
	else if (E_GAME_MAP == nState)
	{
		gameMap.update();
	}
	else if (E_GAME_ROLESELECT == nState)
	{
		roleSelect.update();
	}
}


void SGameMgr::onRender()
{
	if (E_GAME_MENU == nState)
	{
		menu.onRender();
	}
	else if (E_GAME_MAP == nState)
	{
		gameMap.onRender();
	}
	else if (E_GAME_ROLESELECT == nState)
	{
		roleSelect.onRender();
	}
}

Menu.h(菜单界面)

#pragma once
#include "DataStruct.h"
struct SMenu
{
	SMenu();
	void update();
	void onRender();

	//菜单箭头
	int nMenuState;
	//设置默认角色
	SRoleDt curRoleDt;
};

Menu.cpp

#include "stdafx.h"
#include "Menu.h"
#include "GameMgr.h"
#include "ConfigMgr.h"

extern SGameMgr g_GameMgr;

enum
{
	E_MENU_START,
	E_MENU_ROLESELECT,
	E_MENU_SETTING,
	E_MENU_EXIT
};

SMenu::SMenu()
{
}

void SMenu::update()
{
	if (KEY_DOWN(VK_UP))
	{
		nMenuState--;
		if (nMenuState < E_MENU_START)
		{
			nMenuState = E_MENU_EXIT;
		}
		
	}
	else if (KEY_DOWN(VK_DOWN))
	{
		nMenuState++;
		if (nMenuState > E_MENU_EXIT)
		{
			nMenuState = E_MENU_START;
		}
	}
	else if (KEY_DOWN(VK_RETURN))
	{
		if (E_MENU_START == nMenuState)
		{
			g_GameMgr.nState = E_GAME_MAP;

			//设置默认角色为2001 200 300 100 5 3001 战士 战
			curRoleDt = g_ConfigMgr.roleDtMgr.getDataById(2001);
			//初始化结构体数据
			g_GameMgr.gameMap.sPlayer.init(curRoleDt);
		}
		else if (E_MENU_ROLESELECT == nMenuState)
		{
			g_GameMgr.nState = E_GAME_ROLESELECT;
		}
	}
}

void SMenu::onRender()
{
	cout << "■■■■■■■■■■■■■■■■■■■■" << endl;
	cout << "■■■■■■■■■■■■■■■■■■■■" << endl;
	if (E_MENU_START == nMenuState)
	{
		cout << "■■■        ->游戏开始          ■■■" << endl;
		cout << "■■■          角色选择          ■■■" << endl;
		cout << "■■■          游戏设置          ■■■" << endl;
		cout << "■■■          游戏退出          ■■■" << endl;
	}
	else if (E_MENU_ROLESELECT == nMenuState)
	{
		cout << "■■■          游戏开始          ■■■" << endl;
		cout << "■■■        ->角色选择          ■■■" << endl;
		cout << "■■■          游戏设置          ■■■" << endl;
		cout << "■■■          游戏退出          ■■■" << endl;
	}
	else if (E_MENU_SETTING == nMenuState)
	{
		cout << "■■■          游戏开始          ■■■" << endl;
		cout << "■■■          角色选择          ■■■" << endl;
		cout << "■■■        ->游戏设置          ■■■" << endl;
		cout << "■■■          游戏退出          ■■■" << endl;
	}
	else{
		cout << "■■■          游戏开始          ■■■" << endl;
		cout << "■■■          角色选择          ■■■" << endl;
		cout << "■■■          游戏设置          ■■■" << endl;
		cout << "■■■        ->游戏退出          ■■■" << endl;
	}
	cout << "■■■■■■■■■■■■■■■■■■■■" << endl;
	cout << "■■■■■■■■■■■■■■■■■■■■" << endl;
}

GameMap.h(地图界面)

#pragma once
#include "Player.h"
#include "BulletMgr.h"
#include "EnemyMgr.h"
struct SGameMap
{
	SGameMap();

	void touchWall(); //玩家碰墙函数
	void hitEnemy();  //子弹打中敌人
	void hitPlayer();
	void collicPlayer();  //敌机碰撞玩家

	void update();
	void onRender();

	SLevelDt curLevelDt;  //设置初始关卡

	SPlayer sPlayer;
	SBulletMgr sBulletMgr;
	SEnemyMgr sEnemyMgr;
};

GameMap.cpp

#include "stdafx.h"
#include "GameMgr.h"
#include "DataStruct.h"
#include "ConfigMgr.h"

SGameMap::SGameMap()
{
	//默认初始关卡为1001
	curLevelDt = g_ConfigMgr.levelDtMgr.getDataById(1001);
	//玩家默认初始位置
	sPlayer.setPosition(curLevelDt.nBirthRow, curLevelDt.nBirthCol);
}


//撞墙
void SGameMap::touchWall()
{
	for (int i = 0; i < 4; i++)
	{
		if (1 == curLevelDt.arrMap[sPlayer.arrPos[i].nRow][sPlayer.arrPos[i].nCol])  //注意层级
		{
			sPlayer.revert();		
		}
	}
}


void SGameMap::hitEnemy()
{
	//for (int k = 0; k < sBulletMgr.vecBullet.size(); k++)  //子弹层
	//{
	//	for (int i = 0; i < sEnemyMgr.vecEnemy.size(); i++) //敌机层
	//	{
	//		//判断子弹是否被移除
	//		bool bRemove = false;
	//		for (int j = 0; j < 4; j++) //节点层
	//		{
	//			int nEnemyRow = g_GameMgr.gameMap.sEnemyMgr.vecEnemy[i].arrPos[j].nRow;
	//			int nEnemyCol = g_GameMgr.gameMap.sEnemyMgr.vecEnemy[i].arrPos[j].nCol;

	//			//要记得对子弹进行判定,如果子弹是玩家的,打到敌人敌人才会消失
	//			if (sBulletMgr.vecBullet[k].isPlayer && sBulletMgr.vecBullet[k].nBulletRow == nEnemyRow && sBulletMgr.vecBullet[k].nBulletCol == nEnemyCol)
	//			{
	//				sBulletMgr.vecBullet.erase(sBulletMgr.vecBullet.begin() + k);
	//				sEnemyMgr.vecEnemy.erase(sEnemyMgr.vecEnemy.begin() + i);
	//				bRemove = true;
	//				break;
	//			}
	//		}
	//		if (bRemove)
	//		{
	//			break; 
	//		}
	//	}
	//}

	for (int i = sBulletMgr.vecBullet.size() - 1; i >= 0; i--)  //子弹层
	{
		for (int j = 0; j < sEnemyMgr.vecEnemy.size(); j++) //敌机层
		{
			//判断子弹的行列处是否存在敌机,若存在,返回敌机对象
			SEnemy enemy = sEnemyMgr.isEnemyExist(sBulletMgr.vecBullet[i].nBulletRow, sBulletMgr.vecBullet[i].nBulletCol);

			//如果敌机存在 且 子弹是玩家的
			if (enemy.nEnemyId >= 4001 && sBulletMgr.vecBullet[i].isPlayer)
			{
				//注意:这边不能拿enemy进行扣血处理(因为该enemy只是enemyMgr.VecData[j]的副本)
				//enemy.nEnemyHp -= sBulletMgr.vecBullet[i].nBulletAck;

				//将当前的第j个敌机进行扣血处理,血量= 血量 - 子弹攻击力
				sEnemyMgr.vecEnemy[j].nEnemyHp -= sBulletMgr.vecBullet[i].nBulletAck;
				if (sEnemyMgr.vecEnemy[j].nEnemyHp <= 0)  //血量为0
				{
					sEnemyMgr.vecEnemy.erase(sEnemyMgr.vecEnemy.begin() + j); //移除敌机
				}
				//移除子弹
				sBulletMgr.vecBullet.erase(sBulletMgr.vecBullet.begin() + i);
				break;
			}
		}
	}


}


void SGameMap::hitPlayer()
{
	for (int i = sBulletMgr.vecBullet.size() - 1; i >= 0; i--)
	{
		for (int j = 0; j < 4; j++)
		{
			int nBulletRow = sBulletMgr.vecBullet[i].nBulletRow; //子弹的行
			int nBulletCol = sBulletMgr.vecBullet[i].nBulletCol;

			int nPlayerRow = sPlayer.arrPos[j].nRow; //玩家的行
			int nPlayerCol = sPlayer.arrPos[j].nCol;

			if (nBulletRow == nPlayerRow && nBulletCol == nPlayerCol && sBulletMgr.vecBullet[i].isPlayer == false)
			{
				sPlayer.nHp -= sBulletMgr.vecBullet[i].nBulletAck;

				if (sPlayer.nHp <= 0)
				{
					g_GameMgr.nState = E_GAME_MENU;
				}
			}
		}
	}
}


void SGameMap::collicPlayer()
{
	for (int k = 0; k < 4; k++)
	{
		for (int i = 0; i < sEnemyMgr.vecEnemy.size(); i++)
		{
			for (int j = 0; j < 4; j++)
			{
				int nRow = g_GameMgr.gameMap.sEnemyMgr.vecEnemy[i].arrPos[j].nRow;
				int nCol = g_GameMgr.gameMap.sEnemyMgr.vecEnemy[i].arrPos[j].nCol;

				if (sPlayer.arrPos[k].nRow == nRow && sPlayer.arrPos[k].nCol == nCol)
				{
					cout << "游戏结束";
				}
			}
		}
	}
}

void SGameMap::update()
{
	if (KEY_DOWN(VK_SPACE))
	{
		g_GameMgr.nState = E_GAME_MENU;
	}

	sBulletMgr.update();
	sPlayer.update();
	sEnemyMgr.update();

	touchWall();
	hitEnemy();
	hitPlayer();
	collicPlayer();
}


void SGameMap::onRender()
{
	cout << curLevelDt.strName << endl;

	for (int i = 0; i < curLevelDt.nMaxRow; i++)
	{
		for (int j = 0; j < curLevelDt.nMaxCol; j++)
		{
			SBullet bullet = sBulletMgr.isBulletExist(i, j);
			SEnemy enemy = sEnemyMgr.isEnemyExist(i, j);

			if (1 == curLevelDt.arrMap[i][j])
			{
				cout << "■";
			}
			else if (sPlayer.isPlayerExist(i,j))
			{
				sPlayer.onRender();
			}
			else if (bullet.nBulletId >= 3001)
			{
				bullet.onRender();
			}
			else if (enemy.nEnemyId >= 4001)
			{
				enemy.onRender();
			}
			else{
				cout << "  ";
			}
		}
		cout << endl;
	}
}

RoleSelect.h(角色选择界面)

#pragma once
#include "stdafx.h"

struct SRoleSelect
{
	SRoleSelect();

	void update();
	void onRender();

	int nRoleState;
};

RoleSelect.cpp

#include "stdafx.h"
#include "RoleSelect.h"
#include "GameMgr.h"
#include "DataStruct.h"
#include "ConfigMgr.h"

SRoleSelect::SRoleSelect()
{
	nRoleState = 0;
}

void SRoleSelect::update()
{

	//键盘控制
	if (KEY_DOWN(VK_UP))
	{
		nRoleState--;
		if (nRoleState < 0)
		{
			nRoleState = g_ConfigMgr.roleDtMgr.getSize() - 1;  
			//vecData.size() - 1 代表最后一行
		}

	}
	else if (KEY_DOWN(VK_DOWN))
	{
		nRoleState++;
		if (nRoleState > g_ConfigMgr.roleDtMgr.getSize() -1)
		{
			nRoleState = 0;
		}
	}
	else if (KEY_DOWN(VK_RETURN))
	{
			g_GameMgr.nState = E_GAME_MAP;	
			SRoleDt data = g_ConfigMgr.roleDtMgr.getDataById(2001 + nRoleState);
			g_GameMgr.gameMap.sPlayer.init(data);
	}
}

void SRoleSelect::onRender()
{
	//遍历输出每一行的数据
	for (int i = 0; i < g_ConfigMgr.roleDtMgr.getSize(); i++)
	{
		if (nRoleState == i)
		{
			cout << "->";
		}
		else
		{
			cout << "  ";
		}

		SRoleDt roleData = g_ConfigMgr.roleDtMgr.getDataById(2001 + i);
		cout << roleData.nId << "\t" << roleData.nAck << "\t" << roleData.nHp << "\t" << roleData.nMp << "\t" <<roleData.nInterval<<"\t"
			<< roleData.nBulletId << "\t" << roleData.strName << "\t" << roleData.strPic;
		cout << endl;
		
	}
}

Player.h(玩家)

#pragma once
#include "RoleSelect.h"
#include "DataStruct.h"

struct SPlayer
{
	SPlayer();

	//把传入的两个值赋给四个节点(注意)
	void setPosition(int nInRow, int nInCol){
		arrPos[0].set(nInRow, nInCol);
		arrPos[1].set(nInRow, nInCol - 1);
		arrPos[2].set(nInRow, nInCol + 1);
		arrPos[3].set(nInRow - 1, nInCol);
	}

	void backup();
	void revert();

	void update();
	void onRender();

	//实例化四个节点
	SVec2 arrPos[4];

	int nTime; //玩家子弹帧数

	int nId;
	int nAck;
	int nHp;
	int nMp;
	int nInterval;
	int nBulletId;
	string strName;
	string strPic;

	void init(SRoleDt roleDt); 
	bool isPlayerExist(int nInRow, int nInCol);
};

Player.cpp

#include "stdafx.h"
#include "Player.h"
#include "GameMap.h"
#include "GameMgr.h"

SPlayer::SPlayer()
{
}

void SPlayer::backup()
{
	for (int i = 0; i < 4; i++)
	{
		arrPos[i].nRowBk = arrPos[i].nRow;
		arrPos[i].nColBk = arrPos[i].nCol;
	}
}

void SPlayer::revert()
{
	for (int i = 0; i < 4; i++)
	{
		arrPos[i].nRow = arrPos[i].nRowBk;
		arrPos[i].nCol = arrPos[i].nColBk;
	}
}

void SPlayer::update()
{
	//记得先备份坐标
	backup();

	if (KEY_DOWN(VK_LEFT))
	{
		for (int i = 0; i < 4; i++)
		{
			arrPos[i].nCol--;
		}
	}
	else if (KEY_DOWN(VK_RIGHT))
	{
		for (int i = 0; i < 4; i++)
		{
			arrPos[i].nCol++;
		}
	}

	//玩家子弹帧数随角色变化(注意:nInterval的数据来自配置表)
	nTime++;
	if (nTime >= nInterval)
	{
		nTime = 0; //归零

		//调用子弹生成函数
		g_GameMgr.gameMap.sBulletMgr.addBullet(nBulletId, arrPos[3].nRow, arrPos[3].nCol,true);
	}

}

void SPlayer::onRender()
{
	cout << strPic;
}


//用于接收角色选择后的角色数据
void SPlayer::init(SRoleDt roleDt)
{
	nId = roleDt.nId;
	nAck = roleDt.nAck;
	nHp = roleDt.nHp;
	nMp = roleDt.nMp;
	nInterval = roleDt.nInterval;
	nBulletId = roleDt.nBulletId;
	strName = roleDt.strName;
	strPic = roleDt.strPic;
}

bool SPlayer::isPlayerExist(int nInRow, int nInCol)
{
	for (int k = 0; k < 4; k++)
	{
		if (arrPos[k].nRow == nInRow && arrPos[k].nCol == nInCol)
		{
			return true;
			break;
		}
	}
	return false;
}

Bullet.h(子弹)

#pragma once
#include "DataStruct.h"

struct SBullet
{
	SBullet();

	int nBulletRow;
	int nBulletCol;	

	int nBulletId;
	int nBulletAck;
	string strBulletName;
	string strBulletPic;

	void init(SBulletDt data);  //数据传进来初始化
	void onRender();

	bool isPlayer;  //定义一个bool变量,用于标记子弹是玩家的还是敌机的
};


Bullet.cpp

#include "stdafx.h"
#include "Bullet.h"

SBullet::SBullet()
{
	nBulletId = 0;
	isPlayer = true; //默认为敌机子弹
}

void SBullet::init(SBulletDt bullet)
{
	nBulletId = bullet.nBulletId;
	nBulletAck = bullet.nBulletAck;
	strBulletName = bullet.strBulletName;
	strBulletPic = bullet.strBulletPic;
}

void SBullet::onRender()
{
	cout << strBulletPic;
}

BulletMgr.h(子弹管理者)

#pragma once
#include "Bullet.h"
#include "DataStruct.h"

struct SBulletMgr
{
	SBulletMgr();

	void addBullet(int nId, int nInRow, int nInCol, bool isPlayer);  //在添加子弹时给一个区别子弹的ID
	void removeBullet();
	void move();//子弹运动
	void update();

	SBullet isBulletExist(int nInRow, int nInCol); //渲染子弹

	vector<SBullet> vecBullet;
};

BulletMgr.cpp

#include "stdafx.h"
#include "BulletMgr.h"
#include "GameMgr.h"
#include "ConfigMgr.h"

SBulletMgr::SBulletMgr()
{
	
}

void SBulletMgr::addBullet(int nId,int nInRow, int nInCol,bool isInPlayer) //子弹的ID从玩家的配置表拿
{
	//根据子弹ID取子弹
	//因为子弹数据都在vecBulletDt中 
	SBullet bullet;
	//通过id拿到子弹数据
	SBulletDt bulletDt = g_ConfigMgr.bulletDtMgr.getDataById(nId);
	bullet.init(bulletDt);
	bullet.nBulletRow = nInRow;
	bullet.nBulletCol = nInCol;
	//设置子弹的标志位
	bullet.isPlayer = isInPlayer;
	vecBullet.push_back(bullet);
}
	

void SBulletMgr::removeBullet()
{
	//为了防止容器越界,从后往前遍历
	for (int i = vecBullet.size() - 1; i >= 0; i--)  
	{
		if (vecBullet[i].nBulletRow <= 0)  //子弹飞出地图
		{
			vecBullet.erase(vecBullet.begin() + i); 
		}
	}
}

//子弹管理者中的move管理子弹的运动方向
void SBulletMgr::move()
{
	for (int i = 0; i < vecBullet.size(); i++)
	{
		//根据标记位isBullet对容器中每个子弹的运动方向进行判定
		if (vecBullet[i].isPlayer)  //玩家的子弹
		{
			vecBullet[i].nBulletRow--;
		}
		else
		{
			vecBullet[i].nBulletRow++;
		}
	}	
}


void SBulletMgr::update()
{
	move();
	removeBullet();
}

SBullet SBulletMgr::isBulletExist(int nInRow, int nInCol)
{
	for (int i = 0; i < vecBullet.size(); i++)
	{
		if (vecBullet[i].nBulletRow == nInRow && vecBullet[i].nBulletCol == nInCol)
		{
			return vecBullet[i];
		}
	}
	SBullet bullet;
	return bullet;
}

Enemy.h(敌人)

#pragma once
#include "DataStruct.h"
struct SEnemy
{
	SEnemy();

	//实例化节点
	SVec2 arrPos[4];

	int nEnemyId;
	int nEnemyAck;
	int nEnemyHp;
	int nEnemyDef;
	int nBulletId;
	int nAckTime;//子弹发射帧数
	int nMoveTime;//敌机运动速度
	string strEnemyName;
	string strEnemyPic;

	int moveTime;
	int ackTime;

	void setPos(int nInRow, int nInCol);
	//初始化要传入一个结构体变量
	void init(SEnemyDt enemy);
	bool isExist(int nInRow,int nInCol);
	void onRender();
	void update();
	void move();//敌机运动
	void createBullet(); //子弹发射

	//bool isBullet();  应该定义在bullet.h中,因为这是子弹本身的
};

Enemy.cpp

#include "stdafx.h"
#include "Enemy.h"
#include "EnemyMgr.h"
#include "GameMgr.h"

SEnemy::SEnemy()
{
	moveTime = 0;
	ackTime = 0;
}

void SEnemy::setPos(int nInRow, int nInCol)
{
	arrPos[0].set(nInRow, nInCol);
	arrPos[1].set(nInRow, nInCol-1);
	arrPos[2].set(nInRow, nInCol+1);
	arrPos[3].set(nInRow+1, nInCol);
}

void SEnemy::init(SEnemyDt enemy)
{
	nEnemyId = enemy.nEnemyId;
	nEnemyAck = enemy.nEnemyAck;
	nEnemyHp = enemy.nEnemyHp;
	nEnemyDef = enemy.nEnemyDef;
	nBulletId = enemy.nBuletId;
	nAckTime = enemy.nAckTime;
	nMoveTime = enemy.nMoveTime;
	strEnemyName = enemy.strEnemyName;
	strEnemyPic = enemy.strEnemyPic;
}

bool SEnemy::isExist(int nInRow, int nInCol)
{
	for (int i = 0; i < 4; i++)
	{
		if (arrPos[i].nRow == nInRow && arrPos[i].nCol == nInCol )
		{
			return true;
		}
	}
	return false;
}

void SEnemy::onRender()
{
	cout << strEnemyPic;
}

void SEnemy::move()
{
	moveTime++;
	//根据帧数敌机运动
	if (moveTime >= nMoveTime)
	{
		moveTime = 0;
		for (int i = 0; i < 4; i++)
		{
			arrPos[i].nRow++;
		}
	}
}

void SEnemy::createBullet()
{
	ackTime++;
	//根据帧数创建敌机子弹
	if (ackTime > nAckTime)
	{
		ackTime = 0;
		g_GameMgr.gameMap.sBulletMgr.addBullet(nBulletId, arrPos[3].nRow, arrPos[3].nCol, false);
	}
}

void SEnemy::update()
{
	createBullet();
	move();
}

EnemyMgr.h(敌人管理者)

#pragma once
#include "Enemy.h"
struct SEnemyMgr
{
	SEnemyMgr();

	int nCreateTime;
	//容器(敌机),创建敌人,数据更新,敌人运动,帧数,判断是否存在
	vector<SEnemy> vecEnemy;

	void createEnemy();
	void update();
	SEnemy isEnemyExist(int nInRow,int nInCol);
};


EnemyMgr.cpp

#include "stdafx.h"
#include "EnemyMgr.h"
#include "ConfigMgr.h"
#include "DataStruct.h"

SEnemyMgr::SEnemyMgr()
{
	nCreateTime = 0;
}

void SEnemyMgr::createEnemy()
{
	//随机敌人的Id
	int nId = rand() % 4 + 4001;
	//根据Id拿敌人数据
	SEnemyDt enemyDt = g_ConfigMgr.enemyDtMgr.getDataById(nId);
	//实例化敌人
	SEnemy enemy;
	//对拿到的数据进行初始化
	enemy.init(enemyDt);
	//设置行列(随机列)
	enemy.setPos(1, rand() % 11 + 2);

	vecEnemy.push_back(enemy);
}

void SEnemyMgr::update()
{
	//每10帧创建一个敌机
	nCreateTime++;
	if (nCreateTime > 20 )
	{
		nCreateTime = 0;
		createEnemy();
	}

	//不同敌机速度不同
	for (int i = 0; i < vecEnemy.size(); i++)
	{
		vecEnemy[i].update();
	}
}

//判断某处是否存在飞机
SEnemy SEnemyMgr::isEnemyExist(int nInRow, int nInCol)
{
	for (int i = 0; i < vecEnemy.size();i++)
	{
		if (vecEnemy[i].isExist(nInRow,nInCol))
		{
			return vecEnemy[i];
		}
	}
	SEnemy enemy;
	return enemy;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值