最近在网上突然冒出了一款3D的网頁游戏因为它使得我对网页中一些招人诟病的问题有了新的认识,让我产生了想要研究一下的想法
想要制作网页中的3d游戏,有这样几個技术问题是需要考虑的:
本文就是来解答这些问题中的一部分并且给出具体的实现方案。
目前浏览器的插件技术还是蛮多的不过能夠流行起来的不多。之前因为浏览器插件安全的问题导致大部分人都对插件有十分的警惕。
ActiveX是微软提供的浏览器插件技术wiki上的介绍:。我实在是难以搞清楚微软这些年来提供的几个技术之间的关系OLE、ALT等,包括现在最新的.Net也是一样要学习微软的这套框架,光理解其中嘚概念都需要花费非常多的时间加上代码复杂,远不如开源技术来的直接和清晰
我这里使用的是VS2005,新建一个“MFC ActiveX控件”工程
根据向导,它会自动帮你创建一个后缀名为OCX的插件的工程要调试运行,需要修改下项目属性改成“ActiveX控件测试容器”,如下图:
这是一个工具專门用来加载ActiveX控件,每次调试打开这个界面后还需要手工点击菜单:编辑->插入新控件,找到你创建的这个OCX插件如果在弹出的列表里面沒有你制作的这个插件,就需要重新编译下(编译的最后会重新注册一次控件当然你也可以用regsvr32.exe或者其他工具来手工注册)。
当你插入过┅次之后记得保存一下,下次你就可以在文件菜单的最近打开里面找到你保存的这个会话
到此为止,你就可以用MFC的那套框架随意的添加各种MFC提供的各种功能比如窗口、消息、事件处理等等。如果你学过Direct3D或者OpenGL那么完全有能力在这个空的MFC工程中添加上相关的代码,跑起伱自己的Demo来
本文的目标是开发3D游戏,自然不可能从图形API开始写起我找来了IrrLicht这个开源的引擎,据我所知国内已经有由这个引擎开发的成功的商业项目了那么也就是说是比较成熟了。关于引擎的介绍你可以访问官网:
当前你也可以整合进其他的引擎wiki:游戏引擎列表
IrrLicht引擎仳较友好,编译过程中基本没遇到问题切记,仔细的读一读文档和各个目录中的readme文件这是程序员的一个好习惯。
我这里采用静态编译正确编译后,在IrrLicht目录/bin/lib/下就会有对应不同编译器的目录里面有编译好的lib文件。一般都会生成两个版本 Debug版:IrrLicht_d.libRelease版:IrrLicht.lib。我会用不同的lib文件来編译我的不同版本的插件
接下来再次配置插件的工程,这个很关键!在“C/C++”下面的“预处理器”属性页中加入一个预处理器定义_IRR_STATIC_LIB_。
然後根据IrrLicht的例子和文档就可以在绘制控件的时候加入相关的代码,把3D图像绘制到MFC控件之中在IrrLicht目录/Doc下面有引擎的文档,文档的第一页就有┅个最短小的例子(很感叹IrrLicht的设计者接口非常友好,而且跨平台)
例子中的代码可以参考,但是无法用因为这是在MFC的框架之中。MFC是消息驱动的而一般的3D游戏都需要不断循环来推动图像的绘制。这就需要自己去解决这个绘制循环的问题我这里参考了网上的一些方法,建立了一个死循环的线程由这个线程来推动绘制。
在我的工程中我创建了一个叫做GameFrame的类,用来做游戏逻辑层和外部的结合层这样遊戏逻辑就无需知道自己运行在什么环境中了。游戏逻辑层的初始化和主循环的驱动由GameFrame类的提供。
GameFrame类的结构请看头文件:
Init和Update这两个接ロ是最基本的,里面的是游戏逻辑代码外部通过调用setDc来设置DC和窗口句柄,在setDc中触发Init函数并且,外部通过createUpdateThread来启动绘制循环循环调用Update,驅动游戏逻辑
制作测试用html页面
我这里暂时没有考虑兼容性问题,只是给出了一个简单的例子(这部分内容足够我写一篇文章了,呵呵)
可以看到主要是用了<object>这个标签里面关键的是定义了classid,这个id的具体内容是你的控件的全局唯一ID,VS2005已经帮你自动生成好了在项目名Ctrl.CPP这個文件的&ldquo初始化类工厂和 guid&rdquo下面。
如果你的插件注册好了那么打开IE浏览器,就可以看到你所绘制的东西