东方吧 关注:315,688贴子:10,750,934

【弹幕程序科普计划】 第一篇 弹幕游戏制作工具概述(上)

只看楼主收藏回复

【弹幕游戏制作工具概述(上)】


先放一张镇楼图:





  想要制作弹幕游戏,当然最先要想好的问题就是用什么工具来做。在十多年前,游戏制作还是比较复杂的一件事情。本身OpenGL、DirectX都发展不成熟,性能方面存在缺陷,使用上也有诸多不便,更不用说东方原作者ZUN从DOS时代就开始游戏制作时的难度。然而在过去的十多年里,游戏制作工具上有着非常长足的发展,大幅降低了游戏开发的门槛。微软在DirectX方面也做了多次方向性调整,先是开发了ManagedDirectX,然后放弃了ManagedDirectX而改为XNA,到现在又放弃了XNA回到了传统C++调用DirectX的方式。而游戏引擎方面,一方面出现了像Unity3D这样简单易用且性能优秀的通用引擎,另一方面有不少爱好者创作了弹幕游戏专用引擎,如东方弹幕风、luastg等等,当然也包括Crazy Storm。
  讲到这里,估计没接触过游戏编程的人已经听得云里雾里。那么下面按正常思路来介绍一下游戏编程要解决的基本问题。
  要进行游戏编程,首先要解决的三个最基本的问题——画面显示、音频播放、输入采集。也就是怎么把图片画到屏幕上,怎么把声音播放出来,怎么让玩家进行控制。DirectX就是用来解决这些事情的,无论是ManagedDirectX、XNA、SlimDX之类的都属于DirectX,他们不是游戏引擎,只能解决那三个基本问题。至于子弹是什么,运动速度多少,和谁发生判定,这都需要编程人员自己解决。所以说,面向对象的编程知识是必要的。
  而游戏引擎就会比上面说的高级一些,比如Unity3D中已经将“物体”这个概念封装好,可以直接定义它的贴图、速度等等,而弹幕专用引擎则封装得更为到位,可能已经定义了子弹、自机、敌机,包含了判定逻辑,用户可以直接去指定子弹的位置、速度、判定范围等等。当然,封装得越好,改动余地也就越小,效率方面也越难优化,总是有利有弊的。至于利弊具体如何,下面先按顺序来介绍一下以上提到的各种工具。

1. C++结合DirectX
这是制作游戏最基本的方法,DirectX中有Direct3D解决画面显示,DirectSound解决声音播放,DirectInput解决输入采集,可谓一应俱全。开发资料可以参考微软官方的DirectX SDK。
代表作品:东方原作
优点是C++的效率稍高,缺点是C++开发难度较大。

2. C语言结合DirectX(DX Library)
原理和C++结合DirectX类似。
代表作品:《四圣龙神录》
《四圣龙神录》的作者还给出过一系列相关教程,可以帮助初学者逐步了解弹幕游戏原理。但是由于C语言不是面向对象的编程,中间一些做法难免有些繁琐,条理不够清晰,这里并不推荐。
优点:有60讲教程
缺点:不是面向对象的编程





3. ManagedDirectX
简称MDX,微软在2003年推出的托管DirectX,这里我们不详细讲托管这个概念了,总之是可以使用C#语言来编写DirectX程序。MDX拥有DirectX的所有功能。由于C#开发难度低于C++,较为容易上手。效率可能略低于C++,但是微乎其微。有资料说MDX效率为传统DirectX的98%。
由于使用C#语言,必须要玩家安装.NetFramework才能运行游戏,不过在Win7以上系统基本都标配了,所以这个缺点也几乎可以忽略了。
代表作品:《猫猫狂想曲》?(不要在意,这是我早几年写的试验性作品)
由于微软已经停止MDX的开发,并且MDX程序不支持在64位机上运行,所以此方法已不成立,请不要尝试。





