游戏编程
饭fan有引力
低调低调~
展开
-
拾取
拾取假设用户在屏幕上单击,击中的位置为点s = (x, y)。但是,仅给出点s,应用程序还是无法立即判断物体是否被选中。所以,针对这类问题,我们需要采用一项称为“拾取”的技术。我们知道,物体和屏幕点s之间的一种关系是茶壶被投影到了一个包含了s的区域中。更准确地说,茶壶被投影到了投影窗口中一个包含点p(点p位于投影窗口中)的区域中,其中点p对应于屏幕中的点s。由上图中,我们看到,如果自坐标原点发出一条拾取射线,该射线将与那些其投影包围了点p的物体(即茶壶)相交。所以,一旦计算出来拾取射线,我们就可以对场景中的原创 2010-08-13 11:31:00 · 1249 阅读 · 1 评论 -
灵活Camera类
class Camera{public: enum CameraType { LANDOBJECT, AIRCRAFT }; Camera(); Camera(CameraType cameraType); ~Camera(); void strafe(float units); //left/right; void fly(float units); //up/down; void walk(float units); //forward/ba原创 2010-08-03 10:41:00 · 1399 阅读 · 0 评论 -
游戏程序员养成计划
与玩游戏相比,写游戏要复杂上千万倍,除了需要掌握通用的编程技巧以外,还要有相当的图形学,物理,数学基础,特别是在国内,由于相关资料的缺乏,更是让初学者无从下手。下面总结了一些入门方法和比较容易入手的资料。 首先你要精通一门高级语言,比如C++或者C#,其次,要有良好的英文阅读能力。对游戏开发者来说英文阅读能力是最重要也是最基本的工具之一,因为你遇到的大部分资源都将是英文的,不要总等着别人为你翻译。慢慢尝试着阅读英文资料,你会发现其实也并没有那么难:) 刚开始,你要做的就是选择转载 2010-08-02 17:19:00 · 1444 阅读 · 0 评论 -
改变颜色的Windows窗体
#include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ HWND hWnd; WNDCLASS wndclass; stati原创 2010-08-01 15:37:00 · 1408 阅读 · 0 评论 -
DX加载.x文件实例
#include #include #include using namespace std;HINSTANCE hInstance;IDirect3DDevice9 *Device = 0;const D3DXCOLOR WHITE( D3DCOLOR_XRGB(255, 255, 255) );//设置全局变量,一个ID3DXMesh对象存储从XFile中加载的网格数据,另外两个变量分别存储该网格的材质和纹理数据ID3DXMesh *Mesh = 0;原创 2010-08-01 10:38:00 · 1615 阅读 · 0 评论 -
d3d读取.x文件
利用.x文件模型渲染三维模型,首先需要将.x文件中的各种数据分别加载到内存中,主要包括顶点数据、材质数据和纹理数据等。网格模型接口ID3DXMESHDirect3D扩展实用库定义了多边形网格模型接口ID3DXMesh来表示一个复杂的三维物体模型,它是一个COM接口,继承自ID3DXBaseMesh。Direct3D扩展实用库函数D3DXCreateMesh()可用于创建一个Direct3D网格模型对象,该函数声明如下:Creates a mesh object using a declarator.HRES转载 2010-07-22 09:13:00 · 3880 阅读 · 0 评论 -
D3DXMatrixPerspectiveFovLH
DirectX中投影变换D3DXMatrixPerspectiveFovLH()其实产生的变换矩阵不是将3D物体转换为2D平面画面的变换。实际上是把3D世界的物体变换到(1,1,0) (-1,1,0) (-1,-1,0) (1,-1,0) (1,1,1) (-1,1,1) (-1,-1,1) (1,-1,1)这个小盒子中。在Jim Adams 的著作和Frank Luna 的著作中都把这个变换矩阵讲成从3D到2D的变换。实际上在DirectX中3D到2D的变换是由SDK自己完成的。而我们要做的是把3D世界变转载 2010-07-22 08:56:00 · 848 阅读 · 0 评论 -
D3DXMatrixLookAtLH
D3DXMatrixLookAtLHBuilds a left-handed, look-at matrix.D3DXMATRIX * D3DXMatrixLookAtLH( D3DXMATRIX *pOut, CONST D3DXVECTOR3 *pEye, CONST D3DXVECTOR3 *pAt, CONST D3DXVECTOR3 *pUp);ParameterspOut [in, out] Pointer to the D3DXMATRIX structure that is the原创 2010-07-21 21:41:00 · 805 阅读 · 0 评论 -
Directx初始化窗体
#include #include HINSTANCE hInstance;LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch(uMsg) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, uMsg, wParam, lP原创 2010-07-19 10:25:00 · 741 阅读 · 0 评论 -
CreateDevice
函数原型:HRESULT CreateDevice( UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface ); 参数:Adapter: 序数所指示的显示器适配器。D3DADAPTER_DEFAULT始终是主要的显示器适配器原创 2010-07-20 17:08:00 · 1825 阅读 · 0 评论 -
D3DXMatrixRotationAxis原理解析
<br />原创 2010-08-03 15:51:00 · 2139 阅读 · 0 评论 -
D3DXMatrixRotationAxis对应的数学公式
D3DXMATRIXA16* MyMatrixRotationAxis(D3DXMATRIXA16* mat, D3DXVECTOR3* vec, float t){ float cost = cos(t), sint = sin(t), one_sub_cost = 1 - cost; D3DXVECTOR3 v(*vec); D3DXVec3Normalize(&v, &v); *mat = D3DXMATRIXA16(v.x * v.x * one_sub_原创 2010-08-03 16:08:00 · 2065 阅读 · 0 评论 -
粒子系统
粒子系统一、 粒子和点精灵粒子是一种微小的物体,数学上通常用点来表示其模型。所以显示粒子时,使用点图元(由D3DPRIMITIVETYPE类型的D3DPT_POINTLIST枚举常量表示)是一个很好的选择。但是,光栅化时,点图元将被映射为一个单个像素。这样就无法为我们提供很大的灵活性,因为实际应用中我们很可能需要各种尺寸的粒子甚至希望能够对这些粒子进行纹理映射。Direct3D8.0引入了一种特别的点图元——点精灵(Point Sprite),该图元极适合应用于粒子系统中。与普通的点图元不同原创 2010-08-12 10:33:00 · 1492 阅读 · 0 评论 -
地形绘制基础
地形绘制基础高度图其实就是一个数组,该数组的每个元素都指定了地形方格中某一个特定顶点的高度值。(另外一种实现方式可能用该数组中的每个元素来指定每个三角形栅格的高度)。我们将高度图视为一个矩阵,这样高度图中的元素就与地形栅格中的顶点一一对应。高度图被保存在磁盘中,我们通常为其每个元素只分配一个字节的存储空间,这样高度只能在区间[0, 255]内取值。高度图有多种可能的图形表示,其中一种是灰度图。地形中某一点的海拔越高,相应地该地点在灰度图中的亮度就越大。1. 高度图1) 创建高度图但原创 2010-08-10 11:06:00 · 1693 阅读 · 0 评论 -
纹理映射的两种方式
纹理映射有两种方式Ø 加载一个已创建好的纹理文件,然后再应用该纹理数据。Ø 另外一种是按顺序逐个计算出纹理内容,即我们首先创建一个“空”纹理,然后再基于一些已定义的参数计算出纹理元的颜色。在地形绘制中,该参数为地形的高度。该方法首先用D3DXCreateTexture创建一个空纹理,然后再将顶层纹理(因为有多层纹理)锁定。至此,开始遍历每个纹理元并对其上色。上色的依据是坐标方格所对应的近似高度。思路是:地形中海拔较低的部分上色为沙滩色,中等海拔的部分上色为绿色的丘陵颜色,高海原创 2010-08-09 15:36:00 · 2907 阅读 · 0 评论 -
设计一个灵活的Camera类
设计一个灵活的Camera类1.1Camera类的设计我们用4个摄像机向量:右向量(right vector)、上向量(up vector)、观察向量(look vector)以及位置向量(position vector)来定义摄像机相对于世界坐标系的位置和朝向。这些向量实质上为相对世界坐标系描述的摄像机定义了一个局部坐标系。由于右向量、上向量和观察向量定义了摄像机在世界坐标系中的朝向,有时我们也将这三个向量统称为方向向量。方向向量必须是标准正交的。如果一个向量集中的向量都彼此正交,且模为1,则称为标准正交原创 2010-08-09 17:25:00 · 1891 阅读 · 2 评论 -
Win-TC下的俄罗斯方块
#include #include #include #include #include #include #include /*定义左上角点在屏幕上的位置*/#define MAPXOFT 9#define MAPYOFT 5/*定义下一个方块显示的位置*/#define MAPXOFT1 13#define MAPYOFT1 -2#define LEFT 0x4b00#define RIGHT 0x原创 2010-08-08 20:10:00 · 1731 阅读 · 2 评论 -
d3d中三维物体到屏幕的呈现
d3d中三维物体到屏幕的呈现,需要经历 (1)世界变换(从本地模型的坐标系下的坐标转换成世界坐标系下的坐标,包括平移,旋转,缩放变换,如果是以本地坐标为参考的话在d3d中是矩阵左乘,如果以世界坐标为参考的话是矩阵右乘,其中的矩阵就是具体的变换矩阵),(2)取景变换(也就是从世界坐标系的坐标到摄像机坐标系下坐标的变换,具体可以这样理解,把摄像机看作世界坐标下的一个空间点,求出从世界原点到该位置的世界变换可以很容易的求出,然后取其反,得出的就是从世界到摄像机坐标系的变换矩阵)(3)投影变换(这个动作将会决定场景原创 2010-08-08 16:09:00 · 1539 阅读 · 0 评论 -
setprecision(int n)等格式函数用法
**这些用法前最好用#include //不要用iostream.h ,会出现好多问题#include // io 流控制头文件, 主要是一些操纵用法如setw(int n),setprecision(int n)//,setbase(int n),setfill(char c)的.▲setw(n)用法:通俗地讲就是预设宽度如 cout结果是:(空格)(空格)255▲setfill(char c) 用法 : 就是在预设宽度中如果已存在没用完的宽度大小,则用设置的字符c填充如 cout结果是:@原创 2010-08-06 22:37:00 · 6694 阅读 · 0 评论 -
Terrain类
#include #include class Terrain{public: Terrain(IDirect3DDevice9 *device, std::string heightmapFileName, int numVertsPerRow, int numVertsPerCol, int cellSpacing, float heightScale); ~Terrain(); int getHeightmapEntry(int row, int col); v原创 2010-08-06 09:24:00 · 1120 阅读 · 0 评论 -
龙书第13章地形绘制的terrain项目的编译和运行出错问题
(注:龙书即:《DirectX9.0 3D游戏开发编程基础》)我在编译第13章terrain项目的时候,发现编译有问题,这和第12章的Camera项目所遇到的编译问题是同一个问题。即timeGetTime()函数的调用缺少库文件.在头文件d3dUtility.h里加上:#pragma comment(lib,"winmm.lib")即可。当然,还要加上:#pragma comment(lib,"d3d9.lib")#pragma comment(lib,"d3dx9.lib")另外,就是运行时出现错误,终止转载 2010-08-04 16:11:00 · 1517 阅读 · 5 评论 -
网格(一)
这里以绘制一个立方体网格为例。创建一个立方体网格涵盖的主题包括: 创建空网格对象; 将立方体的面片数据写入网格缓存; 指定网格中每个面片所属的子集; 生成该网格的邻接信息; 优化网格; 绘制网格。我们首先初始化下列全局变量: ID3DXMesh *Mesh = 0; const DWORD NumSubsets = 3; IDirect3DTexture9* Textures[3] = {0, 0, 0}; std::ofstr原创 2010-07-13 14:31:00 · 886 阅读 · 0 评论 -
网格(二)
例程一:XFile该例程从bigship1.x文件中加载数据。该例程使用了下列全局变量: ID3DXMesh* Mesh = 0; std::vectorMtrls(0); std::vectorTextures(0); 这里我们用一个ID3DXMesh对象存储从XFile中加载的网格数据。另外我们还用两个向量分别存储该网格的材质和纹理数据。首先,实现我们的标准Setup函数。第一步是加载XFile文件。bool Setup(){ HRESULT hr = 0; // //Lo原创 2010-07-15 22:27:00 · 756 阅读 · 0 评论 -
GetAsyncKeyState
功能:确定用户当前是否按下了键盘上的一个键 原型:SHORT GetAsyncKeyState(int vKey); 参数:nVirtKey指出要检查键的虚键代码。结果的高位指出该键当前是否被按下(是为1,否为0)。 常用键的VK值: VK_SHIFT Shift键 VK_LSHIFT 左Shift键 VK_RSHIFT 右Shift键 VK_CONTROL Ctrl键 VK_LCONTROL 左Ctrl键 VK_RCONTROL 右Ctril键 VK_MENU Al原创 2010-07-14 20:51:00 · 2150 阅读 · 0 评论 -
Direct3D绘制几何图
在初始化窗体的基础上,绘制一些简单的几何体的工作,我经过实验,觉得大致是从以下的顺序来实现的。首先要初始化两个局部变量,保存图形的顶点和索引数据,还要有两个全局变量,定义屏幕的分辨率。接着需要定义顶点结构和该结构的灵活顶点格式。在顶点结构中包含位置、颜色等信息。然后接下来就是 Setup函数。Setup函数创建顶点缓存和索引缓存,然后对缓存进行锁定,将顶点数据以及构成几何体的三角形单元的索引数据分别写入顶点缓存和索引缓存。然后对摄像机沿Z轴负方向平移几个单位,以使绘制在世界坐标系原点的几何体处于摄像原创 2010-07-03 14:37:00 · 863 阅读 · 0 评论 -
D3D龙书范例代码结构分析
首先,这个框架有3个文件组成,d3dUtility.h/cpp与d3dinit.cpp。编写的时候应该首先从d3dUtility.h开始。 在这个头文件中,包含了5个函数:initD3D, EnterMsgLoop, WndProc, Release和Delete。其中后两个是两个模板函数,主要用于Release和Delete对象,这两个函数比较简单,这里就不说明了。 接下来,就需要在d3dUtility.cpp中实现这几个函数。由于WndProc牵扯到对游戏的控制(WM_KEY原创 2010-07-04 10:32:00 · 1431 阅读 · 0 评论 -
CreateWindow 与CreateWindowEx
CreateWindowEx 函数功能:该函数创建一个具有扩展风格的重叠式窗口、弹出式窗口或子窗口,其他与 CreateWindow函数相同。关于创建窗口和其他参数的内容,请参看CreateWindowEx。 函数原型:HWND CreateWindowEx(DWORD dwExStle,LPCTSTR IpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HME原创 2010-07-04 08:42:00 · 3567 阅读 · 0 评论 -
绘制旋转Cube图形
cube.cpp#include "d3dUtility.h"//// Globals//IDirect3DDevice9* Device = 0; /***********************************************************************************我们还需要初始化两个全局常量,以定义屏幕的分辨率。******************************************************原创 2010-06-29 11:05:00 · 1215 阅读 · 1 评论 -
SetStreamSource
(渲染数据流序号,顶点缓冲区指针,启始位置,顶点大小)第一个参数:渲染数据流是啥东西,一直不清楚,总是设为0。第二个参数:顶点缓冲区指针。第三个参数:启始位置,这个也不清楚,总是设为0。第四个参数:顶点大小。原创 2010-06-30 20:43:00 · 1135 阅读 · 0 评论 -
D3DXMatrixPerspectiveFovLH
创建一个左手坐标系的透视投影矩阵。 定义: D3DXMATRIX *WINAPI D3DXMatrixPerspectiveFovLH( D3DXMATRIX *pOut, FLOAT fovy, FLOAT Aspect, FLOAT zn, FLOAT zf);参数: pOut [in, out] 指向D3DXMATRIX 结构的操作结果矩阵。 fovy [in] 观察时y 轴方向的角度(弧度),就是观察范围夹角。 Aspect [in] 纵横比,在视空间宽度除原创 2010-06-30 20:41:00 · 1504 阅读 · 0 评论 -
Directx初始化窗体
d3dUtility.cpp#ifndef __d3dUtilityH__#define __d3dUtilityH__#include #include namespace d3d{ bool InitD3D( HINSTANCE hInstance, // [in] Application instance. int width, int height, // [in] Backbuffer dimensions. bool win原创 2010-06-27 20:19:00 · 1666 阅读 · 2 评论 -
Direct3D中绘制
HRESULT IDirect3DDevice9::CreatVertexBuffer( UINT Length, //为缓存分配的字节数。如果想让顶点缓存足够存储8个顶点,该参数需设为8 * sizeof(Vertex),其中Vertex是定义顶点的结构。 DWORD Usage, //指定关于如何使用缓存的一些附加属性。该值可为0(表明无需附加属性)或是以下标记中的某一个或某种组合 //D3DUSAGE_DYNAMIC 将缓存设为动态缓存。 //D3DUSAGE_原创 2010-06-28 14:28:00 · 981 阅读 · 2 评论 -
全局变量、extern/static/const区别与联系
在讨论全局变量之前我们先要明白几个基本的概念:1. 编译单元(模块): 在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌入式下做开发工作的话,那么你可能非常的理解编译与连接的区别!当在VC这样的开发工具上编写完代码,点击编译按钮准备生成exe文件时,VC其实做了两步工作,第一步原创 2010-06-28 21:18:00 · 926 阅读 · 0 评论 -
Directx创建纹理映射步骤
以创建一个纹理四边形为例,记录一下如何对一个四边形进行纹理映射以及如何设置纹理过滤器的一般步骤,如果我们的硬件支持多级渐进纹理映射方式,程序中便可使用D3DXCreateTextureFromFile函数自动创建一个多级渐进纹理链。大致的步骤就是下面四点: (1)构造组成物体的顶点,并为其指定纹理坐标。 (2)用函数D3DXCreateTextureFromFile为IDirect3DTexture9接口加载一种纹理。 (3原创 2010-07-04 09:02:00 · 2575 阅读 · 0 评论 -
碰撞检测
在游戏开发中,经常需要进行碰撞检测算法的实现,例如判断前面是否有障碍以及判断子弹是否击中飞机,都是检测两个物体是否发生碰撞,然后根据检测的结果通过碰撞检测算法做出不同的处理。 进行碰撞检测算法的物体可能有些的形状和复杂,这些需要进行组合碰撞检测,就是将复杂的物体处理成一个一个的基本形状的组合,然后分别进行不同的检测。 下面简单介绍一下两种最基本的形状进行碰撞的时候进行的处理。 1、矩形和矩形进行碰撞检测算法 一般规则的物体碰撞都可以处理成矩形碰撞,实现的原理就是检测两个矩形是否重叠。我们假设矩形1的原创 2010-07-05 15:39:00 · 1631 阅读 · 0 评论 -
Directx字体
在游戏中,我们要向用户显示一些文本信息。而在Direct3D中生成和输出文本有3种形式。一、ID3DFont接口D3DX库提供接口ID3DXFont,该接口用于在DIrect3D应用程序中绘制文本。该接口内部使用GDI(图形设备接口)来绘制文本,因此该接口在性能上略有损失。但是可以处理一些复杂的字体和格式。1.我们用D3DXCreateFontIndirect函数来创建一个ID3DXFont接口对象。为了对我们想要创建的字体进行描叙,必须先填充D3DXFONT_DESC结构。2.一旦获取了ID3DXFont原创 2010-07-11 16:22:00 · 2683 阅读 · 0 评论 -
CreateFontIndirect
函数功能:该函数创建一种在指定结构定义其特性的逻辑字体。这种字体可在后面的应用中被任何设备环境选作字体。 函数原型:HFONT CreateFontIndirect(CONST LOGFONT *lplf); 参数: lplf:指向定义此逻辑字体特性的LOGFONT结构的指针。 返回值:如果函数调用成功,返回值是逻辑字体的句柄;如果函数调用失败,返回值是NULL。 Windows NT:若想获得更多的错误信息,请调用GetLastError函数。 备注:函数CreateFontInd原创 2010-07-12 20:14:00 · 1426 阅读 · 0 评论 -
LOGFONT
结构体原型: typedef struct tagLOGFONT { // lf LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision;原创 2010-07-12 20:01:00 · 1588 阅读 · 0 评论 -
CD3DFont
头文件"d3dfont.h"CD3DFont类构造原型:CD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags = 0L);其中:strFontName——以null结束的字符串,它指定字体类型dwHeight——字体的高度。dwFlags——可选参数。能设置该参数0或者用下面的参数:D3DFONT_BOLD、D3DDONT_ITALIC、D3DDONT_ZENABLE.如:CD3DFont* Font;Font = new CD3D原创 2010-07-12 22:18:00 · 3870 阅读 · 0 评论 -
ID3DXFont::DrawText
函数原型 int DrawText( HDC hDC, // 设备描述表句柄 LPCTSTR lpString, // 将要绘制的字符串 int nCount, // 字符串的长度 LPRECT lpRect, // 指向矩形结构RECT的指针 UINT uFormat // 正文的绘制选项 );参数 hdc: [输入]设备环境句柄。 lpString: [输入]指向将被写入的字符串的指针,如果参数nCount是-1,原创 2010-07-12 22:10:00 · 5260 阅读 · 2 评论