文件名称:打方块游戏源码程序下载
文件大小:344KB
文件格式:ZIP
更新时间:2014-08-23 08:19:46
打方块 游戏 源码
打方块游戏源码 游戏的玩法很简单,两个或两个以上连接在一起的方块可以用鼠标点击消除并获得分数,连接的方块数越多获得的分数越高。游戏的目标是在计时器倒计时结束之前内尽可能多的获得分数,当分数到达一定的目标分数后,计时器重置,当然此时目标也会提高。当剩下的方块已经不能再消除时,会自动重新填充,并且等级上升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方法中根据每一帧的持续时间来计算当前帧编号。 程序现在还有许多功能没有实现,同时还存在一些BUG,罗列如下: * 没有美工支持,界面比较单调,方块(特别是道具)画得有点粗糙。 * 排行榜没做,没法记录最高分什么的。 * 本地化还没有做。 * 有些效果没有实现,比如获得奖励分数什么的。 * 音乐和音效没有。 * 图形菜单没有实现。 * 线程同步上可能会出现问题。 * 时间计算不够精确,并且存在致命BUG。(试试在游戏运行时更改系统时间) * 将来考虑移植到Windows移动设备上。
【文件预览】:
BlockGame
----Interfaces.cs(1KB)
----BlockGame.sln(845B)
----Canvas.cs(6KB)
----UI.csproj.user(227B)
----bin()
--------Debug()
----EventArgs.cs(616B)
----GameTimer.cs(4KB)
----UI.csproj(7KB)
----Block.cs(6KB)
----BlockRenderer.cs(17KB)
----obj()
--------x86()
----Resources()
--------Bomb.bmp(1KB)
--------SmallExplotion.bmp(13KB)
--------Bullets.bmp(24KB)
--------BigPlanes.bmp(78KB)
--------Tiles.bmp(5KB)
--------Bonuses.bmp(15KB)
--------BigExplotion.bmp(61KB)
--------SmallEnemies.bmp(42KB)
--------SmallPlanes.bmp(42KB)
--------BigBackgroundElements.bmp(26KB)
----Properties()
--------Resources.Designer.cs(3KB)
--------Settings.settings(249B)
--------Resources.resx(5KB)
--------Settings.Designer.cs(1KB)
--------AssemblyInfo.cs(1KB)
----Program.cs(513B)
----MouseActiveArguments.cs(2KB)
----MapStatus.cs(215B)
----ExplosionBlock.cs(3KB)
----ResetMapParameters.cs(1KB)
----Layers()
--------BlocksHintLayer.cs(2KB)
--------BlocksLayer.cs(5KB)
--------BackgroundLayer.cs(1KB)
--------GameOverLayer.cs(1KB)
--------ScoreLayer.cs(5KB)
--------AnimationLayer.cs(2KB)
--------PlaneLayer.cs(9KB)
----BlockGameEngine.cs(14KB)
----GoalInfo.cs(369B)
----RenderingContext.cs(4KB)
----GameStage.cs(268B)
----BlockGameSettings.cs(601B)
----BlockState.cs(230B)
----PlayingState.cs(6KB)
----MultipleBlock.cs(1015B)
----KeyboardActiveArguments.cs(22KB)
----LevelInfo.cs(672B)
----app.config(130B)
----RendererHelper.cs(1KB)
----SweepBlocksContext.cs(4KB)
----Animations()
--------BlockDroppingMotion.cs(2KB)
--------GifPlayer.cs(308B)
--------AnimationBase.cs(4KB)
--------ExplosionAnimation.cs(1KB)
--------AnimationPlayer.cs(3KB)
--------BlockAnimation.cs(792B)
--------BlocksFallMotion.cs(1KB)
--------AnimationController.cs(5KB)
--------MotionBase.cs(3KB)
--------AnimationFrame.cs(2KB)
--------BlocksWippingMotion.cs(1002B)
----WinForms()
--------AboutForm.Designer.cs(8KB)
--------AboutForm.resx(6KB)
--------MainForm.resx(6KB)
--------AboutForm.cs(863B)
--------MainForm.cs(5KB)
--------Windows7.cs(4KB)
--------MainForm.Designer.cs(11KB)
----BlockMap.cs(15KB)
----BlockGame.suo(38KB)