4. XNA
XNA是微软停止MDX开发后所开启的项目,他依然是托管的DirectX封装,使用C#开发。XNA的封装程度比MDX来得高,换句话说,用起来更方便更直观,当然也可能损失一些开发的自由度。微软当年指望着XNA能进行跨平台开发,除了编写PC游戏还能编写XBOX游戏,但是现在看来,也只能跨到XBOX,要兼容Windows Phone都困难,所以现在微软也停止更新XNA。不过因为当年XNA还是比较流行,留下了大量开发资料和例子,这也从一定程度上降低了开发难度。
代表作品:《东方幕华祭》、《結界幻想録》
优点:使用起来比DirectX方便,资料较多
缺点:强迫玩家安装XNAFramework Redistributable;XNA3.0、XNA3.1、XNA4.0版本互不兼容





5. SlimDX
在微软停止MDX开发后,有一群人不满意XNA的高度封装,而自行开发了另一个托管的DirectX封装,就是SlimDX。SlimDX不仅拥有Direct3D、DirectInput、DirectSound等传统模块,还具有XAudio2、X3DAudio、RawInput等,为声音播放、输入采集提供了更多可能性,尤其XAudio2中包含有现成的音乐文件区间循环方法,可以用来实现BGM无缝循环。
SlimDX也是我一直使用的东西,不过我用他主要是当年在发现MDX不支持64位机以后,要找寻新的解决方案。而在调XNA和SlimDX时都遇到了一些问题,只是SlimDX的问题先解决掉了,于是就用了下去。但是平心而论,SlimDX正如他的开发者所说的,是一个轻量化的封装。封装程度甚至不及MDX。举例来讲,显示2D图片的时候,MDX直接指定图片位置、大小、旋转角度,而SlimDX不行,它只能指定位置,再通过矩阵变换来达到所要大小和角度。当然也许对有经验的程序员来说不算什么,我们可以写个函数把显示图片和矩阵变换封装在一起,来实现MDX中绘制图片时直接设置大小和角度的方法,但是诸如此类的问题在SlimDX中屡见不鲜。加上SlimDX开发资料较少,且现在也停止更新,不得不大量参考微软2004年MDX的SDK。因此SlimDX的开发难度上硬生生比传统DX和XNA要高了一级。
理论上,只要游戏程序打包了SlimDX.dll文件,用户就可以直接运行游戏,但是实际发现,很多机器上会碰到一些DirectX的设置问题而使游戏玩法启动,需要安装SlimDX Runtime来解决。
代表作品:《东方百花宴》、《东方夏夜祭》以及现在正在制作的《弹幕音乐绘》
优点:是C#编写DirectX程序的一种可选方法;XAudio2可实现音乐区间循环
缺点:可能需要玩家安装SlimDXRuntime .Net;可参考资料少,开发难度高







  以上所说都是直接编写DirectX程序的做法。开发难度方面应该是C++原生DirectX > SlimDX > MDX> XNA。效率方面,所有方法都处于同一等级。理论上使用C++结合DirectX的方法效率最高,托管DirectX的效率略差,其中XNA效率可能最低,但其实差距非常微弱。评价2D显示效率一个最主要的方法是看同屏显示的物体数。当游戏帧率保持在60fps时,上述方法所做的游戏一般都可以同屏物体达到6000左右,具体可以参考东方原作及以上提到的各作同人游戏。6000是什么概念,以《东方辉针城》为例,当屏幕上同时存在2000枚子弹,此时触发了一个全屏消弹,每颗子弹消失时释放一个消弹特效和两个绿点,这样就达到了全屏物体数量6000。至于这个效率,除了和本身显示效率有关外,还和运动控制逻辑、中弹判定之类的代码有相当程度的关系,何况游戏里还要显示界面、背景等,都会对同屏显示物体数产生影响。至于纯显示效率到底怎样,为了避开干扰因素测试真实显示效率,我这里做了一个简易的弹量测试程序。经实际测试发现,使用SlimDX纯显示物体的话,同屏物体数可以上万。至于上万是什么概念,请看镇楼图。
  实际数量和电脑差异有关,有兴趣的朋友可以下载该测试程序自己试一下,欢迎回帖反馈。程序地址:http://pan.baidu.com/s/1bFhACA

  另外其实也还有一种不使用DirectX的方法,直接通过GDI进行画面显示,通过Window API播放声音,通过窗体事件采集键盘信息。这样也可以制作出简单的游戏,但是因为GDI显示效率和DirectX不在一个数量级,这种方法仅能完成像《特训99》这样的小游戏。





  此外也提一下OpenGL,它和DirectX非常类似,也有C++结合OpenGL以及C#结合托管OpenGL类库的做法,但是OpenGL在Windows平台上相对DirectX并没有什么优势,甚至2D功能可能不及DirectX,所以并不推荐大家使用。即使如果要开发Windows以外平台的游戏,也还是推荐使用各种支持跨平台的游戏引擎。


  考虑到篇幅问题,本次就先介绍到这里。下次主要针对几个主要的游戏引擎进行介绍,包括弹幕风、luastg、HGE、Unity3D等等,敬请期待。

