📄 main.cpp
字号:
#include "tool.h"
#include "UI.h"
#include "Player.h"
#include "MySocket.h"
#include "bullet.h"
//全局变量
HANDLE g_hOut;
CONSOLE_SCREEN_BUFFER_INFO csbi;
int g_iGameIndex;
CRITICAL_SECTION g_csBullet; //子弹模块临界区
CUI * g_pUI;
CPlayer * player1=NULL;
CPlayer * player2=NULL;
CMySocket * g_pSocket;
CBullet * g_pBullet;
void InitGame();
CPlayer * GetPlayer(char chType);
void CheckKey();
DWORD WINAPI BulletProc(LPVOID lpParameter);
int main()
{
InitGame(); //初始化游戏
while (true)
{
switch (g_iGameIndex)
{
case 18:
{
char sendBuf[2];
sendBuf[0]=CLIENT_LOGIN;
sendBuf[1]=0x00;
g_pSocket->SendtoEX(sendBuf);
g_iGameIndex=19;
g_pUI->AddInfo("系统:正在连接服务器... ");
}
break;
case 19:
{
char recvBuf[20];
SOCKADDR_IN addr;
if (g_pSocket->RecvfromEX(recvBuf , 20 , &addr))
{
switch (recvBuf[0])
{
case SRV_LOGINOK:
player1=new CPlayer(g_hOut , recvBuf[1]);
player1->Render();
Sleep(200);
g_pUI->AddInfo("系统:正在等待其它玩家... ");
g_pUI->TextBox(" 正在等待其它玩家... " );
break;
case SRV_USERNUM_MAX:
g_pUI->AddInfo("系统:服务器已满,稍侯自动重新连接!");
Sleep(5000);
g_iGameIndex=18;
break;
case SRV_WAITOK:
g_pUI->AddInfo("系统:其它玩家已登陆,游戏马上开始!");
if (player1->m_iType==PLAYER_DOWN)
{
player2=new CPlayer(g_hOut , PLAYER_UP);
}
else
{
player2=new CPlayer(g_hOut , PLAYER_DOWN);
}
g_pUI->ClearTextBox();
player2->Render();
g_iGameIndex=20;
//启动子弹更新线程
HANDLE hBulletThread;
hBulletThread=CreateThread(NULL,0,BulletProc,NULL,0,NULL);
CloseHandle(hBulletThread);
break;
}
}
else
{
}
if (player1!=NULL)
{
g_pUI->UpDate(player1->m_iHP , player1->m_iMP , 0 , 0);
}
else
{
g_pUI->UpDate(0,0,0,0);
}
}
break;
case 20:
{
char recvBuf[20];
SOCKADDR_IN addr;
if (g_pSocket->RecvfromEX(recvBuf , 20 , &addr))
{
switch (recvBuf[0])
{
case SRV_ACT:
switch (recvBuf[1])
{
case ACT_MOVEUP:
GetPlayer(recvBuf[2])->MoveUp();
break;
case ACT_MOVEDOWN:
GetPlayer(recvBuf[2])->MoveDown();
break;
case ACT_MOVELEFT:
GetPlayer(recvBuf[2])->MoveLeft();
break;
case ACT_MOVERIGHT:
GetPlayer(recvBuf[2])->MoveRight();
break;
case ACT_FIRE:
{
EnterCriticalSection(&g_csBullet);
char chTemp[4];
chTemp[0]=recvBuf[3];
chTemp[1]=recvBuf[4];
chTemp[2]=recvBuf[5];
chTemp[3]=recvBuf[6];
int iTemp=ByteArrayToInt(chTemp , 4);
g_pBullet->m_iID=iTemp; //为了子弹ID名和服务器相同
g_pBullet->Fire(*GetPlayer(recvBuf[2]));
LeaveCriticalSection(&g_csBullet);
}
break;
}
break;
case SRV_UPDATE:
{
switch (recvBuf[1])
{
case UPDATE_COLLISION:
if (recvBuf[2]==PLAYER_DOWN || recvBuf[2]==PLAYER_UP)
{
GetPlayer(recvBuf[2])->m_iHP--;
char chTemp[4];
chTemp[0]=recvBuf[3];
chTemp[1]=recvBuf[4];
chTemp[2]=recvBuf[5];
chTemp[3]=recvBuf[6];
int iTemp=ByteArrayToInt(chTemp , 4);
g_pBullet->DelBullet(iTemp);
}
else
{
}
break;
}
}
break;
}
}
//常用游戏更新区
CheckKey();
player1->Render();
player2->Render();
g_pUI->UpDate(GetPlayer(PLAYER_UP)->m_iHP , GetPlayer(PLAYER_UP)->m_iMP , GetPlayer(PLAYER_DOWN)->m_iHP , GetPlayer(PLAYER_DOWN)->m_iMP);
Sleep(20);
}
break;
}
}
DeleteCriticalSection(&g_csBullet);
return 0;
}
void InitGame()
{
//初始化控制台
g_hOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTitle("雷电Online v1.0");
GetConsoleScreenBufferInfo(g_hOut , &csbi);
COORD size = {80, 25};
SetConsoleScreenBufferSize(g_hOut,size); //设置缓冲区大小
CONSOLE_CURSOR_INFO cursor_info;
cursor_info.bVisible=false;//不显示光标
cursor_info.dwSize=20;//光标宽度
SetConsoleCursorInfo(g_hOut,&cursor_info);
//初始化对象
g_pUI=new CUI(g_hOut);
g_pSocket=new CMySocket();
g_pBullet=new CBullet(g_hOut);
g_iGameIndex=0;
InitializeCriticalSection(&g_csBullet); //初始化子弹模块临界区
g_pUI->startCG();
g_pUI->FirstRender();
g_pUI->AddInfo("系统:正在创建Socket...");
Sleep(200);
if (g_pSocket->InitSocket())
{
g_pUI->AddInfo("系统:Socket创建成功!");
}
else
{
g_pUI->AddInfo("系统:Socket创建失败,请关闭程序重新启动");
while (true)
{
Sleep(10000);
}
}
g_pSocket->SetSrvIP("121.28.236.200" , 7735);
g_pSocket->InitFdSocket();
Sleep(200);
g_iGameIndex=18;
}
CPlayer * GetPlayer(char chType)
{
if (player1->m_iType==chType)
{
return player1;
}
else
{
return player2;
}
}
void CheckKey()
{
char sendBuf[4];
sendBuf[0]=CLIENT_ACT;
sendBuf[3]=0x00;
if(GetAsyncKeyState(0x41)) //a
{
static int iMoveLeftTime=0;
iMoveLeftTime++;
if (iMoveLeftTime==1)
{
sendBuf[1]=ACT_MOVELEFT;
sendBuf[2]=player1->m_iType;
g_pSocket->SendtoEX(sendBuf);
}
if (iMoveLeftTime>=3)
{
iMoveLeftTime=0;
}
}
if (GetAsyncKeyState(0x44)) //d
{
static int iMoveRightTime=0;
iMoveRightTime++;
if (iMoveRightTime==1)
{
sendBuf[1]=ACT_MOVERIGHT;
sendBuf[2]=player1->m_iType;
g_pSocket->SendtoEX(sendBuf);
}
if (iMoveRightTime>=3)
{
iMoveRightTime=0;
}
}
if (GetAsyncKeyState(0x57)) //w
{
static int iMoveUpTime=0;
iMoveUpTime++;
if (iMoveUpTime==1)
{
sendBuf[1]=ACT_MOVEUP;
sendBuf[2]=player1->m_iType;
g_pSocket->SendtoEX(sendBuf);
}
if (iMoveUpTime>=3)
{
iMoveUpTime=0;
}
}
if (GetAsyncKeyState(0x53)) //s
{
static int iMoveDownTime=0;
iMoveDownTime++;
if (iMoveDownTime==1)
{
sendBuf[1]=ACT_MOVEDOWN;
sendBuf[2]=player1->m_iType;
g_pSocket->SendtoEX(sendBuf);
}
if (iMoveDownTime>=3)
{
iMoveDownTime=0;
}
}
if (GetAsyncKeyState(0x4A)) //j
{
static int iFireTime=0;
iFireTime++;
if (iFireTime==1)
{
sendBuf[1]=ACT_FIRE;
sendBuf[2]=player1->m_iType;
g_pSocket->SendtoEX(sendBuf);
}
if (iFireTime>=6)
{
iFireTime=0;
}
}
}
DWORD WINAPI BulletProc(LPVOID lpParameter)
{
while (true)
{
EnterCriticalSection(&g_csBullet);
g_pBullet->Render();
g_pBullet->UpData(CLIENT_ACT);
Sleep(120);
LeaveCriticalSection(&g_csBullet);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -