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

📄 network.cpp

📁 赤壁之战的游戏源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    }

	OutputDebugString( "Step 9: CreatePlayer\n" );
    if ((hr = DP_lpIDC->CreatePlayer(//DP_lpIDC, 
								  &DP_dcoID, DP_NickName,
								  "CB_Player", &DP_dphEvent)) != DP_OK)
    {
        DP_lpIDC->Close();
        DP_lpIDC->Release();
        DP_lpIDC = NULL;
        return(FALSE);
    }
    
    return(TRUE);

}*/


//此模块是建立Session
int	DP_CreateSession( void )
{
	DPSESSIONDESC dpDesc; 
	HRESULT hr;


	if( DP_FullName==NULL )
		{
			#ifdef	DEBUG
			MessageBox(DP_hWndMain,"The Session Name is empty!"," Error",MB_OK);
			#endif
			return ( DP_SESSION_NAME_EMPTY );
		}
	if( DP_NickName==NULL )
		{
			#ifdef	DEBUG
			MessageBox(DP_hWndMain,"The Friendly Name is empty!"," Error",MB_OK);
			#endif
			return ( DP_FRIENDLY_NAME_EMPTY );
		}
	memset(&dpDesc, 0x00, sizeof(DPSESSIONDESC));
	dpDesc.dwSize = sizeof(dpDesc);
	dpDesc.dwMaxPlayers = MAX_PLAYERS;
	dpDesc.dwFlags = DPOPEN_CREATESESSION;
	dpDesc.guidSession = DP_pGuid;
	strcpy( dpDesc.szSessionName, DP_FullName);
    
//	OutputDebugString( "Step 4: Create, Open\n" );
	//用于创建一个Session,只需用Open函数
	//将用于描述Session的结构的dwFlags设为DPOPEN_CREATESESSION
	hr = DP_lpIDC->Open(//DP_lpIDC,
					 &dpDesc);
	if (hr!= DP_OK)
		{
			DP_lpIDC->Release();
	        DP_lpIDC = NULL;
			#ifdef	DEBUG
			MessageBox(DP_hWndMain,"Create Game Error!"," Error",MB_OK);
			#endif
			switch ( hr )
				{
					case	DPERR_INVALIDPARAMS:	
							return( DP_ERROR_INVALID_PARAMS );
							break;
					case	DPERR_GENERIC:
							return( DP_ERROR_GENERIC );
							break;
					case	DPERR_UNAVAILABLE:
							return( DP_ERROR_UNAVAILABLE );
							break;
					case	DPERR_UNSUPPORTED:
							return( DP_ERROR_UNSUPPORTED );
							break;
					case	DPERR_USERCANCEL:
							return( DP_ERROR_USER_CANCEL );
							break;
					case	DPERR_ACTIVEPLAYERS:
							return( DP_ERROR_ACTIVE_PLAYERS );
							break;
					case	DPERR_INVALIDOBJECT:
							return( DP_ERROR_INVALID_OBJECT );
							break;
				}


		    return( DP_ERROR_CREATE_SESSION );
		}

	//创建一个Player,其中的DP_NickName是玩家给自己起的名字
	if ((hr = DP_lpIDC->CreatePlayer(//DP_lpIDC, 
								  &DP_dcoID, DP_NickName,
								  "CB_Player", &DP_dphEvent)) != DP_OK)
		{
			DP_lpIDC->Close();
	        DP_lpIDC->Release();
		    DP_lpIDC = NULL;
			switch( hr )
				{
					case	DPERR_CANTCREATEPLAYER:
							return( DP_ERROR_NOT_CREATE_PLAYER );
							break;
					case	DPERR_NOCONNECTION:
							return( DP_ERROR_NOT_CONNECT );
							break;
					case	DPERR_CANTADDPLAYER:
							return( DP_NOT_ADD_PLAYERS );
							break;
					case	DPERR_INVALIDPARAMS:
							return( DP_ERROR_INVALID_PARAMS );
							break;
					case	DPERR_GENERIC:
							return( DP_ERROR_GENERIC );
							break;
					case	DPERR_INVALIDOBJECT:
							return( DP_ERROR_INVALID_OBJECT );
							break;
				}

			return( DP_ERROR_CREATE_PLAYER );
		}
	DP_IsHost = DP_HOST;
	DP_PlayerInformation[DP_NumPlayer].DP_dcoID=DP_dcoID;
	memcpy(DP_PlayerInformation[DP_NumPlayer].DP_NickName,DP_NickName,strlen((char *)(DP_NickName))+1);
	DP_NumPlayer++;
/*	if(DP_SendAddPlayers()!=OK)
		{
			DP_lpIDC->Close();
	        DP_lpIDC->Release();
		    DP_lpIDC = NULL;
			return( DP_ERROR_SEND_MESSAGE );
		}*/
	return ( OK );
}



