俄罗斯方块源码解析(带下载)[4]

上几章那些代码都没什么难度 ,关键是清晰的条理,跟面向对象编程的思维。

我们都是正常人,我们不是火星来的 我们不做高手。我们不写让人看不懂的代码,我们体验编程的乐趣。

 

我们不需要有难度的代码,事实上合理的设计 ,跟面向对象的分析 跟编码 将会降低你“写程序的难度”,并且也让你的代码

“看起来更简单”。

推荐大家看一本书(翻译过来的名字)《C++游戏编程入门教程》

想到游戏编程这个标题,朋友们可能首先想到花哨的场景,魔兽里那把人眼睛都闪晕的技能,还有很性感 胸部超大的精灵族女法师(并且穿得超少)

对不起又开始yy了。很遗憾翻开书的时候 尽是命令行程序,这哪叫游戏啊,这能玩不。给你的答案是“能玩”真的能玩 试着去玩玩命令行游戏吧 有意思吧。

并且代码一点不难,尽是些 “菜鸟入门级代码”

个人认为写得还不错 ,可以让你学习到如何去设计一个程序,如何让你的代码更有用。

以前 本人写的最好的程序是 hello world,自从看了这本书 。现在俺也会写写 tetris游戏之类的了,哇嘎嘎。。。。

 

对不起扯远了 ,以上仅代表本人个人观点。

 

回到正题,那个寻找“图像轮廓”,跟“旋转算法”(差点想不起来了 ^_^)

虽然我们不需要复杂的代码,但是要解决某些问题, 作为程序员的我们还是应该动些脑筋的,要不然脑阔都生锈了。

 

先说第一个问题寻找“图像轮廓”,说得挺有技术含量似的,其实就是弄一个可以把不规则形状框起来的最小的矩形框。

明白了吧,别打我哦。

这个问题还不好解决,只要遍历 找出x 跟y 的最小跟最大值 不就得了吗。

代码:

 

//找出 shape 的矩形范围 和基准点
            //假设最小数为最大那个 最大那个为0 懂否
            int xMin = gameArea.width - 1;//左边越小
            int xMax = 0;//右边 越大

            int yMax = gameArea.height - 1;//上边数字越小越大 
            int yMin = 0;//下边数字越大 越小

            Point[] pointsTmp = new Point[4];
            int pindx = 0;

             foreach (Point p in sh)
             {
                        //i等于y
                        //j等于x
                        //找出最大跟最小那个
                        if (p.X > xMax)
                            xMax = p.X;
                        if (p.X < xMin)
                            xMin = p.X;

                        if (p.Y < yMax)
                            yMax = p.Y;
                        if (p.Y > yMin)
                            yMin = p.Y;
                        pointsTmp[pindx++] = new Point(p.X, p.Y);

                        //sh.transform[i, j] = false;
              
            }

            //参照点(右下角那个)
            //px py
            Point rpoint = new Point(xMax, yMin);

 

 

说到图像旋转,那么必须得用到啥子 弧度 啊 sin cos之类的咯

这有篇文章 各位精通2D的大虾如果看得懂的话可以参考

http://www.studa.net/yingyong/080506/08473810.html

这是人家硕士研究生写的论文 就算了 ,给俺看 也看不懂,高中的都忘得差不多了 嘿嘿。

 

咱这个比较简单 顺时针旋转90度, 用点一次函数的知识就可解决了,献丑了。

 

我们知道电脑上的坐标不是数学里那种 x  y的坐标系 ,他是最左上的那个点为0 ,0 越往右边值越大,越往下值越大。

像这样a点的坐标应该为(1.5 , 2)

如果以a点为基准点那么那个弯角顺时针旋转90度后应该到虚线所在的位置。

 

设a为(px,py) 旋转之前弯角上某一点的坐标为(x1,y1) ,旋转之后的坐标为(x2,y2)

 

 求旋转后的坐标

得出:

  x2=px+(py-y1)

 y2=py-(px-x1)

 

简单吧  嘿嘿

 

代码:

 

//求旋转后的坐标

            //公式  x2=px+(py-y1)
            //      y2=py-(px-x1)

            bool can = true;
            foreach (Point p in pointsTmp)
            {
                if (yMin - (xMax - p.X) >= gameArea.height || yMin - (xMax - p.X) < 0 ||
                    (xMax + (yMin - p.Y)) >= gameArea.width || (xMax + (yMin - p.Y)) < 0)
                    can = false;                    
            }

            if (can)//如果可以旋转
            {
                for (int i=0;i<pointsTmp.Length;i++)
                {
                    sh[i].X = xMax + (yMin - pointsTmp[i].Y);
                    sh[i].Y = yMin - (xMax - pointsTmp[i].X);
                    //sh.transform[yMin - (xMax - p.X), (xMax + (yMin - p.Y))] = true;
                }
            }

 

由于这个俄罗斯方块的游戏旋转 都是用的这个函数,它是以形状的右下角作为基准点旋转的,所以感觉怪怪的 在空间小的地方转不过来。这是属于正常现象

正方形的方块 旋转过后 看上去没有变 位置却往右边跑了一格(因为它不是硬编码 所以可以应用于任何形状),好玩吧 ♡.∩▂∩

 

欲知后事如何

请看第五章

posted @ 2010-09-24 05:20  assassinx  阅读(1183)  评论(0编辑  收藏  举报