自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(43)
  • 收藏
  • 关注

原创 CEGUI-硬盘文件读取机制

CEGUI从硬盘读取文件是通过ResourceProvider接口来完成的,它将具体的文件夹地址和一个字符串形成映射,这样在读取文件的时候就不用再输入长长的地址,而只用输入一个映射名就可以了,该接口最重要的一个方法是loadRawDataContainer(const string& filename, RawDataContainer& output, const string& resou

2013-06-07 18:16:27 155

原创 2013.6.7 查找文件夹中符合要求的文件名

1._findfirst和_wfindfirst:搜索与指定的文件名称匹配的第一个实例,若成功则返回第一个实例的句柄,否则返回-1L#include#includeint main(){long Handle;struct _finddata_t FileInfo;if((Handle=_findfirst("D:\\*.txt",&FileInfo))==-1L)printf(

2013-06-07 18:06:35 465

原创 CEGUI-渲染流程

CEGUI的渲染用到了“渲染到纹理”:每一个对话框或者其他复杂的界面元素首先渲染到一个纹理当中保存起来,如果这个对话框没有任何外形的改变,那么以后的渲染都直接使用这个纹理,而不用再把这个对话框的各个子元素都渲染一遍。这即缩短了渲染流程,同时也减少了提交给Gup的面片数目。游戏运行的时候,除了当前操作的对话框以外,其他界面元素一般都是不变的,所以这种渲染方式效率比较高。渲染相关和几个核心

2013-05-16 18:49:35 768

原创 2013.4.27-C++11 消息转发和处理解耦

今天看了一下Mark写的那篇解耦消息转发和消息处理的文章,感觉很给力,也顺便了解了一下C++11的function和bind,把文章链接记在这里http://blog.csdn.net/fjb2080/article/details/7527715mark那个系统的类图如下用CmdCallback模板类封装消息处理函数,之所以是模板,是为了在这一层,做消息类型的转换

2013-04-27 18:43:45 401

原创 CEGUI-属性系统

程序在运行的过程中,经常需要改变一些对象的属性值,例如改变某个对话框的横坐标。这一般是通过调用该对象的某个特定方法实现的,以改变对话框横坐标为例,这个方法可能是CGUIDialog::SetX()。CEGUI将这种属性操作进行了提炼,在上层形成了一个公共的接口,以统一的方式处理所有属性,为其它一些功能,例如动画功能打下了基础。属性系统类图如下各种不同的属性类派生自Pro

2013-04-24 18:46:25 916 1

原创 CEGUI--动画系统

CEGUI的动画系统实现了以下的功能:1.通过属性系统驱动,即在每一帧通过将某种属性设为不同的值,实现该属性的动画;2.驱动方式分为直接设值,在原有值上加一个值,和在原有值上乘一个值;3.动画曲线通过关键帧控制,关键帧包含时间点和值,值可以是直接设置的,也可以是动画开始时,从驱动目标上取的属性值,该属性可以与被驱动的属性不同;4.由一帧到另一帧的移动方式分为匀速、加速、减速和离散;

2013-04-10 12:24:13 1395 1

原创 2013.3.7 Havok Animation2

今天看了一下Demo的代码,大致明白了项目需要使用的那些功能该怎么用。在Demo中,动画分为两种,全身动画和上身动画。任何时候,人物身上都有一个全身动画在循环播放,全身动画的切换通过NormalizeMixer的Easeout和EaseIn函数完成,即将旧动作传人Easeout函数,将新动作传人EaseIn函数,然后人物就会平滑地从一个动作过度到另一个动作。上身动画并不是循环播

2013-03-07 18:14:58 586

原创 2013.3.6 Havok Animation

今天终于把Havok Animation的文档大致看了一下,这一块功能还是蛮多的,但我们项目应该只需用简单的骨骼动作驱动就可以了。下图为最基本的骨骼动画数据图。当美术创建完人物3D模型(含骨骼)并依据骨骼设定好人物动作后,就到程序员出马了。模型顶点数据读入Entity中,骨骼数据应该是读入了Config中,动作动画数据读入Anim Sequence中,因为动画数据其实是骨骼在一些关键时

2013-03-06 11:59:10 980

原创 2013.2.19 忏悔一下--野指针造成的当机

昨天出了一个bug,我一直以为是程序底层有问题,不是我的问题,结果没有仔细去查,结果最后发现还是自己的问题,通过这件事可以看出,我的态度还有看问题的方式都是有问题的啊。情况是这样的,我写了一个老玩家回归奖励的界面,当这个界面存在的时候,不断的跨场景就有几率出现当机,而且每次当机的地方都不一样,但都是很底层的位置。我一开始以为是底层代码有问题,只是我这个功能把它引发出来了,所以查的时候也

2013-02-19 11:54:25 346

原创 2012.1.21 CEGUI 动画系统、ChainedXMLHandler、xsd文件

1.CEGUI的属性系统非常方便非常强大,只需向PropertySet::setProperty函数中传人属性名和属性值,就可以设置了。方便的代价是效率,无论何种类型的属性值都是以字符串的形式传人的,在调用真正的属性设置函数进行设置时,再把字符串转化为真正的类型值。如果只是在初始化时,或者界面响应用户操作时,以这种形式进行设置,那也没什么大不了,但如果是在每帧里面都这样设,我感觉效率上有点吃不消。

2013-01-21 17:39:45 435

原创 2012.12.13

1.控件的创建过程解析.layout文件的时候,会生成控件,控件的数据大致是在4个步骤里面被填充的:(1)控件的构造函数,这个里面一般只注册属性;(2)WidgetLookFeel::initialiseWidget函数,这个函数里面会使用相应的LookNFeel信息填充控件,具体而言就是设置状态图片,增加子控件,添加属性,设置属性等;(3)Window::initialiseCo

2012-12-13 20:47:20 255

原创 2012.12.12

1.CEGUI中的PropertyCEGUI中Property可以分为三类,标准Property,UserDataProperty,和LinkProperty。标准Property是就是之前讲过的那一种,他们都有自己的实体类,派生自Property,而且每个实体类,全局只有一个实例,他们的get/set函数一般都会进行一些内部操作,例如设置窗口可见性。UserDataProperty都

2012-12-13 10:00:16 305

原创 2012.12.10

看了一下LookNFeel系统,总结一下。WidgetLookManager:管理WidgetLookFeel对象,其实就是map对象的一个封装。WigetLookFeel包含一个wigdet的外观信息,例如FrameWindow的外观信息。Property有三类:1.最简单的2.PropertyDefinition和Window里面的Userdata相应3

2012-12-10 18:49:54 109

原创 2012.12.5

1.关于RenderingWindow不是只有FrameWindow可以拥有RenderingWindow,CEGUI中所有的Window对象都可以拥有,调用Window::setUsingAutoRenderingSurface(true),就会为Window对象实例化一个RenderingWindow,该Window的内容首先会渲染到该RenderingWindow对应的纹理中cache起

2012-12-05 20:31:49 335

原创 2012.12.4

1.CEGUI中的连击设置所谓连击,即在一个窗口上面按下鼠标左键(其他鼠标按键也可以)不放,该窗口就一直收到鼠标按键按下的消息。这个功能通过Window::setMouseAutoRepeatEnable打开,Window::setAutoRepeatRate设置连发间隔时间(rate应该是频率啊,怎么叫这个名字,还是我英语有问题),Window::setAutoRepeatDelay设置按下

2012-12-04 19:31:57 340

原创 2012.12.3

1.RTTI的一种代替实现方式struct A{ virtual bool CanConvertTo(const string& type) { return type == "A"; }};struct B : public A{ virtual bool CanConvertTo(const string& type) {

2012-12-03 20:31:07 263

原创 2012.11.30

1.CEGUI如何把一个按钮图片画到屏幕上的今天大致看懂CEGUI如何把一个按钮图片画到屏幕上的啦,细节还有很多没整明白,就说个大概吧。首先要讲清楚,从DX的角度出发,用户要把一个按钮图片画到屏幕,到底是干了什么,其实很简单,就是把一个四边形面片提交给DX,然后让DX画,这个四边形面片包含以下信息:(1)面片对应的纹理;(2)面片的4个角在该纹理中的纹理坐标;(3)面片绘制在屏幕(

2012-12-03 10:00:29 310

原创 2012.11.30

1.CEGUI如何把一个按钮图片画到屏幕上的今天大致看懂CEGUI如何把一个按钮图片画到屏幕上的啦,细节还有很多没整明白,就说个大概吧。首先要讲清楚,从DX的角度出发,用户要把一个按钮图片画到屏幕,到底是干了什么,其实很简单,就是把一个四边形面片提交给DX,然后让DX画,这个四边形面片包含以下信息:(1)面片对应的纹理;(2)面片的4个角在该纹理中的纹理坐标;(3)面片绘制在屏幕(

2012-11-30 14:49:56 114

原创 2012.11.27

《深度探索C++对象模型》已经看完了。最后一章看得没什么滋味,看着看着就睡着了,不知道为什么这几天很没精神,也可能是这书看得有点久了,就兴趣不大了,好像我看书总是这样,越到后来收到的效果越小,看来以后要加快看书的速度。

2012-11-27 11:52:09 108

原创 2012.11.23

1.获取程序块运行时间思路很简单,就是在程序块的开头和结尾取两次系统时间,然后一减就可以了,取系统时间的方法主要有三种:(1)秒级time_t rawtime;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );int secs = timeinfo->tm_sec;(2)毫秒级

2012-11-23 18:57:18 252

原创 2012.11.22

1.C++函数调用的实现将虚函数、多重继承、虚继承加入考虑后,C++的函数调用变得很复杂,其实取到这个函数地址还是很简单的,无非就是某个地方存着一个函数表,然后对象中的某个地方存着这个表的地址,通过一步间接地址计算就可以找到这个函数地址了。难得是,在多重继承和虚继承的情况下,调用函数时,是要偏移this指针的,例如以第二继承链上的类的指针,调用虚函数,而该虚函数又在最后的派生类中被重载,那么就

2012-11-22 21:30:39 259

原创 2012.11.20

1.查看类的数据成员在内存中距离对象首地址的偏移量struct S{ int a, b, c;};int main(){ prrintf("%p/n", &S::a); prrintf("%p/n", &S::b); prrintf("%p/n", &S::c);}输出结果为0、4、8。&S::a等的类型为int S::*。2.inl

2012-11-20 19:32:01 217

原创 2012.11.19

1.printfprintf("%4d", 12),打印结果为  12(空格空格12),4的含义是如果打印的数字不足4个,则用空格补齐。printf("%04d", 12),打印结果为0012,04的含义是如果打印数字不足4个,则用0补齐。2.关于虚函数表指针设置的时机在一般情况下,每个类在构造和析构的时候,在运行函数体之前都需要首先将自己的vptr指向为当前ctor或者d

2012-11-19 21:25:25 279

原创 2012.11.16

1.default constructor若为显式定义默认构造函数,编译会在下面四种情况下隐式定义默认构造函数:(1)某个数据成员对应的类型有默认构造函数;(2)基类有默认构造函数;(3)有虚函数表指针;(4)有虚成员数据块指针(虚继承);隐式定义的默认构造函数只调用(1)(2)的默认构造函数和初始化(3)(4)的指针,不会再做任何其他的事。在显示定义的任何构造函数中,

2012-11-16 18:37:47 257

原创 2012.11.15

1.鼠标是否在对话框内的判断一个对话框有一个区域,也就是一个rect,若鼠标的坐标在这个rect内,则判断鼠标在对话框内,否则不在。在我们游戏里面,这个rect是根据对话框的背景图生成,所以如果控件在背景图之外了,点击这个控件可能会没反应,因为系统判断你的鼠标根本不在这个对话框内,所以点击消息也不会发送这个对话框的相应函数中。这个时候的办法一般是,重载对话框类的OnHitTest(Point

2012-11-15 19:42:13 288

原创 2012.11.9

1.图的广度优先搜素这两天在做全地图寻路,用到了图的最短路径算法,因为无权值,所以就是最简单的广度优先搜索,说是最简单,但对于我也不是不用动脑子就能写,我自己先根据记忆写了一个,然后再把《算法导论》找来,看了一下里面写的,结果果然我把比较妙的一部分没写出来。广度优先搜索形象得说,就是一个点被点亮,然后这个点周围一圈点被点亮,然后周围一圈点的每一个点的周围一圈点被点亮,如此下去,要解决的一个问题

2012-11-09 18:52:16 317

原创 2012.11.6

今天大致看了一下LookNFeel系统,这个系统比较重要的部分是为控件找到相应的图片,并确定这些图片的位置,图片的查找比较好理解,虽然层次多了一些,但最终就是定位到一个Image,比较麻烦的是位置的确定,这里涉及绘制区域、图片在ImageSet里面的区域,各种缩放以及对齐方式等问题,比较复杂,现在没有整得很明白,明天再接再厉。控件图片最后一层是ImagerySection,它里面又有多

2012-11-06 18:53:08 357

原创 2012.11.5

1.CEGUI的GeometryBuffer该类包含两部分数据,一个是之前说的面片数据,以3D渲染的观点来看,这个数据可以被看成是模型坐标系下的数据,另外一部分就是将模型坐标系下的数据转换到世界坐标系下所需要的数据了。当用户移到一个对话框的时候,这个对话框的面片数据并不发生变化,不用经过render流程,改变的只是第二部分数据。2.各个类所代表的东西GeometryBuffer

2012-11-05 20:44:19 241

原创 客户端崩溃查找

1.首先取得崩溃地址:客户端崩溃时,会有一个log文件,该文件有一行写着Exception Address,后面的数字就是程序崩溃的地址。2.定位崩溃函数和崩溃语句的地址偏移:每次VS编译客户端的时候会生成一个.map文件,将崩溃的那个客户端对应的.map文件用ViewSymbol打开,然后输入1中得到的地址,点击查找,结果中会出现一段信息,该信息中第一行“?”和“@”之间的英文就是崩溃的函数

2012-11-05 15:07:34 324

原创 2012.10.30

1.字符串可以分开写const char* p = "aaa"   "bbb"等价const char* p = "aaabbb".2.初始化引用的效率struct S{};S& create(){ return *new S;}int main(){ S& r1 = create(); S& r2(create());}用VS2

2012-10-30 11:12:26 358

原创 2012.10.29

1.D3D渲染小知识点D3D可以渲染到屏幕也可以渲染到纹理,但无论是哪一种,从代码上来讲,它都是渲染到D3DSURFACE中,在渲染之前,要通过D3DDEVIECE::SetRenderTarger来设置。屏幕的Surface好像是由D3DDevice自动拥有的,而纹理的Surface要通过D3DTextrue::GetSurfaceLevel获取。2.与1相关的CEGUI渲染小知

2012-10-29 18:50:53 274

转载 2012.10.26

好久没写了,并不是没有学习,而是最近在看CEGUI的渲染逻辑,我看得超级慢,看了好多遍都没弄明白,不过今天终于看懂了,今天就简略的写一下,等过一段时间完全理解透彻了,再写一个完成的。首先要说的是,CEGUI每个控件都用GeometryBuffer对象,这个对象中存着渲染该控件所需的面片数据。CEGUI出于效率的考虑,它的渲染分为两步,第一步是计算每个控件的面片数据,并保存到其Geome

2012-10-26 18:06:00 230

原创 2012.10.18

1.每一个Window对象都拥有一个WindowRender对象,负责其释放,所以WindowRender的管理器和Window的管理器不一样,它不用保存WindowRender对象的指针。现在不清楚为什么每个Window对象都要有一个WindowRender对象,为什么不能一种类型只有一个WindowRender对象。2.调用窗口管理器销毁Window对象的时候,并不是立即释放的,只

2012-10-18 16:56:49 82

原创 2012.10.17

1.CEGUI中每个Window实例都有一个map对象,里面记录属性名和属性的映射,这个一开始让我觉得很奇怪,因为同一类的Window,这个对象应该是一样的,那么应该每个Window类有一份数据就可以了。如果要这样实现,那么PropertySet就得是模板类,而由于Window继承自PropertySet,所以Window也成了模板类,这样Window就不能作为抽象基类使用了,所以如果既想Wind

2012-10-17 20:13:17 287

原创 2012.10.11

1.CEGUI中的property每一种类型的property在程序中只有唯一一个静态对象,它并不保存所谓的属性值,它只是一个代理者。以Property::set为例,Property::set(PropertyReceiver* receiver, const String& value)该方法将receive转换为某种对象指针,然后以value为参数调用该种对象的某个方法,一种Pr

2012-10-11 18:56:43 226

原创 2012.101.10

1.被创建的window的名字.layout文件的根窗口有一个名字,假设为WindowABC,使用如下代码读取.layout文件生成窗口时CEGUI::Window *newWindow = CEGUI::WindowManager::getSingleton().loadWindowLayout("MyConsole.layout");newWindow的名字就是WindowAB

2012-10-10 16:26:11 100

原创 2012.10.9

1.D3D设备丢失程序运行的过程中,若锁定计算机,然后再解锁,会出现设备丢失,IDirectc3DDevice9::TestCooperativeLevel会返回D3DERR_DEVICELOST,若改变电脑的屏幕分辨率,或者色彩模式,IDirectc3DDevice9::TestCooperativeLevel会返回D3DERR_DEVICENOTRESET。CEGUI的处理方式是,前者的情

2012-10-10 11:26:58 273

原创 2012.9.28

1.Falagard skinning systemCEGUI中控件的定义有三部分组成, Window,Renderer和WidgetLookFeel,前者定义逻辑单元,中者定义渲染单元,后者定义外观熟悉。以Button为例,它的window是CEGUI::PushButton,Render是Falagard::Button,外观可能是Taharaez/Button。CEGUI::PushBu

2012-09-28 18:59:54 568

原创 2012.9.26

1.什么是Imageset一个imageset由一个.imageset文件和一个图片文件组成,该图片文件是一张大纹理,许多的小图片(例如按钮的正经按图标)分布其上,而.imageset文件标示这些小图片在这张大图片上的位置,这些小图片在CEGUI里面称为image。2.什么是resource group一个resource group就是一个键值对,键是一个标签,例如“imag

2012-09-26 10:41:11 891

原创 2012.9.25

1.环境变量在”我的电脑-高级-环境变量“中设置。环境变量就是一些键值对,例如CEGUI--D:\CEGUI,在VS中,include文件目录以及其他文件目录的指定都可能使用到环境变量,所以以后如果编译别人的工程,找不到文件时,可以去查一下目录设置,然后添加或者修改一下环境变量就可以了,不用再直接添加完整路径。2.生成事件在工程属性页的”配置属性-生成事件“中有几个事件页,通过

2012-09-25 15:32:54 892

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除