📄 main.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 + -