Franco.Chou's Space

Franco's Tech Blog

Monthly Archives: 8月 2009

小朋友的行程


UFA
 
GZ–>SZ–>HK–>Moscow–>UFA  T1 or T2
August 14th
 
UFA–>Moscow–>HK–>GZ
Sep 19th
 
total: 35days
 
counting……
 
 
 
 

无聊,随便谈谈


        最近看了很多关于XNA的资料和代码,自己也做了一些,总还是希望在blog上有所体现。但我并不准备将我的博客搞成是“技术讲解”,因为老实说讲那些东西很枯燥,如果真的要写又有一大堆,更重要的是,网上有一堆资料可以看,系统的看书籍比看只言片语的“技术讲解”要好的多了。我希望将我的博客反应一个“初学者”的心路历程,带给其他的一些“初学者”或者将来的“初学者”一些启示。
       说到书籍,我推荐一本挺不错的书,是关于XNA GAME STUDIO 3.0(目前的最新版),里面讲解的内容还不错,更重要的是,source很有参考价值!
 
       书名: XNA 3.0 Game Programming Recipes
       链接:http://www.riemers.net   (同时,里面还包含了作者的其他书,虽然还没看,不过估计还可以)
       source code:http://www.riemers.net  或者 www.apress.com
 
       我之所以没有给出更加详尽的链接是因为我希望大家还是好好在这些网站上看看,或许有意想不到的所获(你可能需要启用搜索来查询相关资源)
       还有一点要提,如果要学习新技术,一定要看英文原版的书!
 
       说起之前看D3D,果然还是没有白费。XNA的场景初始化的过程几乎和D3D一样,都是先构造view和projection矩阵,参数也一样,只是函数名不同而已。
所以说,从底层开始看还是有好处的 😉
 
       接下来的几篇日志,应当会从 D3D XNA WPF的相关方面进行讨论(虽然他们没有绝对的整体可比性)
 

为了包强,增开CG Tag

一种将XNA(GAME)insert到WPF中的尝试


最近,Rabbit的需要,想要做个Rabbit的导航系统。鉴于XNA强大的图形库,我们准备用它来做。
我们知道XNA是一种微软新推出的跨平台的(当然,仅限于微软的平台–windows和xbox),基于.net的游戏开发工具。
 
 
我们遵照以下步骤。
1.利用XNA GAME STUDIO3.0建立一个游戏,我们可以下载一个现成的,连接在上篇日志中有(克制!写篇日志清醒下),我们下了贪食蛇(MoveTheGrowingCreatureButDoNotCollide)这个项目做测试。
 
2.建立一个WPF BROSWER的工程
 
3.将MoveTheGrowingCreatureButDoNotCollide工程导入WPF项目中。 ADD–> Exsisting Project.  修改property–>application–>outputtype为 class libary  并编译
<这步骤的作用是将该工程打包,作为WPF中的资源库进行引用>
 
4.在MoveTheGrowingCreatureButDoNotCollide工程的references里添加System.Windows.Forms 
   在WPF工程的references里面添加System.Windows.Forms.Integration , MoveTheGrowingCreature ,Microsoft.Xna.Framework.Game 和 System.Windows.Forms
 
