介绍一款基于MonoGame开发的太空大战小游戏
最近突发奇想,下载了Microsoft Small Basic并编写了两个图形变换的小程序,希望能够让儿子对科技产生兴趣(当然,成为像我一样的码农可不是我的初衷)。 捡起自己入门电脑编程时学会的第一门语言 GW Basic,下载完Small Basic后写的第一个图形程序就是一个五彩缤纷的小球在屏幕上乱跳的程序,看上去有点像DOS下小球病毒爆发时的现象(不好意思暴露自己年龄了),而第二个程序则在窗口中显示了一个可以用鼠标控制的飞机图案,儿子当时看得很认真。心想,干脆自己做一款打飞机的游戏给儿子玩玩吧,考虑到Small Basic在图形处理方面毕竟还是相对薄弱,所以我就凭着以前对Microsoft XNA的研究经验,在Visual Studio 2013中借助MonoGame实现了一款简单的太空大战小游戏。
MonoGame
先简单介绍一下MonoGame吧。它是针对Microsoft XNA 4的开源实现,它能够支持诸如Xbox360、Windows、Windows Phone、iOS、Android、Mac OS X、Linux、Windows 8 Metro、Windows 10等多种平台。目前正在完善针对PlayStation Mobile、树莓派以及PlayStation 4的支持。在图形系统方面,MonoGame允许开发者选择基于OpenGL或者DirectX。您可以到MonoGame的官网介绍网页上了解更多有关MonoGame的历史信息。
在两年前我曾打算模拟一个类似魂斗罗的游戏,当时使用的是Microsoft XNA Game Studio 4,后来由于魂斗罗游戏地图处理有问题,我也没有继续深究这个游戏了。于是,在之后的一段时间中,我曾经也想过业余时间做个别力所能及的小游戏自娱自乐一下,可惜被告知Microsoft XNA Game Studio已经被微软抛弃了,最后一个支持它的VS版本是Visual Studio 2010,于是经过一番搜索,我开始了自己的MonoGame之旅。
刚开始的时候,MonoGame让我抓狂,因为它缺失一项最重要的功能:Content Pipeline。如果你要使用MonoGame,你必须继续使用Microsoft XNA Game Studio,并使用XNA的Content Pipeline将所需的材质、声音、动画、字体等素材编译成xnb文件,然后再到MonoGame中调用。这是非常让人难以接受的,所以,当时我也基本打消了继续使用MonoGame的念头。
然而,经过开源社区的努力,新版本的MonoGame已经全面支持Content Pipeline了,您可以从MonoGame所创建的解决方案管理器中找到游戏的Content文件,并双击它来打开Content编辑器:
应该说,使用最新版的MonoGame,已经可以满足开发中等规模的游戏需要了,尽管它仍然存在一些程序缺陷(Bugs)。
Starwar
MonoGame的介绍到此为止,限于篇幅我也就不深入讲解了。请您先移步到下面这段视频,看看我做的Starwar太空大战游戏是不是像模像样:
【点击此处观看视频】
怎么样?还可以吧?不管怎么样,能够吸引到小朋友就行。^_^
游戏的下载和安装
请【点击此处】下载游戏的安装包。注意,在安装的过程中会提示安装OpenAL(一套开放的音频库),单击确认安装即可。在安装完成后,你可以通过开始菜单启动游戏配置程序以及Starwar太空大战游戏。
在启动游戏配置系统时,会出现一个用户账户控制(User Access Control)的对话框,单击“是(Yes)”即可,然后会打开配置界面:
配置完成单击确定按钮后,再进入开始菜单选择Starwar打开游戏即可:
用鼠标移动飞机,单击左键发射激光攻打敌机,游戏任意时刻按ESC键退出。
游戏的源代码
本游戏的源代码是公开的,地址是:https://github.com/daxnet/Starwar。您可以使用Git客户端将源代码克隆到本地,注意,要正确编译源代码,您的计算机需要满足以下条件:
- 安装Visual Studio 2013
- 安装MonoGame 3.4
- .NET Framework:版本4.0
说明:游戏资源均来自于网络。
- 背景音乐:《沙罗曼蛇》游戏第二关Remix BGM(来自http://v.youku.com/v_show/id_XNTcyNDUxODAw.html?from=s1.8-1-1.2)
- 星空背景:来自XNA资源网(http://xnaresources.com/)
- 子弹发射、爆破声效:来自XNA资源网(http://xnaresources.com/)
- 其它图片(主机、敌机、子弹):来自Bing搜索结果
游戏的设计
游戏基于Visual C#采用面向对象设计,在游戏业务中,参与游戏的对象统称为精灵(Sprite),以下是本游戏各种不同类型的精灵类依赖图:
- Sprite:所有精灵类型的基类
- LaserSprite:表示激光子弹的精灵
- ParallaxStarSprite:表示移动的星星的精灵,在整个游戏过程中,星星精灵会不断下落,以呈现一种我机正在向前飞行的效果
- BackgroundSprite:星空背景精灵,整个游戏过程中一动不动
- EnemySprite:敌机精灵
- SpaceshipSprite:我机精灵
- AnimatedSprite:动画精灵,会通过给定的一张包含每帧图片的精灵表(Sprite Sheet)产生动画效果
- SpritePool:精灵库,用于管理显示在屏幕上的指定类型的精灵。当精灵出现在屏幕上时,精灵的IsActive属性为true,此时该精灵可以被加到精灵库中,以便统筹管理;当被管理的精灵从屏幕上消失(坐标超出屏幕边界),精灵库将会释放该精灵的资源,并将其从库中移除。精灵库保证了整个游戏过程中所产生的对象在一定范围内
- SpriteGenerator:精灵动态生成器,用于每隔一定的时间,在屏幕的任意地方产生一个精灵,并让其以任意速度朝着一定的方向前进。比如敌机和星星,都是由精灵动态生成器随机产生的,产生的精灵会被添加到SpritePool中,由SpritePool托管其生命周期
实现代码在此就不贴了,您可以直接到上述源代码主页上查看。
还有事情可做
接下来还可以做一些事情来完善这个游戏,比如:
- 引入Lua脚本引擎,自定义敌机的飞行路径
- 加入敌机子弹系统
- 加入生命系统
- 激光子弹威力增强
- 关卡
- (等等......)
留着以后有兴趣再慢慢完善吧。