📄 main.cpp
字号:
#include "tool.h"
#include "Player.h"
#include "MySocket.h"
#include "bullet.h"
//全局变量
vector<CPlayer> vecPlayer;
CMySocket * g_pSocket;
CBullet * g_pBullet;
HANDLE g_hOut;
CRITICAL_SECTION g_csBullet; //子弹模块临界区
int g_iUserNum; //已经连接的用户总数
int GetPlayerIndex(char chType);
void InitServer();
void SendtoAllPlayer(char* sendBuf);
DWORD WINAPI BulletProc(LPVOID lpParameter);
int main()
{
InitServer(); //初始化
while (true)
{
Sleep(2);
char recvBuf[20];
SOCKADDR_IN addrClient;
if (g_pSocket->RecvfromEX(recvBuf , 20 , &addrClient))
{
switch (recvBuf[0])
{
case CLIENT_LOGIN:
cout<<"一个玩家请求登陆!"<<endl;
if (g_iUserNum>=2)
{
cout<<"由于服务器连接已满,玩家登陆的请求被拒绝!"<<endl;
//发送玩家连接已满的消息
char sendBuf[2];
sendBuf[0]=SRV_USERNUM_MAX;
sendBuf[1]=0x00;
g_pSocket->SendtoEX(addrClient , sendBuf);
}
else
{
if (g_iUserNum==1)
{
CPlayer player(PLAYER_UP , addrClient);
vecPlayer.push_back(player);
//给玩家发送LOGINOK
char sendBuf[2];
sendBuf[0]=SRV_LOGINOK;
sendBuf[1]=PLAYER_UP;
g_pSocket->SendtoEX(addrClient , sendBuf);
vecPlayer[1].m_iState=9;
//给所有玩家发送WAITOK 改变玩家状态
sendBuf[0]=SRV_WAITOK;
sendBuf[1]=0x00;
g_pSocket->SendtoEX(vecPlayer[0].m_addr , sendBuf);
g_pSocket->SendtoEX(vecPlayer[1].m_addr , sendBuf);
vecPlayer[0].m_iState=10;
vecPlayer[1].m_iState=10;
g_iUserNum++; //连接数加1
cout<<"已批准玩家登陆 , 当前人数已满,命令所有玩家开始游戏"<<endl;
//启动子弹更新线程
HANDLE hBulletThread;
hBulletThread=CreateThread(NULL,0,BulletProc,NULL,0,NULL);
CloseHandle(hBulletThread);
cout<<"子弹更新线程已启动!"<<endl;
}
else if (g_iUserNum==0)
{
CPlayer player(PLAYER_DOWN , addrClient);
vecPlayer.push_back(player);
//给玩家发送LOGINOK
char sendBuf[3];
sendBuf[0]=SRV_LOGINOK;
sendBuf[1]=PLAYER_DOWN;
sendBuf[2]=0x00;
g_pSocket->SendtoEX(addrClient , sendBuf);
vecPlayer[0].m_iState=9; //等待状态
g_iUserNum++;
cout<<"已批准玩家登陆,当前在线1人,无法开始游戏,命令客户端等待其它玩家"<<endl;
}
}
break;
case CLIENT_ACT:
switch (recvBuf[1])
{
case ACT_MOVEUP:
{
if (CheckLimit(vecPlayer[GetPlayerIndex(recvBuf[2])].newcoord , recvBuf[2] , recvBuf[1]))
{
cout<<"玩家向上移动的请求被拒绝! 原因:超出边界"<<endl;
}
else
{
vecPlayer[GetPlayerIndex(recvBuf[2])].MoveUp();
char sendBuf[4];
sendBuf[0]=SRV_ACT;
sendBuf[1]=ACT_MOVEUP;
sendBuf[2]=recvBuf[2];
sendBuf[3]=0x00;
for (int i=0 ; i<vecPlayer.size() ; i++)
{
g_pSocket->SendtoEX(vecPlayer[i].m_addr , sendBuf);
}
}
}
break;
case ACT_MOVEDOWN:
{
if (CheckLimit(vecPlayer[GetPlayerIndex(recvBuf[2])].newcoord , recvBuf[2] , recvBuf[1]))
{
cout<<"玩家向下移动的请求被拒绝! 原因:超出边界"<<endl;
}
else
{
vecPlayer[GetPlayerIndex(recvBuf[2])].MoveDown();
char sendBuf[4];
sendBuf[0]=SRV_ACT;
sendBuf[1]=ACT_MOVEDOWN;
sendBuf[2]=recvBuf[2];
sendBuf[3]=0x00;
for (int i=0 ; i<vecPlayer.size() ; i++)
{
g_pSocket->SendtoEX(vecPlayer[i].m_addr , sendBuf);
}
}
}
break;
case ACT_MOVELEFT:
{
if (CheckLimit(vecPlayer[GetPlayerIndex(recvBuf[2])].newcoord , recvBuf[2] , recvBuf[1]))
{
cout<<"玩家向左移动的请求被拒绝! 原因:超出边界"<<endl;
}
else
{
vecPlayer[GetPlayerIndex(recvBuf[2])].MoveLeft();
char sendBuf[4];
sendBuf[0]=SRV_ACT;
sendBuf[1]=ACT_MOVELEFT;
sendBuf[2]=recvBuf[2];
sendBuf[3]=0x00;
for (int i=0 ; i<vecPlayer.size() ; i++)
{
g_pSocket->SendtoEX(vecPlayer[i].m_addr , sendBuf);
}
}
}
break;
case ACT_MOVERIGHT:
{
if (CheckLimit(vecPlayer[GetPlayerIndex(recvBuf[2])].newcoord , recvBuf[2] , recvBuf[1]))
{
cout<<"玩家向右移动的请求被拒绝! 原因:超出边界"<<endl;
}
else
{
vecPlayer[GetPlayerIndex(recvBuf[2])].MoveRight();
char sendBuf[4];
sendBuf[0]=SRV_ACT;
sendBuf[1]=ACT_MOVERIGHT;
sendBuf[2]=recvBuf[2];
sendBuf[3]=0x00;
for (int i=0 ; i<vecPlayer.size() ; i++)
{
g_pSocket->SendtoEX(vecPlayer[i].m_addr , sendBuf);
}
}
}
break;
case ACT_FIRE:
{
EnterCriticalSection(&g_csBullet);
int iTemp=g_pBullet->Fire(vecPlayer[GetPlayerIndex(recvBuf[2])]);
char chTemp[4];
IntToByteArray(iTemp , chTemp , 4);
char sendBuf[8];
sendBuf[0]=SRV_ACT;
sendBuf[1]=ACT_FIRE;
sendBuf[2]=recvBuf[2];
sendBuf[3]=chTemp[0];
sendBuf[4]=chTemp[1];
sendBuf[5]=chTemp[2];
sendBuf[6]=chTemp[3];
sendBuf[7]=0x00;
SendtoAllPlayer(sendBuf);
LeaveCriticalSection(&g_csBullet);
}
break;
}
break;
default :
break;
}
}
else
{
}
}
DeleteCriticalSection(&g_csBullet);
return 0;
}
int GetPlayerIndex(char chType)
{
for (int i=0 ; i<vecPlayer.size() ; i++)
{
if (vecPlayer[i].m_iType==chType)
{
return i;
}
}
cout<<"查找玩家类型失败,没有此类型的玩家!"<<endl;
return -1;
}
void InitServer()
{
//初始化控制台
g_hOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTitle("雷电Online服务器端");
//初始化全局变量
g_iUserNum=0;
InitializeCriticalSection(&g_csBullet); //初始化子弹模块临界区
//初始化对象
g_pSocket=new CMySocket();
g_pBullet=new CBullet(g_hOut);
if (g_pSocket->InitSocket())
{
cout<<"Socket创建成功!"<<endl;
g_pSocket->SetSrvIP(7735);
g_pSocket->SetBind(BIND_SRV);
g_pSocket->InitFdSocket();
}
else
{
cout<<"Socket创建失败,请重启服务器端程序!"<<endl;
while (true)
{
Sleep(500000);
}
}
}
void SendtoAllPlayer(char* sendBuf)
{
for (int i=0 ; i<vecPlayer.size() ; i++)
{
g_pSocket->SendtoEX(vecPlayer[i].m_addr , sendBuf);
}
}
DWORD WINAPI BulletProc(LPVOID lpParameter)
{
while (true)
{
EnterCriticalSection(&g_csBullet);
g_pBullet->UpData(SRV_ACT);
//对玩家下发射的子弹进行处理
for (int i=0 ; i<g_pBullet->vecPlayerDownBullet.size() ; i++)
{
if (Collision(g_pBullet->vecPlayerDownBullet[i].newcoord , vecPlayer[GetPlayerIndex(PLAYER_UP)].newcoord , 1 , vecPlayer[GetPlayerIndex(PLAYER_UP)].m_iWidth , 1 , vecPlayer[GetPlayerIndex(PLAYER_UP)].m_iHeight))
{
//通知客户端进行操作
int iTemp=g_pBullet->vecPlayerDownBullet[i].id;
char chTemp[4];
IntToByteArray(iTemp , chTemp , 4);
char sendBuf[8];
sendBuf[0]=SRV_UPDATE;
sendBuf[1]=UPDATE_COLLISION;
sendBuf[2]=PLAYER_UP;
sendBuf[3]=chTemp[0];
sendBuf[4]=chTemp[1];
sendBuf[5]=chTemp[2];
sendBuf[6]=chTemp[3];
sendBuf[7]=0x00;
SendtoAllPlayer(sendBuf);
//减玩家上的血
vecPlayer[GetPlayerIndex(PLAYER_UP)].m_iHP--;
//删子弹
g_pBullet->vecPlayerDownBullet.erase(&g_pBullet->vecPlayerDownBullet[i]);
i--;
}
}
//对玩家上发射的子弹进行处理
for (int i=0 ; i<g_pBullet->vecPlayerUpBullet.size() ; i++)
{
if (Collision(g_pBullet->vecPlayerUpBullet[i].newcoord , vecPlayer[GetPlayerIndex(PLAYER_DOWN)].newcoord , 1 , vecPlayer[GetPlayerIndex(PLAYER_DOWN)].m_iWidth , 1 , vecPlayer[GetPlayerIndex(PLAYER_DOWN)].m_iHeight))
{
//通知客户端进行操作
int iTemp=g_pBullet->vecPlayerUpBullet[i].id;
char chTemp[4];
IntToByteArray(iTemp , chTemp , 4);
char sendBuf[8];
sendBuf[0]=SRV_UPDATE;
sendBuf[1]=UPDATE_COLLISION;
sendBuf[2]=PLAYER_DOWN;
sendBuf[3]=chTemp[0];
sendBuf[4]=chTemp[1];
sendBuf[5]=chTemp[2];
sendBuf[6]=chTemp[3];
sendBuf[7]=0x00;
SendtoAllPlayer(sendBuf);
//减玩家上的血
vecPlayer[GetPlayerIndex(PLAYER_DOWN)].m_iHP--;
//删子弹
g_pBullet->vecPlayerUpBullet.erase(&g_pBullet->vecPlayerUpBullet[i]);
i--;
}
}
LeaveCriticalSection(&g_csBullet);
Sleep(120);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -