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

📄 main.cpp

📁 三国英雄录游戏和技术说明
💻 CPP
字号:
#include "Std.h"

#include "perimenu.h"
#include "Server.h"
#include "Cliect.h"
#include "Game.h"
#include "d3dsound.h"

LPDIRECT3D8 g_pD3D = NULL; 
LPDIRECT3DDEVICE8 g_pD3DDevice = NULL; 

HINSTANCE	g_hInst;							// 主程序实例
HWND hWnd;
TCHAR SetIP[20];

PeriMenu   SG_pm;
Cliect     SG_c;
Server     SG_s;
Game       SG_g;
D3DSound   SG_wav;

int Sx=0, Sy=0;


#define          PGMenu                10    //////最初菜单
#define          PGServerMenu          11    //////服务器菜单
#define          PGCliectMenu          12    //////客户端菜单

#define          GAMEINIT                           0    ///未开始
#define          GAMEBEGIN                          1    ///准备开始
#define          GAMECOURSE                         2    ///进行中

int Peri_Game = 10;

SOCKET sck_c = NULL;         /////本游戏的零时套接


HRESULT InitialiseD3D(HWND hWnd) 
{ 

    g_pD3D = Direct3DCreate8(D3D_SDK_VERSION);  ////创建西显示模式
    if(g_pD3D == NULL) 
    { 
        return E_FAIL; 
    } 
   //获得当前的显示模式 
    D3DDISPLAYMODE d3ddm; 
    if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))) 
    { 
        return E_FAIL; 
    } 

    D3DPRESENT_PARAMETERS d3dpp;  
    ZeroMemory(&d3dpp, sizeof(d3dpp)); 

     
    //创建窗口模式的D3D 
 /*    
d3dpp.Windowed=false;//要建立一个全屏程序,则置此项为FALSE
d3dpp.BackBufferWidth=d3ddm.Width;
d3dpp.BackBufferHeight=d3ddm.Height;
d3dpp.BackBufferFormat=d3ddm.Format;//此项记录色深信息
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.EnableAutoDepthStencil = TRUE;//让D3D管理深度缓冲
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;//设置深度缓冲为16位
d3dpp.hDeviceWindow=hWnd;
*/

    d3dpp.Windowed = TRUE; 
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
    d3dpp.BackBufferFormat = d3ddm.Format; 

    //创建D3D的设备对象,并获取接口IDirect3DDevice9的指针 
    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,  
                                   D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, 
                                   &g_pD3DDevice))) 
    { 
        return E_FAIL; 
    } 
	if(!SG_pm.InitPMenu(g_pD3DDevice)) /////初试化外部菜单
	{
		return FALSE;
	}
	if(!SG_g.InitD3D(g_pD3DDevice))  /////初始游戏
	{
		return FALSE;
	}

	//设定显示模式
    return S_OK; 
} 

void Render() 
{ 
    if(g_pD3DDevice == NULL) 
    { 
        return; 
    } 

    //用绿色清除后备缓存 
    g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); 

//	
    //开始屏幕操作 
    g_pD3DDevice->BeginScene(); 

	if(SG_g.i_gamework == GAMEINIT)
	{
        if(Peri_Game == PGMenu)
	    	SG_pm.ShowPMenu();
    	else if(Peri_Game == PGServerMenu)
    		SG_pm.ShowServerPMenu();
	}
	else if(SG_g.i_gamework == GAMEBEGIN)
	{
		SG_g.ShowGameBegin();
	}
	else if(SG_g.i_gamework == GAMECOURSE)
	{
		SG_g.ShowGameCourse(g_pD3DDevice);
	}

//建立顶点坐标模型 


    //结束屏幕操作 
    g_pD3DDevice->EndScene(); 
     
     
    //翻转后备为屏幕,使画面显示在屏幕上 
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL); 
} 

void CleanUp() 
{ 
    if(g_pD3DDevice != NULL) 
    { 
        g_pD3DDevice->Release(); 
        g_pD3DDevice = NULL; 
    } 

    if(g_pD3D != NULL) 
    { 
        g_pD3D->Release(); 
        g_pD3D = NULL; 
    } 
} 

void GameLoop() 
{ 
    //进入游戏循环 
    MSG msg;  
    BOOL fMessage; 

    PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE); 
     
    while(msg.message != WM_QUIT) 
    { 
        fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE); 

        if(fMessage) 
        { 
            //处理消息 
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        } 
        else 
        { 
         //没有消息时,处理渲染图象 
            Render(); 
        } 

    } 
} 

LRESULT CALLBACK SetIPProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hWndIP;
    switch(message)
	{
         case WM_INITDIALOG:
             break;
         case WM_COMMAND:
             switch( LOWORD(wParam) )
			 {
                 case IDOK:
                	 hWndIP = ::GetDlgItem(hDlg,IDC_IP);
                 	 ::GetWindowText(hWndIP,SetIP,20);
                     EndDialog(hDlg, IDOK);
                     break;
                 case IDCANCEL:
                     EndDialog( hDlg, IDCANCEL );
                     break;
                 default:
                     return FALSE;
			 }
             break;
         default:
             return FALSE;
	 }
 return TRUE;
}

//Windows消息处理机制,用来处理各种WINDOWS消息,包括常用的键盘消息 
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
int Push;
    switch(msg) 
    { 
        case WM_DESTROY: 
            PostQuitMessage(0); 
            return 0;  
        case WM_KEYUP:  
            switch (wParam) 
            {  
                case VK_ESCAPE: 
                    //按“ESC”键退出 
                    DestroyWindow(hWnd); 
                    return 0; 
            }  
		break;
		case WM_LBUTTONDOWN:
            Sx=(int)LOWORD(lParam);
            Sy=(int)HIWORD(lParam);
			switch(SG_g.i_gamework)
			{
	     		case GAMEINIT:
		        	if(Peri_Game == PGMenu)
					{
			        	TCHAR *IP;
	    	        	Push = SG_pm.PtInRectPMenu(Sx,Sy);
			        	if(Push == 1)  ////建立服务器
						{
				     	    IP = SG_s.CreateServer();
                            Peri_Game = PGServerMenu;
				     	    SG_pm.SetIp(IP);
						}
		    	    	else if(Push == 2)  ///连接服务器
						{
	                		DialogBox(g_hInst, (LPCTSTR)IDD_SETIP, hWnd, (DLGPROC)SetIPProc);
				        	SG_c.CreateCliect(SetIP);//
						}
	
					}
		        	else if(Peri_Game == PGServerMenu)
					{
			        	////......保留
					}

	    		   	break;
				case GAMEBEGIN:
					Push = SG_g.PtInRectGameBegin(Sx,Sy);
					if(Push != 0)
				        SG_g.SetCountry(Push);
					break;
				case GAMECOURSE:
					Push = SG_g.PtInRectGameCourse(Sx,Sy);
					if(Push != -1)
						SG_g.SetCountry(Push);
					break;
			}
			break;
	//	case WM_MOUSEMOVE:
	//		break;
		case CLIECT_MSG_RECV:
			SG_g.C_AssayRecv((char*)wParam);
			break;
		case SERVER_MSG_RECV:
			SG_g.S_AssayRecv((char*)wParam);
			break;
		case SERVER_MSG_GAMEBEGIN:      /////服务器开始信号
			sck_c = (SOCKET)wParam;
			SG_s.SendBuf(sck_c,GameBegin,strlen(GameBegin));  ////告诉Cliect准备开始
			break;
		case CLIECT_MSG_SEND:
			SG_c.SendBuf((char*)wParam,strlen((char*)wParam));
			break;
		case SERVER_MSG_SEND:
			if(sck_c != NULL)
		    	SG_s.SendBuf(sck_c,(char*)wParam,strlen((char*)wParam));
			break;
		case S_COURSE_MSG_GO:    /////游戏开始,执行的地方在,SetCountry(),ExecutionWorking()
			SG_g.InitS_GameCourse();  //初始化Server所有数据
			break;
		case WM_TIMER:
            int m_TimerID=(int)LOWORD(wParam);
			if(m_TimerID == RecoveryHP)
			{
				SG_g.GRecoveryHP();
			}
			else if(m_TimerID == VictorySC)
			{
				SG_g.Victory();
			}
			else
			{
		    	SG_g.SetGameTimer(m_TimerID);
            	::KillTimer(hWnd,m_TimerID);
			}
			break;
    } 
    return DefWindowProc(hWnd, msg, wParam, lParam); 
} 

//应用程序入口主函数,相当于C语言的main()函数 
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT) 
{ 
	g_hInst = hInst; // 将实例句柄存储在全局变量中
    //注册窗口类 
	WNDCLASSEX wc;

    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = CS_CLASSDC; 
    wc.lpfnWndProc = (WNDPROC) WinProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = g_hInst; 
    wc.hIcon = LoadIcon(g_hInst, (LPCTSTR)IDI_SANGUOICON);
    wc.hCursor = LoadCursor(g_hInst, (LPCTSTR)IDC_SANGUOCURSOR); 
    wc.hbrBackground = NULL; 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = "DX8"; 
    wc.hIconSm = NULL; 

    RegisterClassEx(&wc); 
    //创建应用程序窗口 
    hWnd = CreateWindow("DX8", "mygame1",  
                              WS_OVERLAPPEDWINDOW/*WS_EX_TOPMOST*/, 0, 0, 800, 640, 
                              GetDesktopWindow(), NULL, wc.hInstance, NULL); 		  	

	if(!SG_s.InitServer(hWnd))   /////初试化SOCKETServer
	{
		return 0;
	}
	if(!SG_c.InitCliect(hWnd))
	{
		return 0;
	}
	if(!SG_g.InitGame(hWnd))
	{
		return 0;
	}
	if(!SG_wav.MyDirectSoundInit(hWnd))
	{
		return 0;
	}
//	int id = SG_wav.DSoundLoadWAV("sftx_music.WAV", 0);
//	SG_wav.PlaySound(id);
    //Initialize Direct3D 
    if(SUCCEEDED(InitialiseD3D(hWnd))) 
    {  
        //显示窗口 
        ShowWindow(hWnd, SW_SHOWDEFAULT); 
        UpdateWindow(hWnd); 
        //开始游戏并循环 

        GameLoop(); 
    } 
     
    CleanUp(); 

    UnregisterClass("DX8", wc.hInstance); 
     
    return 0; 
} 

⌨️ 快捷键说明

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