最近在网上突然冒出了一款3D的网页游戏,因为它使得我对网页中一些招人诟病的问题有了新的认识,让我产生了想要研究一下的想法。

想要制作网页中的3d游戏,有这样几个技术问题是需要考虑的:

  • 网页插件实现  
        用户安装插件是否有阻碍  
        如何在插件中绘制3d图形 
        如何链接服务端 
        美术资源如何缓存 
        美术资源如何更新 
        浏览器兼容问题

本文就是来解答这些问题中的一部分,并且给出具体的实现方案。

ActiveX插件技术

目前浏览器的插件技术还是蛮多的,不过能够流行起来的不多。之前因为浏览器插件安全的问题,导致大部分人都对插件有十分的警惕。

ActiveX是微软提供的浏览器插件技术,wiki上的介绍:http://zh.wikipedia.org/wiki/ActiveX。我实在是难以搞清楚微软这些年来提供的几个技术之间的关系,OLE、ALT等,包括现在最新的.Net也是一样。要学习微软的这套框架,光理解其中的概念都需要花费非常多的时间,加上代码复杂,远不如开源技术来的直接和清晰。

我这里使用的是VS2005,新建一个“MFC ActiveX控件”工程。

根据向导,它会自动帮你创建一个后缀名为OCX的插件的工程。要调试运行,需要修改下项目属性,改成“ActiveX控件测试容器”,如下图:

这是一个工具,专门用来加载ActiveX控件,每次调试打开这个界面后,还需要手工点击菜单:编辑->插入新控件,找到你创建的这个OCX插件。如果在弹出的列表里面没有你制作的这个插件,就需要重新编译下(编译的最后会重新注册一次控件,当然你也可以用regsvr32.exe或者其他工具来手工注册)。

当你插入过一次之后,记得保存一下,下次你就可以在文件菜单的最近打开里面找到你保存的这个会话。

到此为止,你就可以用MFC的那套框架随意的添加各种MFC提供的各种功能,比如窗口、消息、事件处理等等。如果你学过Direct3D或者OpenGL,那么完全有能力在这个空的MFC工程中添加上相关的代码,跑起你自己的Demo来。

整合3D引擎:IrrLicht

本文的目标是开发3D游戏,自然不可能从图形API开始写起,我找来了IrrLicht这个开源的引擎,据我所知国内已经有由这个引擎开发的成功的商业项目了,那么也就是说是比较成熟了。关于引擎的介绍你可以访问官网:http://irrlicht.sourceforge.net/

当前你也可以整合进其他的引擎,wiki:游戏引擎列表http://zh.wikipedia.org/wiki/%E6%B8%B8%E6%88%8F%E5%BC%95%E6%93%8E%E5%88%97%E8%A1%A8

IrrLicht引擎比较友好,编译过程中基本没遇到问题。切记,仔细的读一读文档和各个目录中的readme文件,这是程序员的一个好习惯。

我这里采用静态编译,正确编译后,在IrrLicht目录/bin/lib/下就会有对应不同编译器的目录,里面有编译好的lib文件。一般都会生成两个版本 Debug版:IrrLicht_d.lib,Release版:IrrLicht.lib。我会用不同的lib文件来编译我的不同版本的插件。

接下来再次配置插件的工程,这个很关键!在“C/C++”下面的“预处理器”属性页中,加入一个预处理器定义_IRR_STATIC_LIB_。

