日期:2014-05-18  浏览次数:21493 次

解决俄罗斯方块 画面闪烁问题(求加精!)
最近在做俄罗斯方块 发现游戏中的小方块一旦多了 刷新游戏窗口的时候画面出现闪烁的情况,该咋个解决喃?
关键绘图代码:
//gs是Graphics的对象
gs.FillRectangle(Brushes.Green, X * 20, Y * 20, 19, 19);


------解决方案--------------------
SetStyle(ControlStyles.UserPaint, true); 
SetStyle(ControlStyles.AllPaintingInWmPaint, true); //禁止擦除背景. 
SetStyle(ControlStyles.DoubleBuffer, true); //双缓冲 

------解决方案--------------------
SetStyle(ControlStyles.UserPaint, true); 
SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景. 
SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲 

------解决方案--------------------
那句 代码 放在 船体的 初始化 的 地方,如果 你是 画在 窗体 上的 话,
也就是说 你画在 哪 ,那句代码 就写在 哪,这种简单的问题 不需要 MVP现身的。。
呵呵

简单的说 就是 使用 双缓冲。。。
船体 有这个 属性的。
同样 PictureBox 也有 ,有不少控件 都有这个属性。
所以 有时 直接 DoubleBuffer=true;
就可以了..

双缓冲 的 原理么,顾名思义,两层缓冲区,
所有绘图操作 在缓冲区完成 再显示到 控件上...
 
------解决方案--------------------
首先闪烁的原因是你在不停的刷屏幕。飞飞用的方法也可以,其实不太需要那么复杂的。

只要注意部分矩形更新就可以了,每个俄罗斯方块的个体其实都是由四个正方形组成的。每次移动,可以看成只是矩形的位置在变。我可以举个例子,如果让单个矩形快速移动不闪烁,估计你就能很好理解了。

假设有个窗体作为背景。

假设开始的位置为 (0,0), 0.1秒之后,移动到了 (0,5),背景颜色为 白色, 矩形颜色为红色,长宽都是10 
这么做就可以了 
grafx.FillRect(Brushs.White,0,0,10,10);//这一步只是把之前的位置涂成背景就可以了
grafx.FillRect(Brushs.Red, 0, 5, 10, 10); //画出新的位置就可以了。

只画那些发生了变化的地方就行了。