以下广告时间:
本系列过往文章将收录到弹幕音乐绘的哔哩哔哩兴趣圈中,欢迎关注
http://www.im9.com/community.html?community_id=12241

游戏《弹幕音乐绘》近期会开始刷存在感,以下是游戏宣传页面:
http://www.slimesmile.cc/


出国上网租漫游超人,出境超1亿人次的选择 4G高速,15小时超长续航。
广告
前排


回复
举报|3楼2017-01-07 17:37
    前排呲呲


    回复
    举报|来自Android客户端4楼2017-01-07 17:39
      我总算知道那绿飞机为啥叫打猫机了


      回复
      举报|6楼2017-01-07 17:44


        回复
        举报|来自iPhone客户端7楼2017-01-07 18:29
          前排资磁


          回复
          举报|8楼2017-01-07 18:30
            学习


            回复
            举报|来自iPhone客户端9楼2017-01-07 18:36
              努力理解中。。。。。。


              回复
              举报|来自Android客户端10楼2017-01-07 18:37
                很棒!顶


                回复
                举报|来自iPhone客户端11楼2017-01-07 20:02
                  好东西,马克


                  回复
                  举报|来自手机贴吧12楼2017-01-07 20:04
                    锐峰玻璃机械,专业生产玻璃切割机,全自动玻璃切割机 选择我们没有错
                    广告
                    顶:D


                    回复
                    举报|来自Android客户端13楼2017-01-07 20:13
                      吼啊


                      回复
                      举报|来自Android客户端14楼2017-01-07 23:36


                        回复
                        举报|来自Android客户端15楼2017-01-07 23:41
                          666,马克一下寒假可以瞎捣鼓捣鼓


                          回复
                          举报|来自Android客户端17楼2017-01-07 23:43
                            马克,寒假钻研


                            回复
                            举报|来自手机贴吧18楼2017-01-08 00:28


                              回复
                              举报|19楼2017-01-08 00:34
                                马克£


                                回复
                                举报|来自Android客户端20楼2017-01-08 00:47
                                  完全看不懂


                                  回复
                                  举报|21楼2017-01-08 03:48
                                    Mark,好帖顶一个


                                    回复
                                    举报|22楼2017-01-08 04:36
                                      美工一脸懵逼。。不过好帖支持


                                      回复
                                      举报|来自Android客户端23楼2017-01-08 04:57
                                        不是很懂,支持一下


                                        回复
                                        举报|来自iPhone客户端24楼2017-01-08 07:00
                                          不明觉厉


                                          回复
                                          举报|来自Android客户端25楼2017-01-08 07:40
                                            厉害,期待出PDF教程


                                            回复
                                            举报|来自Android客户端26楼2017-01-08 07:54
                                              自此!
                                              也就只有我这种二逼拿过pygame写程序了
                                              话说如果只是做弹幕游戏的话c++搭dx应该不算特别难吧


                                              后排资磁!


                                              回复
                                              举报|来自Android客户端28楼2017-01-08 07:58
                                                技术贴mark


                                                回复
                                                举报|来自Android客户端29楼2017-01-08 08:12
                                                  技术贴马克一个


                                                  回复
                                                  举报|来自iPhone客户端30楼2017-01-08 08:22
                                                    vb做弹幕stg的路过,感觉gdi32有些不能胜任绘图,正在找其他API。


                                                    瞬间收藏


                                                    回复
                                                    举报|来自Android客户端33楼2017-01-08 14:38