配置输入的静态链接库,给Debug和Release分别配置IrrLicht_d.lib和IrrLicht.lib(当然你需要在之前设置好VS2005的全局目录,保证这里IrrLicht.lib和IrrLicht_d.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这个文件的“初始化类工厂和 guid”下面。

如果你的插件注册好了,那么打开IE浏览器,就可以看到你所绘制的东西。

工程文件下载:http://download.csdn.net/source/3244642

如何开发网页3D游戏相关推荐

  1. 程序员大佬Java开发大型3D游戏,英雄联盟、王者荣耀算什么!

    落樱(LuoYing)是一个用于简化3D角色扮演游戏开发的游戏框架,该项目基于Java及JME3(JMonkeyEngine)进行开发,兼容JME,创建的游戏可以跨多个平台发布(Window\Linu ...

  2. 毕设开发总结-3D游戏框架及网络对战游戏的开发(1)

    小序 毕业设计终于接近尾声了,一个周末都没有继续写代码,正好有一个经验分享,所以把PPT的总结报告转写成一篇blog,希望得到高手们的指点.同时也希望能给还在读书的师弟师妹们一些建议和启发吧.同时,也 ...

  3. 220多款H5的手机端小游戏源码下载 - html+javascript 开发网页小游戏开源源码大合集

    演示端:http://game.tutou.wang/  (手机访问) 需要做二次开发或者游戏开发的自行下载. 链接:https://pan.baidu.com/s/1kOOagUC1N6KnKBRK ...

  4. 【py】5个支持python的2D、3D游戏开发库

    0.Cocos2d: cocos2d是一系列开源软件框架,用于构建跨平台2D游戏和应用程序,由cocos2d-x.cocos2d-js.cocos2d-xna和cocos2d(Python)多种框架组 ...

  5. cocos2dx 3D游戏制作参考

    (以下内容依据Cocos秋季峰会演讲速记稿整理) 主持人王哲: 前面几个演讲人展示了不同的技术解决方案. 第一种是<三国之刃>用Flash完成所有动画.UI制作,然后用JSFL开发一个Fl ...

  6. 3d游戏建模行业发展前景和待遇怎么样?学习的渠道有哪些

    今年4月的全球数字游戏销售额达到了破纪录的105亿美元(约合人民币750亿),利润超过今年三月并比去年4月上涨了17%.疫情过后,游戏市场迎来了一次高潮,如果你喜欢3D游戏建模或看好这个行业坚持下去, ...

  7. SceneKit:简单的3D游戏场景搭建

    SceneKit是Apple用来开发休闲3D游戏的框架,不同于底层的OpenGL库,你仅仅需要很少的代码就可以快速看到实际的3D场景效果.下面简单的聊聊搭建一个3D游戏场景需要做的事情. 首先你必须用 ...

  8. 现在学3D游戏建模还能找到高薪好工作吗?3d建模基础入门教程

    一.3D建模是什么 "3D建模"通俗来讲就是,使用三维制作软件,通过虚拟三维空间构建出具有三维数据的模型.运用3D模型技术来完成真人CG的基础人物模型和动作还有场景.整个作品从模型 ...

  9. 从DOOM到CE3 20年3D游戏引擎发展史漫谈

    代表游戏:毁灭公爵3D(Duke Nukem 3D).猎鹿人(Redneck Deer Hunting).血祭 (Blood)代表游戏:上古卷轴:战斗尖顶(The Elder Scrolls:Batt ...

  10. 3d游戏建模行业发展前景和待遇怎么样?新手从哪里开始学习

    今年4月的全球数字游戏销售额达到了破纪录的105亿美元(约合人民币750亿),利润超过今年三月并比去年4月上涨了17%.疫情过后,游戏市场迎来了一次高潮,如果你喜欢3D游戏建模或看好这个行业坚持下去, ...

最新文章

  1. oss生成唯一文件名_根据结构化自然语言规范自动生成精确预言
  2. nginx常用代理配置
  3. 【蓝桥杯Java_C组·从零开始卷】第二节(附)、if与switch效率比较(千万次/一亿次)
  4. Abp + Grpc 如何实现用户会话状态传递
  5. netty Demo
  6. 去哪儿-14-vuex_localstorage
  7. vscode使用Git Graph提交成功,但是仓库没有更新
  8. 自主编写的新书出版2个月,竟然上了51cto读书频道的动态首页,兴奋中!
  9. ZOJ 1610Count the Colors
  10. MATLAB卷积运算(conv)
  11. 如何将开发好的安卓应用程序发布到安卓市场或商店
  12. 流畅安装、简单使用annie下载B站视频
  13. WC2015简短感想
  14. 网络工程师发展及待遇--学习
  15. 时间颗粒度相关数据处理
  16. MySQL基础架构:一条SQL“查询语句”是如何执行的
  17. 照度稳定可调 LED 台灯(K 题)【高职高专组】-- 2021 年全国大学生电子设计竞赛
  18. 双面女间谍第一至五季/全集Alias迅雷下载
  19. Laya微信小游戏开发问题汇总以及解决方案(一)
  20. uniGUI之事项合集

热门文章

  1. 软件评测师考试(下午考点,要背)
  2. 工信部BIM工程师系列发布测评考试大纲
  3. 【音频】I2S协议时序及使用粗解
  4. YDOOK: ANSYS Maxwell 19 教程17:Maxwell 2D 网格划分 网格划分工具有哪些
  5. 机场VIP会员管理系统
  6. 数学建模思路模板经典案例(看完快速入门)
  7. 华为网络技术大赛2017 考后感
  8. 每次打开office2016相应应用都要配置进度的解决方法
  9. NIST计划对量子加密进行众测
  10. 如何下载官方windows10的ios镜像文件