一 引子

为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持。

预备知识,无GDI画图基础的童鞋请先阅读一篇文章让你彻底弄懂WinForm GDI 编程基本原理

二 本节内容---画墙(砖块集合)以及双缓冲实现

1.界面截图如下:

Winform打砖块游戏制作step by step第6节---画墙(砖块集合)以及双缓冲实现-LMLPHP

三 砖块类设计

砖块类的定义代码和之前的挡板类差不多,代码如下:

     public class CommonBrick : GameObject
{ public Rectangle m_Rect { get; set; }
public Color m_Color = Color.Blue;
public CommonBrick()
{ }
public CommonBrick(Rectangle r)
{
m_Rect = r; }
public override void Draw(Graphics g)
{
Pen p = new Pen(Color.Red, );
using (SolidBrush sbrush = new SolidBrush(Color.Blue))
{
g.DrawRectangle(p, m_Rect);
g.FillRectangle(sbrush, m_Rect);
}
}
}

四 墙类设计

墙体是砖块的集合,顾墙类的一个主要数据成员是public List<CommonBrick> m_Rects { get; set; },墙类的详细代码如下:

    public class Bricks : GameObject
{
private int _width = ; //砖块集宽
private int _height = ;//砖块集高
//砖块集
public List<CommonBrick> m_Rects { get; set; }
public Bricks()
{
MakeBrickWall();
}
//构造砖墙形状
private void MakeBrickWall()
{ m_Rects = new List<CommonBrick>(); for (int i = ; i < _height; i += )
{ for (int j = ; j < _width; j += )
{ Rectangle Rect = new Rectangle(j, i, , );
CommonBrick cbrick = new CommonBrick(Rect);
m_Rects.Add(cbrick);
}
} }
//画墙
public override void Draw(Graphics g)
{
foreach (CommonBrick b in m_Rects)
{
b.Draw(g);
} g.Dispose();
} }

五 主界面描绘双缓冲实现

所谓双缓冲技术指的是,不像之前那样将各种对象直接画在主窗体的Graphics中,这样会造成界面闪烁,代替的是,我们将全部对象先画到一个Image对象m_bitmap中,该对象存在于内存中,最后在一次性将这个Image对象画到Graphics中。

     public void timer_Tick(object sender, EventArgs e)
{
foreach (GameObject go in m_lstGameObject)
{
if(go is Ball)
go.Run();
} Graphics g = this.CreateGraphics(); foreach (GameObject go in m_lstGameObject)
{
go.Draw(Graphics.FromImage(m_bitmap));
}
g.DrawImage(m_bitmap, , );
g.Dispose(); }

六 代码下载

本节代码下载

作者:宋波
出处:http://www.cnblogs.com/ice-river/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!
05-11 13:31