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;
}