zoukankan      html  css  js  c++  java
  • 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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
    正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!
  • 相关阅读:
    实验五 shell脚本编程
    实验四 Linux系统C语言开发环境学习
    实验三 Linux系统用户管理及VIM配置
    实验二 Linux系统简单文件操作命令
    实验一 Linux系统与应用准备
    实验八 进程间通信
    实验七 信号
    实验六 进程基础
    实验五 shell脚本编程
    实验四 Linux系统搭建C语言编程环境
  • 原文地址:https://www.cnblogs.com/ice-river/p/3647250.html
Copyright © 2011-2022 走看看