zoukankan      html  css  js  c++  java
  • win8 开发之旅(12) 15个为什么搞掂win8 俄罗斯方块

    人物介绍:老徐——wp7,win8 老鸟级开发者,开发marketplace上多款wp,win8应用。小曾——老徐的好朋友,有点.net 基础,学习silverlight半月有余,xaml的菜鸟。如是想写

    一个俄罗斯方块练练手,一是强化面向对象的基础,二是想练习xaml语言。但苦于没有思路,于是想向老徐请教。如是他们的对话开始了。。。。

    小曾: 老徐啊?我想写一个 俄罗斯方块,但是苦于没有思路,帮帮我把。   

    老徐:什么问题?

    小曾:①我苦于怎么面向对象分析?

     老徐:你从游戏的本身出发。俄罗斯方块,就有方块这个类。  方块有各种各样的形状的,如:T字形,I字形,N字形,O字形等等。  还有需要游戏逻辑的类,你可以叫他 Engine,我

    这里叫他UiControl 类。

     小曾:②各种各样的方块有哪些方法和属性。

     老徐:  是不是有个二维数组的属性; 你看是不是有一个能够产生下一个形状的方法;是不是有一个索引的属性,每组形状是不是拥有不同的颜色,因此,我们让他有个颜色的属

     性,是不是需要一个变形的方法。

     小曾:③为什么需要二维数组啊

     老徐:小曾啊小曾,我以为你很菜,没想到 你这么菜,你看看,我所有形状的方块是不是放在形如4*4二维数组中,如图:

    小曾:④怎么代表有砖块,怎么代表没有砖块

    老徐:0代无砖块,1代表 有砖块

    小曾:⑤哪怎么用rotate 旋转 使其砖块 变不同形状了

    老徐: 我是通过一个产生下一个样式的方法,再通过 switch 来判断不同的样式,  例如“一”字形,如图所示:

     

    如是,小曾开始写了 15分钟以后,又问老徐。

    小曾: ⑥我好多类写了Rotate方法,Index属性等等.  这不是重复吗,是不是写个基类吗

    老徐:很好 ! 可写一个基类, 包含这些Rotate方法,Index属性等等.  其他类继承与他。他们的之间的类图是这样的。

    小曾这是把这个各种各样的形状砖的类搞定了,  小曾就郁闷,怎么 把这些类变成所对应的方!块样式。于是,又问老徐。

    小曾: ⑧我怎么把他变成相应的砖块?

    老徐:我这里可以用一个  叫做Block的用户控件,代表这个部分为有砖块,具体就是在一个小矩形上填充不同的颜色代表一个小砖块。。

    于是,小曾又做了,又纳闷了,继续问老徐。

    小曾:⑨我看见,你做的wp7上的方块很有质地,中心和周围是质地的,然而,我的就是这一块是整个颜色。为什么了?

    老徐:额,这个问题。微软貌似是为了提高显卡性能,把这个RadialGradientBrush干掉了。而且Metro界面程序好多笔刷都不支持。换一下其它解决方案吧。例如:

            1.在photoshop中渲染好图片,用静态图片替代。

            2.渲染效数到远程服务器,远程服务器返回渲染后的图片地址,类似Google Chart那样。

            3.如果确实要想在本机中实现实时渲染,可能只能用DirectX之类的api了。

    这用solidColorBrush 就满足了基本的需求了。

    小曾看了看,被迫的接受了。一个颜色赋值的值,由问了问老徐。

    小曾:⑩怎么给每种砖块,赋不同颜色的值啊!

    老徐:你还记得吗?每种形状的砖块有一个颜色的属性啊!在用户控件上赋值给solidColorBrush,这样,每种砖块,就有不同颜色的值了。

    这样子,能把各种各样的砖块的样式画在页面上的,小曾就投入到了游戏引擎思考,   编码中。但是,可谓  如履冰。还是闲着脸皮去问老徐。

    小曾:⑾ UIControl有哪些方法

    老徐:我这里UIControl 类似所谓Engine,能控制游戏的逻辑,首先,游戏要显示出来。有个Init方法。然后,砖块能够向左,向右,向下方法。这些方法必不可少。移动过的砖块

    ,要移去相应的轨迹,就要将其轨迹移去的方法。满格以后,要消掉相应的满格的行数。怎么判断砖块不出格,这个也必不可少。有这些方法等等。

    小曾想了想初始化方法,不好写。于是又问老徐 

    小曾:⑿怎么使其 初始化出来。

    老徐:我这里还不是用循环呗?我 两层循环  第一层循环是砖块所对应的行数 ,第二层是所对应的列数。在乘以不同的值。这样子能够画布上使相应砖块平铺开来。

    当然,还要初始化一个相应的Timer控件来计时。

     小曾:⒀怎么使她向左,向右,向下移动呗 ,

    老徐:我这里写了一个addPiece 的方法, 他传递的参数是对应的x,y坐标。   向左就是x坐标减一。向下是y坐标+1.   电脑的x,y坐标如图所示:

    小曾:⒀那AddPiece 怎么实现了?,

    老徐:这里砖块的类是 Position的属性的横坐标、纵坐标移动相应的x,y值。并且为1的地方就赋值有砖块,为0地方赋值为砖块。就搞定了。

    小曾:⒁好添加砖块的方法和初始化的方法就搞定了,怎么让他消去砖块?

    老徐:我这里还是老套路,循环遍历,看这一行是不是都为1,都为1的话,说明这行已经满格了,就进行消去了。

    小曾:⒂我看到许多方块游戏都有级别和分数又怎么实现了

    老徐:我这里有个score分数和level的属性来记录他

    这样子,一个方块游戏就搞掂了。

    小曾:⒃这个项目是开源的吗?

    老徐:这个项目是开源的,开源地址是:http://51aspx.com/Code/Win8Tetris,  谢谢大家多看看源代码,一切都清晰了。

  • 相关阅读:
    golang 识别redis key在哪个codis的slot上
    QAT SSL加速卡安装及使用
    dereferencing pointer to incomplete type错误的解决办法
    golang topN算法
    golang日志框架zap简洁配置
    golang 读取文件
    Django学习目录
    go练习:循环与函数
    全站搜索实战应用(Lucene.Net+盘古分词)
    (原创)将Datatable数据按照Excel模板格式导出
  • 原文地址:https://www.cnblogs.com/manuosex/p/2725810.html
Copyright © 2011-2022 走看看