前段时间新买的一只Nokia手机,里面内置了EA的一款小游戏,叫Block'D。刚开始玩的时候觉得M$的BubbleBreaker差不多,可玩着玩着就发现两者的确有挺大的差别,特别是它的速度模式,让我很着迷,害我连大号的时间都加长了N倍。于是,在一个夜黑风高的晚上,我突然萌发了山寨一款和它一样的在Windows平台上运行的游戏。经过一个星期艰苦卓绝的努力,排除了各种困难,终于开发成功了我在游戏方面的处女作——打方块(暂定名)。

功能部分

严格来说,这并不是我开发的第一款游戏,早些时间我我还山寨过扫雷、俄罗斯广块什么的,不过因为效果不理想,做完就扔了。不过这次的程序写得不太一样,于以前有很大的进步,最关键的是解决了我一直以来很困惑的动画问题,以及GDI+绘图的性能问题。废话不多说,先来看看庐山真面目。

游戏的玩法很简单,两个或两个以上连接在一起的方块可以用鼠标点击消除并获得分数,连接的方块数越多获得的分数越高。游戏的目标是在计时器倒计时结束之前内尽可能多的获得分数,当分数到达一定的目标分数后,计时器重置,当然此时目标也会提高。当剩下的方块已经不能再消除时,会自动重新填充,并且等级上升1级,每5个等级增加一种颜色的方块。不过目前一共只有5种颜色,因此在15级以上就不会再增加新的颜色了。

游戏中设置了三种道具,从截图可以看出来有炸弹、闪电和数字三种。炸弹的功能是消除半径为两格内的方块,闪电的功能是让消除面积扩展一格,数字的功能是让获得的分数翻倍。这些道具是通过消除方块取得的分数累加来获取的,不同颜色的方块获取不同的道具。红色方块获得炸弹,黄色方块获得闪电,绿色方块获得数字。所获得的道具不会在本级生效,而要到下个级别才会出现。

技术部分

先说明几个程序中主要用到的类型:

BlockGameEngine 游戏引擎类,这是整个游戏的根元素,用于对游戏进行总体控制,它本身并没有什么业务逻辑。
BlockMap 方块分布图,用于存储方块的位置信息。
Block 这是方块的基类,包含了方块的类型、位置、状态等信息。其派生类MultipleBlock, ExplosionBlock和SpreadingBlock分别实现了道具的相关功能。
RenderingContext 绘制图形的上下文,其中包含了图形界面中各个部件的布局参数。
Canvas 这是游戏与桌面窗口交互的Windows控件。
ILayer 表示游戏图层的接口,它的主要方法Render由Canvas调用,进行图形的绘制。
IAnimatable 表示动画元件的接口,它的主要方法Move由AnimationController类调用,进行动作控制。
BlockRenderer 用于方块绘制的静态类,主要功能是绘制和生成方块。由于目前方块都是程序在运行时生成的,因此该类型会在初始阶段生成所有方块的图形以进行缓存。

 简单解释一下程序的实现方式。程序中设置了两个主线程,一个在Canvas中用于图形绘制,主要侧重于图像的绘制,如画方块、文字、图片什么的;另一个在BlockGameEngine中用于动作控制,侧重于时间的控制,在此线程中,各种不同的IAnimatable根据时间控制自身的位置、大小、帧编号等,这些信息都会在图形绘制线程中用于呈现。

为了更方便地控制图形显示,我将图形的绘制分为N个层(ILayer),每个层负责绘制自己的内容。现在用到的主要有这样几个层:
背景层(BackgroundLayer):用来绘制背景,如截图中的紫色部分。
方块层(BlocksLayer):用于绘制方块,以及方块的动画,并提供了与用户的交互。
分数层(ScoreLayer):用于绘制当前游戏过程中用户所获得的分数等情况。

考虑到每一层与用户的交互有所不同,因此交互部分也是由层来实现的。IInteractiveLayer接口提供了这种交互的几个成员,OnMouseActive、OnKeyboardActive用于提供用户的动作。现在仅有BlocksLayer实现了该接口。

 不得不说说动画部分。最初的考虑是为每一个动画创建一个线程,不过我担心动画一旦多了会导致线程数量很大反而影响性能,因此考虑用上述两个线程来控制和绘制动画。为了提供比较灵活的控制方式,我把动画部分分成了两类,一类是动作(MotionBase),一类是动画(AnimationBase),它们都实现了IAnimatable接口。IAnimatable只提供了一个成员,就是Move方法,在动作控制线程中,我不断调用每个IAnimtable对象的Move方法以实现动作的变更。MontionBase注重的是动作的分解,它的每一帧持续时间都相同,在Move方法中根据时间推算出当前的帧编号和百分比。而Animation注重的是帧的变化,在Move方法中根据每一帧的持续时间来计算当前帧编号。

代码部分

代码是用VS2010写的,开发语言C#,运行库是.Net Framework 3.5 Client Profile,点击下面的链接下载:

下载源代码

下载可执行程序

结尾

程序现在还有许多功能没有实现,同时还存在一些BUG,罗列如下:

* 没有美工支持,界面比较单调,方块(特别是道具)画得有点粗糙。
* 排行榜没做,没法记录最高分什么的。
* 本地化还没有做。
* 有些效果没有实现,比如获得奖励分数什么的。
* 音乐和音效没有。
* 图形菜单没有实现。
* 线程同步上可能会出现问题。
* 时间计算不够精确,并且存在致命BUG。(试试在游戏运行时更改系统时间)
* 将来考虑移植到Windows移动设备上。

可能说了这些大家不明白到底是个什么东西,那就尽管下载来研究研究吧。如果哪位游戏开发高手碰巧路过,还请指点一二。

posted on 2010-09-01 14:31  一风  阅读(4082)  评论(20编辑  收藏  举报