zoukankan      html  css  js  c++  java
  • Winform打砖块游戏制作step by step第4节---小球移动

    一 引子

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

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

    二 本节内容---小球移动

    1.主窗体启动后,一个小球自动开始运动,碰到界面的四周,进行反弹,反弹后运动速度可能变快或者变慢,主界面截图如下:

     

    三 小球类设计

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

     public class Ball 
        {
            //坐标
            public int XPos { get; set; }
            public int YPos { get; set; }
            public int SpeedX { get; set; }
            public int SpeedY { get; set; }
    
            public Rectangle Rect;
            /// <summary>
            /// 初始化小球位置和偏移值
            /// </summary>
            public Ball(int x, int y, int speedX, int speedY)
            {
                this.XPos = x;
                this.YPos = y;
                this.SpeedX = speedX;
                this.SpeedY = speedY;
            }
    
            public void Draw(Graphics g)
            {
                using (SolidBrush sbrush = new SolidBrush(Color.Snow))
                {
                    Rect = new Rectangle(XPos, YPos, 20, 20);
                    g.DrawEllipse(new Pen(Color.Gray), Rect);
                    g.FillEllipse(sbrush, Rect);
                }
              //  g.Dispose();
            }
    
    
            public void Run()
            {
                XPos = XPos + SpeedX;
                YPos = YPos - SpeedY;
                if (XPos <= 0)
                    SpeedX = (new Random().Next(3, 5));
                if (XPos >= 378)
                    SpeedX = -(new Random().Next(3, 5));
                if (YPos <= 100)
                    SpeedY = -(new Random().Next(3, 8));
                if (YPos >= 580)
                    SpeedY += (new Random().Next(3, 8));
            }
    
        }

    值得一提是run方法,4个条件判断分别判断是否碰到了界面的4条边。

    四 主界面代码

    主界面中,定义一个timer来表达小球的运动,timer初始化代码如下:

    timer = new Timer();

    timer.Interval = 10;
    timer.Tick += new EventHandler(timer_Tick);
    timer.Start();

    timer处理函数如下(小球移动,刷新屏幕):

    public void timer_Tick(object sender, EventArgs e)
    {
    m_Ball.Run();
    this.Refresh();
    }

    窗体onPaint函数修改如下(重绘挡板及小球):

            private void BrickGame_Paint(object sender, PaintEventArgs e)
            {
         
                m_Ball.Draw(e.Graphics);
                m_board.Draw(e.Graphics);
            }

    五 代码下载

    本节代码下载

      

    作者:宋波
    出处:http://www.cnblogs.com/ice-river/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
    正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!
  • 相关阅读:
    mysql source 乱码
    php5.6.11 openssl安装
    python threading模块的Lock和RLock区别
    python多线程一些知识点梳理
    多核处理器中进程和线程是如何一起工作的?
    IO是否会一直占用CPU?(转)
    Python TypeError: __init__() got multiple values for argument 'master'(转)
    Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解(转)
    浏览器环境下JavaScript脚本加载与执行探析之代码执行顺序(转)
    为什么有的网页右击没有出现审查元素
  • 原文地址:https://www.cnblogs.com/ice-river/p/3594556.html
Copyright © 2011-2022 走看看