现在的位置: 首页 > 综合 > 正文

俄罗斯方块开发日志

2013年10月04日 ⁄ 综合 ⁄ 共 2090字 ⁄ 字号 评论关闭

 

 正式转入俄罗斯方块的开发是在昨天,之前都是在学习mfc,大约持续了3个星期。
在绘图上花费了很多时间,之前曾经想过在主窗口上划分出多个view,将方块运动,下一个方块,和分数,按钮信息分在各个view中,花了一天时间研究拆分窗口之后发现完全没有必要这样做,最后我选择的方法是完全在一个窗口上,将上面的所有内容都已绘图的方式展现出来。之后又遇到了闪烁的问题,是由于Invalidate() 这个函数要使整个窗口无效然后重绘造成的,解决的办法是用InvalidateRect(&rect)这个方法只更新某个区域,不需要重绘的地方不重绘,解决了这个问题。我的这个程序类划分情况是:
1, ElementSquare类,方块的最小单位,存放方块的位图信息,提供画自己,擦去前一个位置,向(下,左右)移动等操作。
2, Shape类,此类为一个抽象类,其中方块变形函数为存虚函数,留到它的派生类(具体方块形状)类中去实现,抽象出了一些公用的操作,如,向下落,左右移动,这三个函数中要有根据已经落下方块的数组来判断是否到底或者不能移动的情况。
3, Shape0~Shape5继承自Shape类,覆盖基类变形函数。此类设置每种方块的初始坐标,以提供不同形状。Public,private,protected继承的基类,基类就相当于本类的public,private,protected的成员。在这个类中初始化各个每个单元的坐标。
对于变形这个函数,反复试验了好久,终于找到了一个可以解决变形过程中残留图像的问题,我的做法是在变形(改变坐标)之前调用一个ElementSquare的是当前位置无效的函数EraseCurrent,这样在改变坐标之后执行shape类的Erase方法更新窗口之后,前一个位置的残留图像就没有了,那么下落和左右移动过程中的函数也应该可以这样做。经过了代码的修改之后,我发现左右移动和下落过程用同样的方法也可以实现,这就使得ElementSquare类中不用维护preX,preY了。
4, Execute类,这个类负责总的调度,提供一些方法供view类使用,使得外部只需要调用几个方法就可以完成方块所有的操作。
5, 对于二字型的图形来说,它只有两种状态
经过与阿淼讨论之后,发现方块变形的时候只是计算下一个图形位置是否被占据,如果被占据则不能发生变形,否则可以变形,再次修改变形代码。
                       简单的测试
简单的编写完一个图形之后,我做了一下测试,遇到了好几个问题,但是都一一解决了,最让我兴奋的一个是我重绘窗口之前对上一步所画的四个小矩形区域分别使用InvalidateRect(&rect)函数标记为无效,然后直接画下一步动作的形状,这就出现了一个问题:下一步画出来的形状总是少了与上一步重合的部分,在网上查了资料之后发现invalidaterect这个函数是发送一个低优先级别的WM_PAINT消息,如果后面有其他动作就需要等待一段时间才刷新,这就导致我第二部已经画完图形后,才刷新第一步的痕迹,所以才会出现这样的效果。我解决的办法是在更新完每个小正方形之后调用UpdateWindow()函数,这个函数是操作系统立即响应wm_paint消息,立即刷新窗口,解决了问题。
 
                        头文件循环引用问题
  两个头文件相互包含时会出现一中循环引用的错误,表现为某个头文件中找不到另外的头文件中的类型定义,解决的办法是在头文件中虚拟声明另一个找不到的类型。
                       消行以及重绘
消行的代码经过了一次修改之后达到现在这样,我对每行都增加了一个指针的标志位,然后一轮扫描之后就确定哪行可以消去,然后消去,重排。之后就是重新绘制图形,刚开始有点犯傻在容器这个类中自行重绘,后来突然想起应该在onDraw函数中重绘,于是把重绘的函数调用加到了ondraw函数中就解决了无法重绘的问题。容器数组中始终保存当前小方块的对象。
                空格直接下落
在OnKeyDown中捕捉char(32) 空格这个事件,调用shape的FallDown函数知道该函数返回假
显示下一个图形:在Execute类中我创建了一个 Shape的副本用于保存下一个图形,为此我修改了shape类的代码,添加了一个修改这个图形坐标的方法,这样在这个副本中我就能设置这个图形要显示的位置,然后再每次当前图形到底的时候将这个副本显示区域置为无效并删除这个副本,然后再下一次方块第一次下落的时候调用shape的Erase方法发送updatewindow消息然后重新绘制下一个要显示的图形。

             Mfc工程中使用stl的问题
在mfc工程中使用stl,包含头文件和名字空间的代码应该放在
#ifdef _DEBUG
#define new DEBUG_NEW
之前,否则就会出错,具体为什么我还不清楚

 

下载地址:http://download.csdn.net/source/1750299

 

截图如下:

 

截图

 

 

 

抱歉!评论已关闭.