📄 gameapp.cpp
字号:
//----------------------------------------------------------------------------
// 文件名: gameapp.cpp
//
// 描述:用于实现游戏应用程序框架类
//
// 作者:朱波 创建日期:2007-03-19
//----------------------------------------------------------------------------
#include <windows.h> // include important windows stuff
#include <windowsx.h>
#include <mmsystem.h>
#include <iostream.h> // include important C/C++ stuff
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <math.h>
#include <io.h>
#include <fcntl.h>
#include <sys/timeb.h>
#include <time.h>
#include <ddraw.h>
#include <dsound.h>
#include "dxtools.h"
#include "gameapp.h"
HWND main_window_handle; // 保存全局windows句柄便于DX工具库文件使用
HINSTANCE main_instance; // 保存全局windows实例便于DX工具库文件使用
static CGameApplication* g_pGameApp = NULL; //全局游戏应用程序对象指针,便于Windows消息处理
CGameApplication::CGameApplication( void )
{
g_pGameApp = this;
m_game_state = GAME_MENU;
} //end CGameApplication
CGameApplication::~CGameApplication( void )
{
} //end CGameApplication
LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
return g_pGameApp->MsgProc( hWnd, uMsg, wParam, lParam );
} //end WndProc
HRESULT CGameApplication::Create( HINSTANCE hInstance , const TCHAR szGameName[] )
{
//以下代码实现对Windows的创建
WNDCLASSEX winclass;
HWND hwnd;
//窗口类实例化
winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WndProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hInstance;
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = szGameName;
winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
//保存全局窗口实例
main_instance = hInstance;
//注册窗口类
if (!RegisterClassEx(&winclass))
{
return(0);
}
//创建窗口
if (!(hwnd = CreateWindowEx(NULL, // extended style
szGameName, // class
szGameName, // title
WS_POPUP | WS_VISIBLE,
0,0, // initial x,y
SCREEN_WIDTH,SCREEN_HEIGHT, // initial width, height
NULL, // handle to parent
NULL, // handle to menu
hInstance,// instance of this application
NULL))) // extra creation parms
{
return(0);
}
//保存全局窗口句柄
main_window_handle = hwnd;
//以下代码实现对DX接口的初始化
//创建DX7.0接口对象
if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL)))
{
return(0);
}
//设置全屏方式协作级别
if (FAILED(lpdd->SetCooperativeLevel(main_window_handle,
DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX |
DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
{
return(0);
}
//设置显示模式为640x480x32
if (FAILED(lpdd->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,0,0)))
{
return(0);
}
//清空设备表面描述结构
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
//设置启用后备缓冲表面参数
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.dwBackBufferCount = 1;
//设置主显示表面参数
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
//创建主显示表面对象
if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL)))
{
return(0);
}
//将主显示表面与后备缓冲表面建立关联
ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
if (FAILED(lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps, &lpddsback)))
{
return(0);
}
//加载图片、声音等相关资源文件
if (!LoadResource())
{
return(0);
}
m_game_state = GAME_MENU;
return S_OK;
} //end Create
INT CGameApplication::Run( void )
{
MSG msg;
while(TRUE)
{
//测试消息队列中是否有消息,有的话读取出来进行相关处理
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//如果消息为WM_QUIT则退出循环
if (msg.message == WM_QUIT)
break;
//判断是否是加速键消息,是则进行相关的处理
TranslateMessage(&msg);
//向WndProc发送消息
DispatchMessage(&msg);
}
//根据当前游戏状态进入相关处理,若不是既定状态值则退出循环
switch (m_game_state)
{
case GAME_MENU:
GameMenu();
break;
case GAME_INTRO:
GameIntro();
break;
case GAME_OPTSETTING:
GameOptsetting();
break;
case GAME_OUT:
GameOut();
break;
case GAME_INIT:
GameInit();
break;
case GAME_START:
GameStart();
break;
case GAME_RUNNING:
InputProcess();
DoAI();
DoPhysics();
DoLogic();
Draw();
break;
case GAME_LEVELUP:
GameLevelUp();
break;
case GAME_OVER:
GameOver();
break;
case GAME_RESTART:
GameRestart();
break;
default:
PostMessage(main_window_handle,WM_QUIT,0,0);
break;
}
}
Release();
return (INT)msg.wParam;
} //end Run
INT CGameApplication::Release( void )
{
if ( NULL != lpddsback )
{
lpddsback->Release();
lpddsback = NULL;
}
if ( NULL != lpddsprimary )
{
lpddsprimary->Release();
lpddsprimary = NULL;
}
if ( NULL != lpdd )
{
lpdd->Release();
lpdd = NULL;
}
GameShutDown();
return(1);
} //end Release
LRESULT CGameApplication::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
return DefWindowProc( hWnd, uMsg, wParam, lParam );
} //end MsgProc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -