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

一 引子

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

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

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

1.界面截图如下:

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

砖块类设计

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

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

你可能感兴趣的:(WinForm)