//此模块是用来得到已经在网络中的Session信息
int		DP_GetSession( void )
{

//	HRESULT hr;
//	DP_IsHost = FALSE;
	DP_g_lpGuid = (LPGUID) &DP_pGuid;

	if (DP_GetGame(DP_hWndMain)==DP_ERROR_ENUM_SESSION)
		{
			#ifdef	DEBUG
			MessageBox(DP_hWndMain,"Enumerate Session Error!"," Error",MB_OK);
			#endif
			return	(DP_ERROR_ENUM_SESSION);
		}
	return	( OK );

}




//根据玩家的选择,确定联接到哪个Session上
int		DP_ConnectSession( void )
{

	HRESULT hr;


	if(DP_SessionNO<0)
		{
			#ifdef	DEBUG
			MessageBox(DP_hWndMain,"Input Session Choice Error!"," Error",MB_OK);
			#endif
			return (DP_ERROR_INPUT_SESSION_CHOICE);
		}

	//通过玩家的选择,打开一个Session
	if(DP_DlgProcSelSession(DP_SessionNO)!=OK)
		{
			#ifdef	DEBUG
			MessageBox(DP_hWndMain,"Open Session Error!"," Error",MB_OK);
			#endif
			return(DP_ERROR_OPEN_SESSION);
		}

	if (DP_lpIDC == NULL)
		{
			#ifdef	DEBUG
			MessageBox(DP_hWndMain,"Player ID is empty!"," Error",MB_OK);
			#endif
			return(DP_PLAYER_ID_EMPTY);
		}

	//创建一个Player,其中的DP_NickName是玩家给自己起的名字
	if ((hr = DP_lpIDC->CreatePlayer(//DP_lpIDC, 
							  &DP_dcoID, DP_NickName,
							  "CB_Player", &DP_dphEvent)) != DP_OK)
		{
			DP_lpIDC->Close();
			DP_lpIDC->Release();
		    DP_lpIDC = NULL;
			switch( hr )
				{
					case	DPERR_CANTCREATEPLAYER:
							return( DP_ERROR_NOT_CREATE_PLAYER );
							break;
					case	DPERR_NOCONNECTION:
							return( DP_ERROR_NOT_CONNECT );
							break;
					case	DPERR_CANTADDPLAYER:
							return( DP_NOT_ADD_PLAYERS );
							break;
					case	DPERR_INVALIDPARAMS:
							return( DP_ERROR_INVALID_PARAMS );
							break;
					case	DPERR_GENERIC:
							return( DP_ERROR_GENERIC );
							break;
					case	DPERR_INVALIDOBJECT:
							return( DP_ERROR_INVALID_OBJECT );
							break;
				}


			return( DP_ERROR_CREATE_PLAYER );
		}
	DP_IsHost = DP_JOIN;
//	DP_PlayerInformation[DP_NumPlayer].DP_dcoID=DP_dcoID;
//	memcpy(DP_PlayerInformation[DP_NumPlayer].DP_NickName,DP_NickName,strlen((char *)(DP_NickName))+1);
//	DP_NumPlayer++;
	if(DP_SendAddPlayers( DP_SEND_TO_SERVER )!=OK)
		{
			DP_lpIDC->Close();
	        DP_lpIDC->Release();
		    DP_lpIDC = NULL;
			return( DP_ERROR_SEND_MESSAGE );
		}
	return	( OK );

}



//此模块用来得到系统提供的服务类型
int DP_GetProvider(HWND hWndCtl)
{
	HRESULT hr;


	hr=DirectPlayEnumerate(DP_EnumSP,(LPVOID)hWndCtl);
	if(hr!=DP_OK)
		{
			#ifdef	DEBUG
			MessageBox(DP_hWndMain,"I can not get provider!"," Error",MB_OK);
			#endif
			switch( hr )
				{
					case	DPERR_EXCEPTION:
							return( DP_ERROR_EXCEPTION );
							break;
					case	DPERR_GENERIC:
							return( DP_ERROR_GENERIC );
							break;
				}
			return	(DP_ERROR_GET_PROVIDER);
		}
	return ( OK );

}


//从网络中得到所有的Session信息
int DP_GetGame(HWND hWndCtl)
{

	    DPSESSIONDESC dpDesc;
		HRESULT hr;

 
        memset(&dpDesc, 0x00, sizeof(DPSESSIONDESC));
        dpDesc.dwSize = sizeof(dpDesc);
        dpDesc.guidSession = *DP_g_lpGuid;
        // enum sessions with 5 second timeout
		#ifdef	DDEBUG
		OutputDebugString( "Step 7: EnumSessions\n" );
		#endif
        hr=DP_lpIDC->/*lpVtbl->*/EnumSessions(//DP_lpIDC, 
											&dpDesc, (DWORD)1000, 
											DP_EnumSession, (LPVOID) hWndCtl, 
											(DWORD)NULL);
		if (hr!=DP_OK)
			{

				switch( hr )
					{
						case	DPERR_INVALIDPARAMS:
								return( DP_ERROR_INVALID_PARAMS );
								break;
						case	DPERR_INVALIDOBJECT:
								return( DP_ERROR_INVALID_OBJECT );
								break;
					}			
				return	(DP_ERROR_ENUM_SESSION);
			}
		return( OK );
}


//创建玩家选择的服务类型
BOOL  DP_DlgProcChooseProvider(int	i)
{
	HRESULT hr;

	if (DP_lpIDC!=NULL)
		{
			DP_lpIDC->Release();
			DP_lpIDC=NULL;
//			return FALSE;
		}
//	DP_lpIDC=NULL;
	hr=DirectPlayCreate((LPGUID)&DP_EnumCb[i].PointGUID, &DP_lpIDC, NULL);
    switch(hr)
		{
			case	DPERR_GENERIC:
					return( DP_ERROR_GENERIC );
					break;
			case	DPERR_EXCEPTION:
					return( DP_ERROR_EXCEPTION );
					break;
			case	DPERR_UNAVAILABLE:
					return( DP_ERROR_UNAVAILABLE );
					break;
		}
	return TRUE;
	
}


//此函数用做EnumSession的回调函数
BOOL FAR PASCAL DP_EnumSession(LPDPSESSIONDESC lpDPGameDesc, LPVOID lpContext, 
                            LPDWORD lpdwTimeOut, DWORD dwFlags)
{
	static	int	i=0;

	if(DP_EnumSessionCb[0].PointDPGameDesc.dwSession==0)
		{i=0;}
    if( dwFlags & DPESC_TIMEDOUT )
    {
        return FALSE;       // don't try again
    }
	if(strcpy(DP_EnumSessionCb[i].PointDPGameDesc.szSessionName,
								lpDPGameDesc->szSessionName)==0)
								
		{return FALSE;}
	DP_EnumSessionCb[i].PointDPGameDesc.dwSession=lpDPGameDesc->dwSession;
	i++;
	return	(TRUE);

}


//此函数用做DirectPlayEnumerate的回调函数
BOOL FAR PASCAL DP_EnumSP(LPGUID lpGuid, LPSTR lpDesc, DWORD dwMajorVersion,
                       DWORD dwMinorVersion, LPVOID lpv)
{
//	static	int	i=0;


	//if(memcpy(&DP_EnumCb[i].PointGUID,lpGuid,sizeof(LPGUID))==0)
	//	{return FALSE;}
	DP_EnumCb[DP_ProviderNum].PointGUID.Data1=lpGuid->Data1;
	DP_EnumCb[DP_ProviderNum].PointGUID.Data2=lpGuid->Data2;
	DP_EnumCb[DP_ProviderNum].PointGUID.Data3=lpGuid->Data3;
	DP_EnumCb[DP_ProviderNum].PointGUID.Data4[0]=(BYTE)lpGuid->Data4[0];
	DP_EnumCb[DP_ProviderNum].PointGUID.Data4[1]=(BYTE)lpGuid->Data4[1];
	DP_EnumCb[DP_ProviderNum].PointGUID.Data4[2]=(BYTE)lpGuid->Data4[2];
	DP_EnumCb[DP_ProviderNum].PointGUID.Data4[3]=(BYTE)lpGuid->Data4[3];
	DP_EnumCb[DP_ProviderNum].PointGUID.Data4[4]=(BYTE)lpGuid->Data4[4];
	DP_EnumCb[DP_ProviderNum].PointGUID.Data4[5]=(BYTE)lpGuid->Data4[5];
	DP_EnumCb[DP_ProviderNum].PointGUID.Data4[6]=(BYTE)lpGuid->Data4[6];
	DP_EnumCb[DP_ProviderNum].PointGUID.Data4[7]=(BYTE)lpGuid->Data4[7];
	if(memcpy(&DP_EnumCb[DP_ProviderNum].PointDesc,lpDesc,strlen(lpDesc)+1)==0)
		{return FALSE;}
	DP_ProviderNum++;
	return	TRUE;
}



