Window Direct3D游戏开发入门——Bomb游戏

第一步:程序入口函数

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

主函数中主要实现以下功能:

初始化窗口对象,并注册

//初始化窗口对象

WNDCLASSEX wc;

wc.cbClsExtra = 0;

wc.cbSize = sizeof(WNDCLASSEX);

wc.cbWndExtra = 0;

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

wc.hCursor = LoadCursor(hInstance, IDC_ARROW);

wc.hIcon = NULL;

wc.hIconSm = NULL;

wc.hInstance = hInstance;

wc.lpfnWndProc = (WNDPROC)WinProc;

wc.lpszClassName = "MainClass";

wc.lpszMenuName = NULL;

wc.style = CS_HREDRAW | CS_VREDRAW;

//初始化参数完毕,注册该对象

RegisterClassEx(&wc);

窗口对象初始化完毕后,创建窗口句柄

HWND window = CreateWindow(wc.lpszClassName, APPTitle.c_str(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, screenWidth, screenHeight, NULL, NULL, hInstance, NULL);

函数原型:

CreateWindow(lpClassName, lpWindowName, dwStyle, x, y,nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);

lpClassName :类型LPCTSTR,指定窗口类名。

lpWindowName :类型LPCTSTR,窗口标题显示在标题栏中。

dwStyle :窗口创建的风格。具体窗口样式见《笔记-窗口样式类型》

x:窗口左上角的位置x

y:窗口左上角的位置y

nWidth:窗口大小

nHeight:窗口大小

hWndParent:父窗口句柄

hMenu:菜单句柄

hInstance:窗口实例

lpParam:需要传递的参数

窗口句柄创建完毕,需要将该窗口显示

//显示并更新窗口

ShowWindow(window,nCmdShow);

UpdateWindow(window);

窗口显示完毕,此时窗口已经构建完成,开始接收来自游戏的消息,从消息队列中取出消息,并进入无限循环

//接收消息

MSG message;

while (!gameOver)

{

if (PeekMessage(&message, window, 0, 0, PM_REMOVE))

{

TranslateMessage(&message);

DispatchMessage(&message);

}

Game_Run(window);

}

Game_End();

第二步:游戏初始化

游戏初始化过程主要是初始化Direct3D,以及外设,同时,初始化表面

初始化Direct3D的版本

//根据版本号初始化Direct3D

d3d = Direct3DCreate9(D3D_SDK_VERSION);

设置Direct3D结构体的参数

//声明参数结构体

D3DPRESENT_PARAMETERS d3dpp;

//清空参数 这一步很关键,需要有这一个清空过程,否则的话,将会出现不能创建设备的问题

ZeroMemory(&d3dpp, sizeof(d3dpp));

d3dpp.Windowed = (!fullScreen);

d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

d3dpp.BackBufferCount = 1;

d3dpp.BackBufferWidth = width;

d3dpp.BackBufferHeight = height;

d3dpp.hDeviceWindow = hWnd;

参数设置完成后,需要创建Direct3D设备对象,如果返回值为D3D_OK,表示创建成功

HRESULT result = d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);

初始化外设,本项目中主要使用了键盘和鼠标两个,Direct3D只支持微软的xbox的遥控杆,需要的话引入xinput.h和xinput.lib库文件

初始化输入对象

//初始化输入对象

HRESULT result = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&dinput, NULL);

GetModuleHandle()函数,用来获取当前程序的实例hInstance的句柄,因为该句柄通常只在WinMain中会出现。

第二个参数为版本号,版本号存在于dinput.h中,需要重新宏定义一下,#define DIRECTINPUT_VERSION 0x0800,定义时,要将该宏定义放在文件的最上方,防止出现宏重定义。

第三个参数为DirectInput版本的引用标识符。这个值目前版本用的是IID_IDirectInput8。

第四个参数是指向主DirectInput对象指针的指针(注意是双重指针)。

最后一个参数总是为NULL

创建输入对象后,需要创建输入设备,以及设置设备

创建键盘设备

//创建设备

dinput->CreateDevice(GUID_SysKeyboard, &dikeyboard, NULL);

//设置数据格式

dikeyboard->SetDataFormat(&c_dfDIKeyboard);

//设置协同级别

dikeyboard->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);

//获取设备

dikeyboard->Acquire();

创建鼠标设备

//初始化鼠标

dinput->CreateDevice(GUID_SysMouse, &dimouse, NULL);

//设置数据格式

dimouse->SetDataFormat(&c_dfDIMouse);

//设置协同级别

dimouse->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);

//获取设备

dimouse->Acquire();

d3ddev->ShowCursor(false);

设备初始化完成后,需要从文件中读取图片精灵

//声明图片类表面

LPDIRECT3DSURFACE9 image = NULL;

D3DXIMAGE_INFO info;

HRESULT result = D3DXGetImageInfoFromFile(fileName.c_str(), &info);

if (result != D3D_OK)

{

return NULL;

}

//创建离屏表面

result = d3ddev->CreateOffscreenPlainSurface(info.Width, info.Height, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &image, NULL);

if (result != D3D_OK)

{

return NULL;

}

result = D3DXLoadSurfaceFromFile(image, NULL, NULL, fileName.c_str(), NULL, D3DX_DEFAULT, D3DCOLOR_XRGB(0, 0, 255), NULL);

if (result != D3D_OK)

return NULL;

return image;

首先要引入d3dx9.h这个头文件,这个文件在vs2013在带的SDK库中是不存在的,因此也需要下载Direct9.0c SDK (2010.6)这个版本的SDK,同时,设置项目属性,将包含目录以及库引用目录指向安装好的Direct SDK文件。

该段代码,首先建立一个image的表面,同时声明一个info来获取文件中图片的信息,通过该图片的信息,创建一个image离屏表面。

D3DXIMAGE_INFO info;

HRESULT result = D3DXGetImageInfoFromFile(fileName.c_str(), &info);

result = d3ddev->CreateOffscreenPlainSurface(info.Width, info.Height, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &image, NULL);

离屏表面创建完成后,将文件图片读取到离屏表面中,之后直接返回该离屏表面。

result = D3DXLoadSurfaceFromFile(image, NULL, NULL, fileName.c_str(), NULL, D3DX_DEFAULT, D3DCOLOR_XRGB(0, 0, 255), NULL);

两个精灵的离屏表面都创建好,通过GetBackBuffer函数,可以获得真实后台的指针地址。

d3ddev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backBuffer);

第三步:游戏开始运行

游戏开始运行后,首先需要获取的是键盘或者鼠标的状态以及按键

dimouse->GetDeviceState(sizeof(mouse_state), (LPVOID)&mouse_state);

dikeyboard->GetDeviceState(sizeof(keys), (LPVOID)&keys);

DIK_A 表示按键A,DIKEYBOARD_A表示的是地址映射单元

第四步:绘制表面,并渲染

//绘制表面

void DrawSurface(LPDIRECT3DSURFACE9 dest, float x, float y, LPDIRECT3DSURFACE9 src)

{

//

D3DSURFACE_DESC desc;

//通过GetDesc可以获得源位图的高度和宽度,由此可以绘制一个矩形

src->GetDesc(&desc);

//创建绘制的矩形

RECT src_Rect = {0,0,(long)desc.Width,(long)desc.Height};

RECT dest_Rect;

dest_Rect.left = (long)x;

dest_Rect.top = (long)y;

dest_Rect.right = (long)x + desc.Width;

dest_Rect.bottom = (long)y + desc.Height;

//绘制表面到源表面

d3ddev->StretchRect(src, &src_Rect, dest, &dest_Rect, D3DTEXF_NONE);

}

//使用colorfill来清空表面上面的内容,这个主要是针对真实后台的缓冲区

d3ddev->ColorFill(backBuffer, NULL, D3DCOLOR_XRGB(255, 255, 255));

//clear清空屏幕上面的内容

//d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0);

//开始渲染

if (d3ddev->BeginScene())

{

//将离屏表面上的内容复制到后台缓冲区中

DrawSurface(backBuffer, bomb.x, bomb.y, bomb_suf);

//将离屏表面中的内容复制到后台缓冲区中

DrawSurface(backBuffer, bucket.x, bucket.y, bucket_suf);

//结束渲染

d3ddev->EndScene();

//显示

d3ddev->Present(NULL, NULL, NULL, NULL);

}

源码下载地址:http://download.csdn.net/detail/l_shiwei/9509600

时间: 2024-08-06 09:15:20

Window Direct3D游戏开发入门——Bomb游戏的相关文章

ar游戏开发入门三步走 - 转载请保留原文链接:http://www.chinaar.com/ZYJC/2423.html

中国AR网(公众号armeiti):其实我遇到很多像你这样的去做AR开发的.其实现在很多AR开发者根本不懂AR实现原理,因为现在开发AR不需要自己去做底层算法,直接去用成熟的SDK即可.现在AR应用开发门槛不是像以前那么高了,反而好的创意更多的来自内容 ar游戏开发入门一般需要 算法.应用开发.3D美工三部分: 你说的 opencv 主要用与算法部分. java,c# 属于应用开发部分. 国内一般只做后两部分,借助于 高通 或 美桃(Metaio) 的识别算法, 使用 Unity 作为开发平台,

Unity 2D游戏开发教程之游戏中精灵的跳跃状态

Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却无法从低的地面移动到高的地面,因为当前的游戏精灵只能左右移动,即left和right.为了解决这个问题,本节就来为精灵添加跳跃状态.   图2-14  精灵从一个地面移动到另一个地面 (1)如果要为精灵添加跳跃状态,即jump,就不得不再引入其它状态: q   landing:用于表示精灵接触到地面

Unity 2D游戏开发教程之游戏精灵的开火状态

Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 "开火"就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌人,而精灵最好具备开火的能力,否则会被敌人轻易干掉!具体的实现方法是: (1)导入一个表示子弹的图片到Unity,本示例中选用的子弹图片,名为PlayerBullet,如图2-23所示. 图2-23  导入到游戏项目的表示子弹的图片 (2)拖动此图片到Scene视图,即可在当前的游戏场景中

Android游戏开发:物理游戏之重力系统开发--圆形自由落体Demo

本节为大家提供有关物理游戏的知识,讲解了一个简单的圆形自由落体Demo的编写.. Java代码 package com.himi; import java.util.Random; import java.util.Vector; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import a

Unity3D射击游戏-UNITY3D软件开发、游戏开发、UNITY3D游戏开发

Unity3D射击游戏-UNITY3D软件开发.游戏开发.UNITY3D游戏开发 上海诸君信息科技有限公司是以Oculus.Unity.虚拟现实作为核心业务的民营高科技企业,坚持精益研发与技术创新,拥有丰富Oculus.Unity.虚拟现实的软件与游戏开发经验,能提供优质的技术解决方案. 公司拥有全面强大的团队,拥有优秀的设计师与美术人员,有大量的游戏项目制作管理经验,能优质控制游戏产品质量和制作时间,成功服务于海内外多家公司,拥有丰富的客户案例. 诸君信息科技已服务的客户包括,普华永道.交大.

最大的幻术-游戏开发-我的游戏构思-环境

游戏,具体而言是游戏软件.那么,通过软件来作为载体,通过软件实现内容.一款软件能不能称为游戏在于这款软件所提供的功能是不是游戏体验. 什么是游戏,我无法给出定义.但是,游戏有什么,我们已经有了自己的答案.那么,现在我们想设计一款游戏,他是什么呢?游戏是什么类型的,有什么玩法,要达成什么目的.这里,我们先要停止思考这款游戏如何去吸引人,我们思考的是游戏软件所构建的虚拟的世界. 游戏让玩家在虚拟世界去干一件又一件的事情.因此,我最主要的关注点是游戏的场景,而作为游戏的战斗场景,我们一般称之为关卡.

MMORPG游戏开发入门(转)

原著:Radu Privantu 译者序:这是一篇讲解如何开发一款MMORPG的入门文章,作者本人也是一款游戏的开发者,文中的内容源于实践,有很高的参考价值.很多人都想拥有自 己的游戏,这篇文章对那些想自己开发游戏的人来说可能是一纸福音,也可能是一盆冷水.无论如何,开发游戏都不是一件简单的事情.以下是翻译正文: 文章的中心是如何起步开发你自己的大型多人在线角色扮演游戏( 原文:Massive Multiplayer Online Role Playing Games) (MMORPG)(译者注:

C#程序员的春天之从零开始学习unity3D游戏开发入门教程一(前言)

我们不在“拖控件”,我们也有春天 序言:之前断断续续谢了一点unity的教程,但是不全面.这里表示歉意.今天准备重新做一套.今天也是换了新工作,也是新的开始.也希望以此来激励自己把这个教程一直写下去.想要学习unity的同学可以加这个群(326535328),可能会在qq课堂在线讲解一些相关知识. 乱扯一下:为什么说这时C#程序员的春天呢?在大多数java或者其他程序员的眼里,我们.net平台的程序员同胞都背负着”拖控件“的这么一个标签.某种程度上讲,.net的快速入门的精髓就是拖控件.然而外人

C/C++零基础教程,游戏开发入门

零基础学 C++.VC++开发,观看地址http://edu.ibeifeng.com/view-index-id-523.html 零基础学C#基础语法快速开发 观看地址http://edu.ibeifeng.com/view-index-id-527.html 零基础学C++游戏开发从入门到精通 观看地址http://edu.ibeifeng.com/view-index-id-528.html 零基础学C++语言开发,轻松入门 观看地址http://edu.ibeifeng.com/vie