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

一 引子

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

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

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

1.界面截图如下:

 

砖块类设计

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

 1     public class CommonBrick : GameObject
 2     {
 3     
 4         public Rectangle m_Rect { get; set; }
 5         public Color m_Color = Color.Blue;
 6         public CommonBrick()
 7         {
 8 
 9         }
10         public CommonBrick(Rectangle r)
11         {
12             m_Rect = r;
13            
14         }
15         public override void Draw(Graphics g)
16         {
17             Pen p = new Pen(Color.Red, 3);
18             using (SolidBrush sbrush = new SolidBrush(Color.Blue))
19             {
20                 g.DrawRectangle(p, m_Rect);
21                 g.FillRectangle(sbrush, m_Rect);
22             }
23         }
24     }

四 墙类设计

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

    public class Bricks : GameObject
    {
        private int _width = 400; //砖块集宽
        private int _height = 300;//砖块集高
        //砖块集
        public List<CommonBrick> m_Rects { get; set; }
        public Bricks()
        {
            MakeBrickWall();
        }
        //构造砖墙形状
        private void MakeBrickWall()
        {
      
            m_Rects = new List<CommonBrick>();
      
            for (int i = 120; i < _height; i += 20)
            {
           
                for (int j = 2; j < _width; j += 30)
                {

                    Rectangle Rect = new Rectangle(j, i, 28, 18);
                    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, 0, 0);
            g.Dispose();
        
        }

六 代码下载

本节代码下载

  

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