系统粉 > IT资讯 > 微软资讯

微软平台大型游戏开发六步曲

发布时间:2017-04-04    浏览数:

微软提供几种编程语言可以写Windows窗口应用程序,比如C/C++,VB,C#等。Windows下要学习游戏窗口编写,一定离不开Windows API的使用。

1、安装窗口编译环境

推荐VS(VS2008,VS2010,VS2015,VS2013,VS2017),MSDN文档。

2、安装帮助文档MSDN

3、C/C++语言编程

4、掌握Windows编程

编写Windows程序一般有两种:一种是MFC编程(C++);一种是Win32编程(C+Windows API调用方式)。

5、窗口交互界面

Windows编程两部分:Windows下的交互界面编程;深入理解Windows运行机制、内存管理和核心对象。

框架——Windows是一个消息驱动的系统

窗口——窗口管理,比如创建、销毁、重绘、透明处理技术等

控件——包括Windows窗口上的各种控件的使用和管理。

外设——包括鼠标、键盘、打印机等、串/并口。

GDI——绘制各种Windows GDI对象,比如字体、位图、画笔、画刷等

6、Windows核心编程

Windows内部运行机制。

内核对象——包括进程、线程、高度、同步等技术

内存管理——包括Windows系统的虚拟内存管理、地址空间、内存映射等

动态链接库——包括动态库原理、创建等

异常处理机制——结构化异常处理、异常链、错误与恢复。

二、Windows游戏动作技能入门

微软平台大型游戏开发六步曲(1)

//---------------------------------------------------------------------------------------

//

// 程序名称:Windows游戏入门动作技能

//

// 编译环境:Visual Studio 2013

//

// 文件名称:Game.cpp

//

// 开发作者:张三

//

// 创建日期:2017-04-03

//

// 修改日期:2017-04-03 By 李四

//

//---------------------------------------------------------------------------------------

#include<Windows.h>

#include<tchar.h>

#pragmacomment(lib,"winmm.lib") // 调用PlaySound()函数所需要的库文件

#defineWINDOW_WIDTH 800

#defineWINDOWS_HEIGHT 600

#defineWINDOW_TITEL L"Windows游戏编程入门:动作技能"

// 声明全局变量--------------------------------------------------------------------

HDC g_hdc = NULL, g_mdc = NULL; // 全局设备环境句柄/全局内存DC句柄HB

HBITMAP g_hSprite[12]; // 声明位图数组来存储每一张人物的图片

DWORD g_tPre = 0, g_tNow = 0; // 记录上一次绘图的时间/记录本次准备绘图时间

int g_iNum = 0; // 记录目前显示的图片编号

// 声明全局函数--------------------------------------------------------------------

LRESULTCALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); // 窗口过程函数

BOOL Init_Game(HWND hwnd); // 资源初始化

VOID Paint_Game(HWND hwnd); // 绘制游戏图片

BOOL CleanUp_Game(HWND hwnd); // 清理资源

// WinMain():Windows应用程序的入口函数

intWINAPI WinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intnShowCmd)

{

// 窗口类

WNDCLASSEX wndclass = { 0 };

wndclass.cbSize = sizeof(WNDCLASSEX); // 设置结构体字节数大小

wndclass.style = CS_HREDRAW | CS_VREDRAW; // 设置窗口的样式

wndclass.lpfnWndProc = WndProc; // 设置指向窗口过程函数的指针

wndclass.cbClsExtra = 0; // 窗口类附加内存,一船情况下直接取0即可

wndclass.cbWndExtra = 0; // 窗口附加内存,依然取0即可

wndclass.hInstance = hInstance; // 包含窗口过程的程序实例句柄

wndclass.hIcon = (HICON)::LoadImage(NULL, L"GAME.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);// 指定窗口类的光标句柄

wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wndclass.lpszMenuName = NULL; // 用一个以空终止的字符串,指定菜单资源名称

wndclass.lpszClassName = L"GameGDI";

// 注册窗口类

if (!RegisterClassEx(&wndclass))

return -1;

// 创建窗口

HWND hwnd = CreateWindow(L"GameGDI", WINDOW_TITEL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,

CW_USEDEFAULT, WINDOW_WIDTH, WINDOWS_HEIGHT, NULL, NULL, hInstance, NULL);

// 显示更新

MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOWS_HEIGHT, true);

ShowWindow(hwnd, nShowCmd);

UpdateWindow(hwnd);

// 游戏资源初始化

if (!Init_Game(hwnd))

{

MessageBox(hwnd, L"游戏资源初始化失败", L"错误", 0);

returnFALSE;

}

PlaySound(L"仙剑·重楼.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);

// 消息循环

MSG msg = { 0 };

while (msg.message != WM_QUIT) // 使用while循环,如果消息不是WM_QUIT消息,继续循环

{

if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) // 查看应用程序消息队列,有消息时将队列中的消息发出去

{

TranslateMessage(&msg); // 将虚拟键消息转换成字符消息

DispatchMessage(&msg); // 分发一个消息窗口

}

else

{

g_tNow = GetTickCount();

if (g_tNow - g_tPre >= 100)

Paint_Game(hwnd);

}

}

// 窗口注销

UnregisterClass(L"GameGDI", wndclass.hInstance);// 程序准备结束,注销窗口类

return 0;

}

// 窗口过程函数

LRESULTCALLBACK WndProc(HWNDhwnd, UINTmessage, WPARAMwParam, LPARAMlParam)

{

switch (message)

{

caseWM_DESTROY: // 窗口销毁消息

CleanUp_Game(hwnd); // 进行退出前的资源清理

PostQuitMessage(0); // 向系统表明线程有终止请求

break;

default:

returnDefWindowProc(hwnd, message, wParam, lParam);

}

return 0; // 正常退出

}

// 资源初始化

BOOL Init_Game(HWNDhwnd)

{

g_hdc = GetDC(hwnd);

wchar_t filename[20];

// 加载每个人物

for (int i = 0; i < 12; i++)

{

memset(filename, 0, sizeof(filename));

swprintf_s(filename, L"%d.bmp", i);

g_hSprite[i] = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 800, 600, LR_LOADFROMFILE);

}

g_mdc = CreateCompatibleDC(g_hdc); // 建立兼容设备环境的内存DC

Paint_Game(hwnd);

returnTRUE;

}

// 绘制游戏图片

VOID Paint_Game(HWNDhwnd)

{

if (g_iNum == 11) // 判断是否超过最大图片编号,若超过最大图片编号10,则直接重新设置0

g_iNum = 0;

SelectObject(g_mdc, g_hSprite[g_iNum]);

// 把图片按编号贴图到窗口当中

BitBlt(g_hdc, 0, 0, 800, 600, g_mdc, 0, 0, SRCCOPY);

g_tPre = GetTickCount();

g_iNum++;

}

// 清除资源

BOOL CleanUp_Game(HWNDhwnd)

{

// 释放资源对象

for (int i = 0; i < 12; i++)

DeleteObject(g_hSprite[i]);

DeleteDC(g_mdc);

ReleaseDC(hwnd, g_hdc);

returnTRUE;

}

这是今天的内容,希望大家有所收获,学有所成,写出属于自己的程序!!!

如果对这方面有兴趣的可以加群:379249575,大家一起学习交流。

群内还有更多学习资料、视频,免费课......

上一篇:安卓超越微软成最大系统 但谷歌还有更大野心 下一篇:微软PC系统37年首次被安卓手机打败,盖茨都拦不住

相关资讯

最新热门应用

电脑问答