俄罗斯方块源码解析(带下载)[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; } }
由于这个俄罗斯方块的游戏旋转 都是用的这个函数,它是以形状的右下角作为基准点旋转的,所以感觉怪怪的 在空间小的地方转不过来。这是属于正常现象
正方形的方块 旋转过后 看上去没有变 位置却往右边跑了一格(因为它不是硬编码 所以可以应用于任何形状),好玩吧 ♡.∩▂∩
欲知后事如何