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

📄 main.cpp

📁 本人初学window网络编程时开发的第一款网络游戏
💻 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 + -