5.根据网上的资料(http://petosky.net/node/13)来进行修改。<细节不再赘述,按照上面做就可以>
 
6.如果运行时有错误:找不到材质(资源),那么就查看它所缺的路径,添上资源。将debug/content中的三个xnb文件拷出,放到debug中。
 
7.运行之后截图如下:
 
<我们发现,有个窗体盖住了panel>
 
 
 
<将窗口移开,可以正常游戏>

但是,窗口最小化后发现不能响应键盘消息。

原因分析:XNA本身所带的GAMEWINDOW和PANEL的基类不同,当把GAMEWINDOW的句柄传给PANEL的时候,内容可以显现出来

但是,由于不兼容的关系,还是会出来一个游戏窗口。而消息的路由必须经过该窗口,无论是将它最小化,还是将它强行转化为FORM

Control,并将visible设为false后,都不能响应键盘消息。但是,将游戏窗口直接嵌入浏览器又是不能实现的。这里就有一个瓶颈:有

GAMEWIDOW,太不美观,没有GAMEWINDOW,PANEL又不能响应键盘消息!

后记:XNA作为一个GAME的开发工具,我个人觉得拿它来做插件有些不太合适,就像要在浏览器中嵌入桌面游戏一样。(当然,如果

以实现这样的效果,部署将会非常非常方便!)所以,我个人觉得,如果要做插件,就不要建立GAME了,直接利用XNA里面的图形

库比较好,毕竟XNA里面包装了D3D的库,是.NET中不可多得的比较好图形库!<这里有个比较好的直接用XNA图形库的

例子:http://creators.xna.com/en-US/sample/winforms_series1>

D3D 第一课-初始化解析(Updating)(后加:突然发现这篇很废,可以跳过)


作为D3D的第一课,我首先对D3D的初始化过程进行解析。(解析源码来自:http://www.directxtutorial.com/Tutorial9/B-Direct3DBasics/dx9B10.aspx#still
实现的效果是:
有一个照射光的效果,小盒子不断转动。
 
好,废话不多说,重新贴上源码(你可以新建一个win32程序,直接将源代码黏贴进去,按CTRL+F5运行查看效果)
<沿袭NEHE的作风,我尽量将下面每一句我所知道的都表达出来,很多类型我是从MSDN里面找的,为保持原汁原味可能继续用英语,Updating>
 
void initD3D(HWND hWnd)
{
 d3d = Direct3DCreate9(D3D_SDK_VERSION);              //Create an IDirect3D9 object and return an interace to it. 参数是固定的
 D3DPRESENT_PARAMETERS d3dpp;                         //Describes the presentation parameters.
 ZeroMemory(&d3dpp, sizeof(d3dpp));                   //…套路步骤,清内存,再次重复,很酷很专业
 d3dpp.Windowed = TRUE;                               //如果有一个窗口,则返回TRUE,如果是全屏,则返回FALSE
 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;            //这里涉及到D3D的一个swap机制,可以在tutorial里面看。这个参数指的是swap的类型
 d3dpp.hDeviceWindow = hWnd;                          //标注了back buffer在屏幕显示中的位子和大小
 d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;            //Back buffer的格式(RGB)
 d3dpp.BackBufferWidth = SCREEN_WIDTH;                //Back buffer的宽
 d3dpp.BackBufferHeight = SCREEN_HEIGHT;              //Back buffer的高
 d3dpp.EnableAutoDepthStencil = TRUE;                 //自动设置buffer的比特深度
 d3dpp.AutoDepthStencilFormat = D3DFMT_D16;           //设置一些“如何表现的参数”
 // create a device class using this information and the info from the d3dpp stuct
 d3d->CreateDevice(D3DADAPTER_DEFAULT,
  D3DDEVTYPE_HAL,
  hWnd,
  D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  &d3dpp,
  &d3ddev);  //Creates a device to represent the display adapter.
 //以上都是一些初始化的工作!一个d3d object包括一个“表现的结构”和一个“设备(硬件)”
 //以后的工作,都是直接调节“硬件”进行渲染!
 init_graphics();    // call the function to initialize the cube
 init_light();    // call the function to initialize the light and material
 d3ddev->SetRenderState(D3DRS_LIGHTING, TRUE);    // turn on the 3D lighting
 d3ddev->SetRenderState(D3DRS_ZENABLE, TRUE);    // turn on the z-buffer
 d3ddev->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(50, 50, 50));    // ambient light
}
 
 
 

克制!写篇日志清醒下


今晚还是忍不住下了XNA GAME STUDIO 3.0(下载地址:http://msdn.microsoft.com/zh-cn/xna/default(en-us).aspx 这里应该有持续更新)
 
先解释下什么是XNA GAME STUDIO
XNA Game Studio is a new game development solution targeted primarily at students, hobbyists, and independent game developers. XNA Game Studio works with all versions of Visual Studio 2005 or Visual C# 2005 Express and lets developers create games for both Windows and Xbox 360. XNA Game Studio contains the following:
  • The XNA Framework, a set of managed code development libraries that make it possible for game developers to be more productive when creating games for Windows and the Xbox 360.
  • The XNA Framework Content Pipeline, a set of tools that allow developers to more easily incorporate 3D content into their games
  • XNA Game Studio also contains a full set of documentation, how-tos, and starter kits that demonstrate how best to use the content pipeline and XNA Framework.
  • XNA Game Studio runs side-by-side with other versions of Visual Studio without interference
  • XNA Game Studio has now been released, and can be found here. It supports both Windows and Xbox 360 game development.

然后接下来下了一个demo (大家可以从这里找http://www.xnadevelopment.com/gamedemos.shtml

效果很好!编程很简洁!直接用.NET,很方便!好多资源,好多喜欢XNA做游戏的人!

但是我马上决定,要克制自己!!!!!!!!!!!一定要先认认真真看完D3D,再去学习XNA。因为毕竟D3D是基础,XNA封装了D3D的一些特性。

一定要先认真看完D3D,不要刚喜欢上人家,又伸手去找她的妹妹,太不专一会导致严重的后果!

端详新情人


昨天,我移情别恋到D3D(Tag:OpenGL-暂时移情别恋),那么今天,我就好好来端详一下这位新情人。
 
按照网上tutorial上的例子做了几个例子(http://www.directxtutorial.com/Tutorial9/B-Direct3DBasics/dx9B1.aspx#still有兴趣也是可以去看看)。
D3D是基于COM的,也可以绕过GDI直接对硬件操作。它和OpenGL最大的一个不同时,D3D是为了游戏而设计的,不仅包含图像处理,还包括视频,音频,网络接口等,而OpenGL仅支持图像,而它的好处是跨平台。两者对于图形处理的水准已经不相上下。
既然是微软开发的东西,但是发现很多东西在MSDN里找不到,而且做到后来,发现d3d9x.h这个头文件竟然找不到。我想着为什么d3d9.h可以有,d3d9x.h就不见了呢? google之后发现,windows sdk已经不包含diretx的库了。好吧,老老实实去下一个(http://www.microsoft.com/downloads/details.aspx?familyid=24A541D6-0486-4453-8641-1EEE9E21B282&displaylang=en顺便说一下,要下个微软的库就不要到处google啦,直接去他的官方网站去下,可以下到最新版),下了2009年Sep版(这篇日志时的最新版),一看真的吓了一跳,这个SDK有500多M。为什么?天理不容啊!人家OpenGL要下个库什么的都是不超过1M就搞定了,虽然你包含的东西这么多,但是你凭什么那么大?没有办法,硬着头皮点了download。Thanks to亲爱的实验室网络,4.5m/s的速度很快就下完了。安装完之后,我马上就来看看,她到底有什么料,为什么要这么大!
看完之后,你就会发现,微软是个多么贴心的妈妈啊~生了D3D这样一个好女儿。光光是Samples都占了664M!而且最要命的是,她把Documents也集成进了MSDN去了!
我好感动,顿时泪流满面。新情人给了我一个非常好的印象!

顿时的清爽


Franco 说: 真正的程序员就像是艺术家!
这句话是非常有道理的。
 
心情顿时舒畅,就像此刻的网络一样

暂时移情别恋


最近学了一段时间OpenGL,本来是想要为CSGL作基础,然后往Rabbit上面整合的。但是发现还是用XNA比较好,毕竟开发的东西基于.net,微软对自己东西的支持度总会好一些。在“涉毒未深”之前,我暂时移情别恋一下,去关注下D3D。D3D的标签在OpenGL之后,恩。。也对得起NeHe最近对我的帮助了。
当然,学了一些时间,也不想浪费。于是,在这里写一点关于OpenGL的感想
 
感受1:首先要确定的是,学习OpenGL,必须最好要有Win32或者MFC的基础。
 
感受2:OpenGL学习圈很广,资源很多。(像NeHe,就在上一篇OpenGL日志里标有超链接的那位.)我一直都是支持原创的,但是NeHe的教程我不得不推。
 
关于技术细节,我不想多谈,和D3D间的优劣问题,在未亲自体验前我也不想多说。直接黏贴一些东西过来也没什么意思。
要了解技术细节(当然,如果你是初学者),直接去看NeHe的教程就可以,我就是按照他的教程做了一些东西,感觉很不错。
顺便提一点,最好用glew,因为他包括的东西比较多。当然,用glew.lib之前,一定要先引用了glu.lib,不然就会DLL会链接出错。
(本篇完,OpenGL待续)

Opengl 和 D3D,爱谁多一点?


同样是两个忧郁神秘的女子,
 
一个博爱另一个多姿,
 
更要命的是都有无限灿烂的故事等待我去探知。
 
我站在Windows的国度里,
 
爱上D3D的霸气,
 
而OpenGL像一张网,
 
铺满整个域!
 
哦,我的天!还有他们的妹妹CSGL和XNA!
 
如此神秘!