1C#开发俄罗斯方块小游戏

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

三天教你做俄罗斯方块

小花朵2010-07-12序言

大学学C#的时候做了一个俄罗斯方块,发现挺多新手都想牛刀小试一把,我就重写了一遍,并写了这份文档教程,如果你理解快的话,三天就能做出来你的俄罗斯方块了。

先看一下我的俄罗斯方块吧,游戏规则估计不用多说了,我的俄罗斯方块的特色是有美女脱衣表演哦,每升一级,美女就脱一件衣服哦!另外,你还可以自己设定各个参数,包括游戏窗口的大小,按键,背景音乐,甚至自定义砖块样式。

第一部分:基础知识

1.了解认识GDI+

GDI+的技术是建立在GDI上的。GDI+提供了一个抽象层,隐藏了不同视频卡之间的区别,这样就可以调用windows AIP函数完成指定的任务了

GDI+由.NET基类集组成,这些基类可用于在屏幕上完成定制绘图,能把合适的指令发送到图形设备的驱动程序上,确保在监视器屏幕上显示正确的输出,这里的输出包括打印到硬拷贝中。

表1-1列出了GDI+基类的主要命名空间

表1-1

命名空间说明

System.Drawing包含与一类绘图功能有关的大多数累、结构、枚举、委托

System.Drawing.Drawing2D为大多数高级2D和矢量绘图操作提供了支持,包括消除锯齿、几何转换和图形路径System.Drawing.Imaging帮助处理图像(位图、Gif文件等)的各种类

System.Drawing.Printing把打印机或打印预览窗口作为输出设备时使用的类

System.Drawing.Design一些预定义的对话框、属性表和其他用户界面元素,与在设计期间扩展用户界面相关System.Drawing.Text与字体和字体系列执行高级操作的类

在GDI+中,设备环境(DC)包装在.NET基类System.Drawing.Graphics中。大多数绘图工作都是调用Graphics的实例来完成的。实际上,因为Graphics类负责处理大多数绘图操作,所以GDI+中很少有操作不涉及到Graphics实例。理解如何处理这个对象是理解如何使用GDI+在现实设备上绘图的关键。

2.绘制图形

下面用一个小示例来说明如何在应用程序的窗口中绘图(文章所有的示例都在Visual Studio2005中建立为C#的Windows应用程序)。启动VS2005,创建一个windows应用程序的项目,语言是C#,名字为Tetris(俄罗斯方块),然后切换到代码视图,在构造函数的最下面追加如下代码:

运行程序,我们期待的结果是在窗体上出现一个蓝色的矩形和一个红色的椭圆,但是实际运行结果呢?什么都没有显示,这是什么原因呢?原因就是在构造函数里执行画图代码的时候,窗口还没有显示出来,也就是说,还没有可以提供绘图的地方,所以,我们要看到期待中的蓝色矩形和红色椭圆,就必须在窗口显示出来以后再执行才能看到效果。

知道了原因我们也就知道解决方案,回到设计视图,添加Form_Shown事件,通过下面的提示我们知道这个事件发生在窗口第一次显示的时候。然后我们把代码移动到Form_Shown事件中,再次运行一下程序,接下了就是见证奇迹的时刻了。

期待中的蓝色矩形和红色椭圆如期出现了,矩形的坐标(0,0),大小(50,50)。椭圆的坐标(0,50),大小(80,50)。需要提醒一下的是如果是椭圆,则是外接矩形的坐标。这里坐标(x,y)表示从窗口的客户区域左上角开始向右的x个像素,向下y个像素——这些是现实出来的图形的左上角的坐标。

外面注意到椭圆的顶部和矩形的下边有轻度的重叠,这与代码中给出的坐标有点不同,这是因为windows在重叠的区域放置了巨星和椭圆的线条。在默认情况下,windows视图把图形边框所在的线条放到中心位置——但这并不是总能做到的,因为线条是以像素为单位来绘制的,但每个图形的边框理论上位于两个像素之间。结果1个像素宽的线条就会正好位于图形顶边和左边的立面,而在右边和底边的外面。这样,从严格意义上讲,相邻的边框就会有1个像素的重叠。由于我们制定的线条宽度比较大,因此重叠区域也就比较大了。一般来说,可以设定Pen.Alignment属性来改变默认的操作方式,但这里使用默认的操作就足够了。

接下了我们会发现一个问题,如果把这个窗口的绘图部分用别的窗体遮住,或者移动到屏幕的外边或者最小化,再恢复它,会发现绘制好的图形就不见了或者部分不见了。

这是怎么回事?这个就要从windows处理屏幕数据的方式来说起了。如果窗口的一部分被隐藏了,windows通常会立刻删除与其中显示的内容相关的所有信息。这是必须的,否则存储屏幕数据的内存量就会是个天文数字。按照1024x768像素,24位彩色模式,屏幕上的每个点(像素)就会占据3个字节(byte),整个屏幕需要2.25MB的显存来存储这些数据。下面考虑一种最糟糕的情况:屏幕上有20个窗口,都是最大化状态,windows就需要45MB的显存来存储,如果是32位的彩色模式,或者分辨率更大点,则消耗更多的显存,很显然,windows不能这样管理用户界面。

在窗口的某一部分消失时,那些像素也就丢失了。因为windows释放了保存这些像素的显存。但要注意,窗口的一部分被隐藏了,当它检测到窗口不再被隐藏时,就请求拥有该窗口的应用程序重新绘制该部分的内容。这个规则有一些例外——窗口的一部分被挡住的时间比较短(如,菜单的拉出,临时挡住了下面的窗口)。但一般情况下,如果窗口的一部分被挡住,应用程序就需要在以后重新绘制那部分。换句话说,windows只需要花费一个屏幕的显存就可以处理N多个窗口同时打开的情况,这是我的理解。

这就可以解释我们的程序为什么出问题了。我们的代码只是在第一次显示的时候才执行,并且只执行一次,不能在以后需要的时候自动重新绘制图形。

备注:windows的标准控件非常专业,能够在windows需要的时候自动重新绘制他们自己。所以这就是在使用时不需要担心实际绘图过程的原因之一。

3.使用OnPaint()绘制图形

上面的解释可以让你觉得挺复杂的,但实际上并非如此,要让应用程序在需要的时候绘制自身是非常简单的。

windows会利用Paint事件通知应用程序完成一些重新绘制的请求。有趣的是,Form类已经执行了这个事件的处理,因此不需要再添加处理代码了。

我们添加OnPaint()事件,根据注释,我们知道这个事件会在控件需要重新绘制的时候发生。然后我们把代码再移动到这个事件里。

相关文档
最新文档