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

📄 flymultiplayer.cpp

📁 是3D游戏一书中所讲的游戏引擎fly3D 包括fly3D引擎的源码及应用此引擎开发出来的游戏实例 有fly3D引擎的教程,易于step by step跟学
💻 CPP
字号:
#include "../Fly3D.h"
#include "flyMultiplayer.h"

FLY_API GUID
FLYGUID = { /* e29ac960-09f8-11d2-9262-000021799871 */
    0xe29ac960,
    0x09f8,
    0x11d2,
    {0x92, 0x62, 0x00, 0x00, 0x21, 0x79, 0x98, 0x71}
  };

FLY_API BOOL FAR PASCAL MultiplayerProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
	static mp_games *g=0;
	switch (uiMsg)
	{
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDC_SEARCH:
			{
			char ip[256];
			GetDlgItemText(hWnd,IDC_IP,ip,255);
			SendDlgItemMessage(hWnd,IDC_GAMES,LB_RESETCONTENT,0,0);
			directx->init_multiplayer(ip);
			g=directx->enum_games(&FLYGUID);
			if (g)
				{
				int i,j;
				char str[256];
				for( i=0;i<g->num;i++ )
					{
					sprintf(str,"%s (%i)",g->name[i],g->num_players[i]);
					j=SendDlgItemMessage(hWnd,IDC_GAMES,LB_ADDSTRING,0,(DWORD)str);
					SendDlgItemMessage(hWnd,IDC_GAMES,LB_SETITEMDATA,j,(DWORD)i);
					}
				if (g->num)
					{
					SendDlgItemMessage(hWnd,IDC_GAMES,LB_SETCURSEL,0,0);
					EnableWindow(GetDlgItem(hWnd,IDOK),1);
					SetFocus(GetDlgItem(hWnd,IDOK));
					}
				else EnableWindow(GetDlgItem(hWnd,IDOK),0);
				}
			}
			break;
		case IDOK:
			{
			char playername[64];
			GetDlgItemText(hWnd,IDC_PLAYERNAME,playername,64);
			if (strlen(playername)==0)
				{
				MessageBox(hWnd,"Please enter a player name.","Fly3D",MB_OK);
				break;
				}
			int j=SendDlgItemMessage(hWnd,IDC_GAMES,LB_GETCURSEL,0,0);
			if (j==-1)
				{
				MessageBox(hWnd,"Please select a game to join.","Fly3D",MB_OK);
				break;
				}
			j=SendDlgItemMessage(hWnd,IDC_GAMES,LB_GETITEMDATA,j,0);
			j=directx->join_game(&g->guid[j],playername);
			EndDialog(hWnd,IDOK);
			}
			break;
		case IDCANCEL:
			directx->free_multiplayer();
			EndDialog(hWnd,IDCANCEL);
			break;
		}
		break;

    case WM_INITDIALOG:
		SetFocus(GetDlgItem(hWnd,IDC_PLAYERNAME));
		EnableWindow(GetDlgItem(hWnd,IDOK),0);
		directx->init_multiplayer();
		break;
	}
	return FALSE;
} 

void flyEngine::close_multiplayer()
{
	int i;
	for( i=1;i<directx->nplayers;i++ )
	{
		bsp_object *obj=(bsp_object *)directx->players[i].data;
		obj->life=-1;
	}
	directx->free_multiplayer();
}

int flyEngine::join_multiplayer()
{
	close_multiplayer();
	close_fly_file();
	if (IDOK==DialogBox(hFlyInst,MAKEINTRESOURCE(IDD_MULTIPLAYER),hFlyWnd,(DLGPROC)MultiplayerProc))
	{
		int maxtime=5000;

		while(maxtime>0)
		{
		maxtime-=500;
		Sleep(500);
		check_multiplayer();
		if (flyfile[0]!=0) break;
		}
		if (flyfile[0]==0)
			close_multiplayer();
		directx->players[0].data=player;
	}
	return 0;
}

void flyEngine::check_multiplayer()
{
	int i,j,num,from;
	mp_msg *msg;
	DWORD size;

	num=directx->get_num_messages();
	for( i=0;i<num;i++ )
	{
		size=500;
		msg=directx->get_message(&size);
		if (msg)
		{
		for( from=0;from<directx->nplayers;from++ )
			if (directx->players[from].dpid==msg->from)
				break;
		if (from==directx->nplayers)
			from=-1;
		switch(msg->type)
			{
			case DPSYS_CREATEPLAYERORGROUP:
				{
					DPMSG_CREATEPLAYERORGROUP *info=(DPMSG_CREATEPLAYERORGROUP *)&msg->type;

					mp_msg msgflyfile;
					strcpy(msgflyfile.data,flyfile);
					msgflyfile.type=FLYMP_MSG_FLYFILE;
					msgflyfile.from=DPID_SERVERPLAYER;
					directx->send_message(&msgflyfile,strlen(flyfilename)+9,info->dpId);
					
					player_data pd;
					pd.type=FLYMP_MSG_JOIN;
					pd.dpid=info->dpId;
					strcpy(pd.name,info->dpnName.lpszShortNameA);
					dll.send_message(FLYM_MPMESSAGE,-1,&pd);

					directx->players[directx->nplayers-1].type=FLYMP_MSG_JOIN;
					for( i=1;i<directx->nplayers-1;i++ )
						{
						directx->players[i].type=FLYMP_MSG_JOIN;
						directx->send_message((mp_msg *)&directx->players[i],FLYMP_PLAYERDATASIZE,info->dpId);
						directx->send_message((mp_msg *)&directx->players[directx->nplayers-1],FLYMP_PLAYERDATASIZE,directx->players[i].dpid);
						}
				}
				break;
			case DPSYS_DESTROYPLAYERORGROUP:
				{
					DPMSG_DESTROYPLAYERORGROUP *info=(DPMSG_DESTROYPLAYERORGROUP *)&msg->type;
					for( j=0;j<directx->nplayers;j++ )
						if (directx->players[j].dpid==info->dpId)
							break;
					if (j<directx->nplayers)
						{
						directx->players[j].type=FLYMP_MSG_QUIT;
						directx->send_message((mp_msg *)&directx->players[j],FLYMP_PLAYERDATASIZE);
						dll.send_message(FLYM_MPMESSAGE,j,&directx->players[j]);
						}
				}
				break;
			case DPSYS_SESSIONLOST:
				close_multiplayer();
				return;
			case FLYMP_MSG_FLYFILE:
				open_fly_file(msg->data);
				break;
			default:
				dll.send_message(FLYM_MPMESSAGE,from,msg);
				if (directx->mpmode==FLYMP_SERVER)
					directx->send_message(msg,size);
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -