工作之前的记忆
ProgramRookie
go go go
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
向量的叉乘
叉乘,其实首先在笛卡而空间中认识它,假设C = cross( A, B ), 而A = ( x0 , y0, z0 ), B = ( x1, y1, z1 ),那么A,B的叉乘就是等于C = ( y0 * z1 - y1 * z0, x1 * z0 - x0 * z1, x0 * y1 - y0 * x1 ),我们要清楚,此时的叉乘是独立于任何坐标系的. 为什么呢?我们把坐标系表示成原创 2009-05-26 19:19:00 · 20821 阅读 · 2 评论 -
新的旅途
毕业了,最终放弃了自己坚持多年的游戏之路,加入了Sungard Global Services,虽然有些遗憾,但是Corporate Finance也是我多年来所关注的,因此,也不能说全无收获,希望自己今后在这条开发的路上好好的走下去~~~ 优快云上的XDJM们一起加油吧?原创 2011-04-06 16:04:00 · 728 阅读 · 0 评论 -
win7上出现的VS2003的ASP.NET版本不匹配
安装了Win7之后,今天使用旧项目,安装了VS2003,出现以下提示: ASP.NET版本不匹配 Visual Studio.NET检测到Web服务器运行的是ASP.NET1.0版。 你要创建或打开的Web应用程序可以配置成与ASP.NET兼容。 解决方法: 1、打开IIS,点击根目录 2、右边,“ISAPI和CGI限制”,双击 3、ASP.NET v1.原创 2011-05-04 16:38:00 · 1046 阅读 · 0 评论 -
用纯windows api实现的贪吃蛇代码,写的有点乱,希望高手给些意见
为这个程序花了我三天(当然不是24小时拉呵呵),由于很久没有编程了,所以拿这个小游戏练习一下,让大家见笑了,我觉得自己在程序逻辑方面处理的还可以,但是结构上由于经验不足还是有很多不足之处,而且由于是简单的利用windows api来编程,画面效果可想而知了。我敢于把这个程序贴出来,就算是为了自己开博放个炮仗吧,虽然“声音”小了点。。。还是来说说我的程序,编程前我试着写了个游戏文档,算是用来指导原创 2008-08-27 21:25:00 · 3119 阅读 · 3 评论 -
一点感想
作为面向对象的程序设计者,应该掌握的一条原则就是,应该“针对接口编程,而不是针对实现编程”,我认为,这句话包含两层意思, 一是针对类层次来说的,由于现实世界的复杂性,如果要对现实世界进行抽象的话,必然要涉及继承,因为这样不仅仅能保持程序设计的逻辑性,还可以实现一定程度上的软件复用。但是如果仅仅使用继承的,则会因为父类硬塞给子类它的属性与操作,而必然限制了子类的实现上的自由。 二、原创 2008-09-13 23:23:00 · 619 阅读 · 0 评论 -
鼠标在编程中的一些注意事项
1.获取窗口外鼠标消息如果鼠标在窗口中按下,在窗口外释放,那么会导致在窗口中的鼠标仍处于按下状态,为了正确获取鼠标在窗口外的窗台,应使用SetCapture(HWND)函数来将鼠标缩定在特定窗口中。2.设定鼠标位置在游戏程序中,通常通过SetCursorPos(POINT)函数来为鼠标定位,但是,需要注意的是SetCursorPos接受的是鼠标的屏幕坐标而不是窗口坐标,因此必须使用Cl原创 2008-09-13 23:25:00 · 1429 阅读 · 0 评论 -
Direct Graphics的初始化
在Direct7.0之前,绘图引擎分成DirectDraw与Direct3D,而Direct8.0则针对游戏3D化而将DirectDraw与Direct3D合并,取名为Direct Graphics,专门用来处理绘图影像以及利用3D命令的硬件加速特性来发展更强大的API函数。 首先,要建立一个Direct Graphics环境,先要规划一个程序框架,可以定义一个类,来存放所有与之有关原创 2008-09-15 13:59:00 · 3920 阅读 · 1 评论 -
使用Direct Graphics取得GDI
我们已经完成了Direct Graphics的初始化工作,下面我们可以先看看如何使用GDI来进行绘图操作,虽然Direct Graphics希望用户遗忘Windows的GDI,不过使用GDI却可以更方便的完成工作。 在早期的DirectDraw时代,只要调用GetDC就可以取得绘图页,在Direct Graphics里首先要面对的是如何取得绘图页。 首先,定义两个变量如下:原创 2008-09-15 14:39:00 · 1672 阅读 · 0 评论 -
Abstract factory小议
设计模式之创建型---Abstract factory在谈正题之前,我们来看一个现实生活中的例子,我们去买一台电视,那我们必然去找一家像样的大商场买一台现成的货物,而不可能先去屏幕厂家定做屏幕,然后去遥控器厂家买遥控器,再然后显像管,外壳,散热器……这样做是很没有效率的,作为消费者,我们一般喜欢由商家来为我们搭配这一切,而我们仅仅需要知道产品的性能以及大概效果就可以了。客户不需要知道某品牌原创 2008-09-16 23:13:00 · 674 阅读 · 0 评论 -
Abstract factory 与Builder的比较
很多人都对这两个设计模式的区别不是很清楚,包括我也一样,所以今天特地在这里列举一下他们之间的异同点,来做个比较。(以下简称前者为A,后者为B)一、意图的比较A:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。B:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。从上述可以看出,两者同为对象创建型设计模式,但是前者是为了设计一个互相协作的对原创 2008-09-20 22:31:00 · 887 阅读 · 0 评论 -
shader中的变量和语义
在shader主函数的输入变量必须是用语义或者uniform关键字标记的.否则,将会出现编译错误.输入语义是用来联系shader的给定输入与渲染管线中相应输出的.比如,语义POSITION0就是用来指定来自顶点缓冲相应位置数据的. 由于功能不同,象素与顶点渲染器有不同的输入语义集.顶点渲染器的输入语义用来描述每一个顶点的信息,比如位置,法线,象素纹理,颜色,切线,次法线等.输入语义是直接原创 2009-03-26 19:48:00 · 2394 阅读 · 1 评论 -
声音引擎之DirectMusic(1)---重要概念
一、概念 我在我的引擎使用的是DirectMusic,他是高层的audio API,他比DirectSound方便很多,他可以播放WAV文件与MIDI文件,在这里我主要介绍如何播放WAV文件。 首先,所有的声音的播放都要依赖于两个COM对象,一个是IDirectMusicLoader8,他负责从磁盘上读取声音文件;还有一个是IDiretMusicPerformace,他负责播放原创 2009-07-13 11:23:00 · 1699 阅读 · 0 评论 -
自己对于游戏进程控制的感想
这个暑假,在学习之余,也试着写了一个星期的2D的RPG游戏,由于只是为了体会游戏制作的流程,因此也就只是用简单的windows api来建构游戏引擎,也就是说所有的位图显示都是selectobject进设备中的。但是为了保证屏幕不闪烁,我还是先准备了一个后备设备(HDC backbufferdc),为什么呢?因为可以将所有的需要渲染的内容全部都BitBlt到这个后备设备中,然后再统一Bit原创 2008-09-07 21:19:00 · 1106 阅读 · 0 评论 -
对象池与new重载
string *title = new String( "Kicks" ); 一句再熟悉不过的语句,但是,这句话却包含了两个阶段,第一个阶段,分配存储,第二个阶段是初始化String对象. 首先,我们假设没有对operator new进行重载,而是调用全局的operator new,先来看看它的可能的形式(我根据自己对operator new重载的使用写的函数): v原创 2009-03-27 10:44:00 · 997 阅读 · 0 评论 -
纹理采样
一个纹理采样器包含采样状态,采样状态指定了纹理将如何被采样,并控制采样过程中的纹理过滤.在纹理采样时需要做三件事情:(1)获取纹理(2)声明一个采样器(3)定义采样器. 这里写一个简单实例: texture Tex2D;sampler2D Sampler2D = sampler_state{ Texture = ; MipFilter = LINE原创 2009-03-27 19:31:00 · 6339 阅读 · 2 评论 -
HLSL中的函数
函数的作用是为了降低程序的复杂度。HLSL的函数与C函数类似:他们都有定义与函数体,而且他们都可以有返回值与声明列表。与C函数一样,HLSL通过参数列表与返回值类型进行匹配。与C函数不同的是,HLSL入口函数使用语义来将函数声明绑定到SHADER的输入输出上。这使得把缓冲区数据绑定到SHADER上变的容易。函数包含一个声明与一个函数体,声明必须在函数体前。下面分析一下这个函数:fl原创 2009-04-01 17:36:00 · 2754 阅读 · 0 评论 -
应用程序与shader交换场景数据浅析
Shader中的场景信息,也就是那些被写入常量表的全局数据,是与应用程序的相关数据绑定的。它们包含渲染一个shader所需要的各种渲染状态,就好象是在应用程序和shader之间的一份契约。Shader知道,它必须依靠应用通过特定变量来提供确定的数据,才能完成它的任务。没有这种场景数据,shader不能凭空操作,甚至连最简单的操作也不能执行。注意这种数据是单向的,只能从应用到shader中去,而且每原创 2009-04-03 13:45:00 · 933 阅读 · 0 评论 -
光模拟基础(2) 光源
在基本光照模型基础上,今天探讨一下如何建立各种光源模型. (1)方向光(或称平行光) 方向光可以看作太阳光,为什么会有白天黑夜呢,就是因为太阳只能照向地球的一个面( dir ),也即一个方向,而且即使地球绕太阳转动时距离会变化,太阳光也没有衰减(no pos, no attenuation 当然,这里是近似的). dirLight = emissive + ambi原创 2009-05-20 19:44:00 · 1229 阅读 · 0 评论 -
光模拟基础(1) 基本光照模型
1.基本光照模型:sufaceColor = emissive + ambient + diffuse + specular以下是公式各个项的解析: (1)emissive放射光 它是独立于所有光源的,是单纯由物体材质产生的光(说句废话,不能作为光源照亮其他物体,其实在shader实现里很明确) emissive = Ke; 这个公式明显可以看出,光照原创 2009-05-19 20:38:00 · 2704 阅读 · 0 评论 -
线形变换专题(1)
首先,我们要明确,一个变换( 也可以理解为一个对向量进行处理并返回处理后的向量的函数 )能够被称为线形变换,需要满足的条件是: L( cU + V ) = cL( U ) + L( V ) ----- 为什么是这样恐怕要查下线形代数的相关资料了 其中cU + V叫做两个向量的线形组合, 其中L()就是所谓的线形变换. 旋转变换:M 在DX中,U =原创 2009-05-27 19:47:00 · 1137 阅读 · 0 评论 -
[转载] c语言中的结构(struct)和联合(union)简介
联 合(union) 1. 联合说明和联合变量定义 联合也是一种新的数据类型, 它是一种特殊形式的变量。 联合说明和联合变量定义与结构十分相似。其形式为: union 联合名{ 数据类型 成员名; 数据类型 成员名; ... } 联合变原创 2009-04-23 18:46:00 · 981 阅读 · 0 评论 -
在基于shader的D3D程序中实现2D面板
3D游戏中,很多东西都需要以2D的形式展现,比如人物的状态栏,物品栏等,那么如何才能在3D场景中放置它们呢?我在这里介绍一种通过简化变换过程而实现的方法. 大家知道,一个模型顶点在显示到屏幕上,一共要经过4次变换,分别是世界变换,摄象机变换,投影变换以及视口变换.在世界变换中,我们通过一个仿射矩阵把这个顶点放置到世界的相应位置;在摄象机变换中,我们以摄象机作为原点把顶点放置到相应位置;而原创 2009-04-23 18:49:00 · 1242 阅读 · 0 评论 -
如何利用Composite模式实现多样化的粒子系统
首先,我的粒子是采取广告板的方式来表现的,因为这样才能给我实现多样化粒子系统的能力. 具体做法是,将广告版看成是Leaf,而粒子系统看成Composite,那么利用Composite模式既可以让广告板单独使用,又可以用多个广告板组成复杂的粒子系统,这是灵活性1. 另外,我们知道Composite模式是可以组成一个树型结构的,那么粒子系统需要树型结构吗,答案是肯定的,比如你模拟火原创 2009-05-20 10:29:00 · 696 阅读 · 0 评论 -
在Octree场景下的多层次node包围盒问题
这两天遇到了一个问题(毕竟接触ogre不久,可能问题比较弱智哈),由于我把模型用OSMLoader的演示方法导入,它具体是通过一个场景(.osm文件)导入后,将其中的子模型分别用一个node保存,如果你提供了一个node(暂订叫rootNode),那么所有的子模型node都会添加rootNode下. 这样本来也很没有问题,毕竟如果我用.osm导入一个大场景,为了处理碰撞,我肯定要把各个子原创 2009-09-18 17:12:00 · 1674 阅读 · 0 评论 -
C语言中rand()函数的用法
函数rand所产生的随机数实际上是伪随机数,即反复调用函数rand所产生的一系列数似乎是随机的,但每次执行程序所产生的序列则是重复的。要产生真正的随机数序列,必须在每一次运行前为rand函数提供不同的种子,这是由srand函数提供的。所以加上srand(time(NULL))就可以产生真正的随机数了。 #include #include #include #incl原创 2008-09-06 00:25:00 · 4486 阅读 · 0 评论 -
DirectSound的应用
如果只使用PlaySound()这个API函数来表现声音效果的话,那么就无法表现出声音的混音效果,因为PlaySound在播放另一个声音时,必然会导致现有声音的停止。因此,使用PlaySound()要想构建出一个包含丰富音乐与音效的游戏世界是不现实的。 而DirectSound就可以完美的解决混音问题,而且它直接针对硬件编程,最大程度上减小了游戏进程逻辑对于声音播放效果的影响。原创 2008-09-14 12:50:00 · 8304 阅读 · 2 评论 -
获取加载进ID3DXMESH后的.x文件的信息
通常,我们获得了一个LPD3DXMESH指针来保存一个.x文件的顶点与索引信息,但是,我们通常会需要直接针对顶点来做一些事情,比如,求包围盒等。那么这个时候我们就需要提取模型中的相关顶点信息。接下来,我就简单的说一下我实现提取顶点位置信息的过程。大家首先要知道以下这个方法: static LPVOID pV; pMesh->LockVertexBuffer原创 2009-04-01 17:33:00 · 2416 阅读 · 2 评论 -
如何高效的对可移动物体进行四叉树管理
首先,我要假设你已经对一个空间完成了四叉树划分,并得到一棵树( root ),那么对于静态物体,很明显你只需要在预处理阶段一次性插入即可,并且在游戏运行阶段你都无须去关心它们( 除非你用一颗炸弹把它们炸飞,不过那时侯你只要调用树的删除方法就可以了 ). 但是,对于动态物体,你就必须时刻关心它们的动向,因为一旦它们离开了原本所依附的空间节点的区域,而在树中却没有即使的更新,那么就会得到错误原创 2009-05-16 14:51:00 · 2738 阅读 · 2 评论 -
如何利用Memento模式设计存档
所谓存档,实际上就是事先将物体状态暂时保存为一个副本,然后在必要的时候利用副本进行恢复,例如在仙剑里,我们在与厉害的boss过招时,一定会先存档,如果一旦不幸牺牲,就可以利用存档来重新开始,这里的存档,就涉及人物状态,场景状态等. 以人物状态的恢复为例,如果使用memento模式来实现,我们需要三个对象:人物类,状态存储箱,存储箱管理者,这里对于什么是memento模式就不细说了,给出简单原创 2009-05-19 14:00:00 · 882 阅读 · 0 评论 -
如何实现D3D全屏与窗口的转换
有很多游戏会提供这样的功能,比如足球经理,生化危机,魔兽世界等,这样做最大的便利,是让你可以在玩游戏的同时做其他事情( I Guess)。1.首先要做的事情是为D3DPRESENTATION_PARAMETERS设置好与此有关的参数,简单的说就是,我们必须要让device明确知道当前的top窗口是哪个,并且要知道这个窗口的长与宽,这样device才能准确切换。2.如果是从全屏幕切为原创 2009-06-06 17:03:00 · 5811 阅读 · 1 评论 -
引擎底层对实体方位的操作
这里的实体,指的是像摄像机,几何体集这些概念,而方位,是指设置位置与朝向。在游戏引擎的底层接口,需要设置两个方法,一个设置放置的位置,一个是设置放置的朝向。从而可以把这些方法提供给更高的抽象层次调用。 对于位置的设置,相当简单,只需要修改位置向量就可以了。 而对于朝向,由于需要关心三个轴向,所以可以采取以下方法: (1)设置新的朝向 (2)根据新的朝向重新计原创 2009-07-19 14:14:00 · 672 阅读 · 0 评论 -
MFC对话框控件---Edit Control
Edit窗口是用来接收用户输入最常用的一个控件。创建一个输入窗口可以使用成员函数: BOOL CEdit::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff ); 其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CH原创 2009-11-16 16:08:00 · 3994 阅读 · 1 评论 -
我项目中使用的Facade模式
Facade模式,是希望简化原有系统的使用方式,来定义自己的接口。按我的理解是,如果符合以下条件的一个或者多个,就应该使用这个模式: 1.如果一个项目需要借助现有代码,而项目组的大多数成员都不了解代码提供的接口 2.系统非常复杂,从零开始学习的时间的机会成本很高。 3.只需要使用代码的一部分功能。 4.原有系统提供的接口设计相当糟糕。 这样做原创 2010-02-09 19:34:00 · 1063 阅读 · 0 评论 -
安装VS2003要求反复重启的解决方案
今天在安装Visual Studio 2003时,安装程序要求先重启计算机,重启之后再启动安装程序,依然要求重启计算机,如此一直反复下去。无奈Google了一下,发现这居然是个常见问题,解决方法是删除 HKLM/SYSTEM/CurrentControlSet/Control/Session Manager 下的 PendingFileRenameOperations 键就可以了。看了看我机器原创 2010-02-13 13:29:00 · 2336 阅读 · 0 评论 -
UML类图,以及对象关系的总结
1. 类的概念类,相当于描述了一群潜在对象。他们享有共同的结构,行为,约束和语义。在类中,使用属性来表达对象的结构,使用操作来表达对象的行为。 2. 类对象之间的关系2.1 关联关联是对象之间最常见的关系,用来连接有结构关系的对象。如果说A类与B类相互关联,那么A类对象与B类对象之间会产生交互关系,但是双方互相都不影响对方的生命周期。原创 2010-01-20 15:48:00 · 963 阅读 · 0 评论 -
如何实现一个带引用记数的智能指针模板
RAII( resource acquisition is initialization ),所谓初始化即资源获取,它认为一个资源应该利用对象管理设施来管理,也就是说,你需要一个资源,你用一个对象的构造函数来获得它,用析构函数来释放它. 智能指针技术,是这一思想的完美体现,它即可以像内建指针(即你new得的对象地址指针)那样操纵对象,又可以跟踪与控制资源的生命期. 为智能指针添加引用原创 2009-05-21 18:42:00 · 1236 阅读 · 0 评论 -
同步与异步
虽然在操作系统的课程讲的很多了,但是还是需要再通过写的方式加深印象. 同步( synchronous ),即程序1调用程序2时,程序1需要等待程序2完成回来,程序1才可以继续下去. 异步( asynchronous ),即程序1调用程序2时,径自继续自己的下一个动作,那么两者之间就是所谓的异步. 如,在Win32 API中的SendMessage()就是同步行为原创 2009-05-27 15:46:00 · 914 阅读 · 0 评论 -
为Win32建立临界区
临界区,可以看作是对一个需要操作共享变量的代码段,在多线程并发的情况下,为了不至于某个线程会取得脏数据,需要控制同一时刻( 这里用时刻好象不太确切,应该说,某个线程处理这个共享变量到一半,时间片到,而得到时间片的线程也要对这个共享变量进行操作 )进入临界区的线程. 在Win32中,有一个CRITICAL_SECTION变量,你需要做的就是在建立该变量后通过它来为资源声明一个保护,示例程序原创 2009-05-27 15:54:00 · 1394 阅读 · 0 评论 -
游戏引擎中物体的组织
1.一切都以空间为根本 对于3D渲染来说,能够剔除的东西都应该剔除,所以我们需要知道当前空间是否可见,如果不可见,对不起,这个空间中的物体就都不应该作为可见物体来看待,因此,物体之所以存在,就是因为有空间这个概念,一个空间就应该代表一个独有的本地坐标系,同时它又在世界中占据一个一定大小的位置,而这个大小,则应该根据这个空间容纳物体物体的多少来定. 2.抽象出空间与物体原创 2009-07-04 15:09:00 · 1218 阅读 · 0 评论 -
如何高效的载入并组织.x文件数据
1.为什么要.x文件 在我的引擎中,抽象出了Geometry的概念,它包含了顶点缓冲与索引缓冲的数据,用来负责组织出几何体。但是用代码画出有趣的东西是愚蠢的,因此,我在引擎中实现了.x文件读取子系统,通过读取.x文件的数据来生成对应的Geometries,因此我又抽象出Mesh的概念,来包含所有的由一个.x文件所能产生的Geometries. 一般的,我通过.x的文件名来读取并原创 2009-07-07 13:25:00 · 968 阅读 · 0 评论
分享