//此函数是用来打开玩家指定的Session
int	DP_DlgProcSelSession (int i)
{
    DPSESSIONDESC dpDesc;
    HRESULT hr = DP_OK + 10;


	memset(&dpDesc, 0x00, sizeof(DPSESSIONDESC));
	dpDesc.dwSize       = sizeof(dpDesc);
	dpDesc.guidSession  = *DP_g_lpGuid;
	dpDesc.dwFlags      = DPOPEN_OPENSESSION;
	dpDesc.dwSession    = DP_EnumSessionCb[i].PointDPGameDesc.dwSession;
	#ifdef	DEBUG
	OutputDebugString( "Step 8: Fall through, Open \n" );
	#endif	
	hr = DP_lpIDC->/*lpVtbl->*/Open(//DP_lpIDC, 
								 &dpDesc);

	if (hr== DP_OK)
		{
			return	(OK);
		}
	if (hr != DP_OK)
		{
			DP_lpIDC->/*lpVtbl->*/Close(/*DP_lpIDC*/);
			DP_lpIDC->/*lpVtbl->*/Release(/*DP_lpIDC*/);
			DP_lpIDC = NULL;
			switch ( hr )
				{
					case	DPERR_INVALIDPARAMS:	
							return( DP_ERROR_INVALID_PARAMS );
							break;
					case	DPERR_GENERIC:
							return( DP_ERROR_GENERIC );
							break;
					case	DPERR_UNAVAILABLE:
							return( DP_ERROR_UNAVAILABLE );
							break;
					case	DPERR_UNSUPPORTED:
							return( DP_ERROR_UNSUPPORTED );
							break;
					case	DPERR_USERCANCEL:
							return( DP_ERROR_USER_CANCEL );
							break;
					case	DPERR_ACTIVEPLAYERS:
							return( DP_ERROR_ACTIVE_PLAYERS );
							break;
					case	DPERR_INVALIDOBJECT:
							return( DP_ERROR_INVALID_OBJECT );
							break;
				}

			return (OK);
		}

	return(TRUE);
}


//该函数是用来接收网络中的消息
int	 DP_ReceiveGameMessages( void )
{
    DPID                fromID, dcoReceiveID;
    DWORD               nBytes;
	int					i;
	int					j;

    if ( DP_lpIDC )
    {
        // read all messages in queue
		if(DP_MessageQueueFull==FULL)
			{
				#ifdef	DEBUG
				MessageBox(DP_hWndMain,"Message Queue Full!"," Error",MB_OK);
				#endif
				return  (DP_MESSAGE_QUEUE_FULL);
			}
        HRESULT status;
        nBytes = BUFFER_MAX_BYTE;
        status = DP_lpIDC->/*lpVtbl->*/Receive(// DP_lpIDC,
						                        &fromID,
												&dcoReceiveID,
												DPRECEIVE_ALL,
												DP_ReadMessage,
												&nBytes);
		if(status==DPERR_BUFFERTOOSMALL){MessageBox(DP_hWndMain,"Buffer too small!"," Error",MB_OK);}
		if((status==DP_OK)&&(fromID!=DP_dcoID))
			{
				if(((i=DP_AddPlayers(fromID))==DP_NOT_ADD_PLAYER)&&(j=DP_DestroyPlayers(fromID))==DP_NOT_DESTROY_PLAYER)
					{
/*						DP_MessageQueueEnd++;
						DP_MessageQueueEnd=DP_MessageQueueEnd%20;
						if(DP_MessageQueueEnd==DP_MessageQueueStart)
							{
								#ifdef	DEBUG
								MessageBox(DP_hWndMain,"Message Queue Full!","  Error",MB_OK);
								#endif
								DP_MessageQueueFull=FULL;
								return	(DP_MESSAGE_QUEUE_FULL);
							}

⌨️ 快捷键说明

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