1个计时器完成气泡碰撞

一、要使用(学到)的知识

1、如何在解决方案资源管理器中新建项目?

​ (1)选择解决方案资源管理器在最上边解决方案资源管理器“…”=》右击新建项目=》选择windows窗体应用并创建。

​ (2)要注意的问题:创建后默认启动项是你创建的第一个项目,所以必须将创建后的项目设置位启动项后方可运行创建后的项目。

2、如何添加两个以上的气泡运动?

方法:

​ (1)如果要实现多个气泡出现,就必须创建一个对象,创建一个什么对象呢?

 Form3 f = new Form3();//创建一个 Form3类型的对象,取名叫f,

我们要在当前的窗体中创建一个跟它一样的对象,因为我此时的窗口是Form3。就相当于克隆了一个跟它一样的窗体,当然它也具备此时窗体的全部功能(包括属性、方法、事件)。但是创建以后我们还不能实现。

​ (2)为什么不能实现?

​ 因为,此时你只是创建了一个,而你并没有让它显示出来,那如何让它显示出来呢?

 f.Show();//向用户显示控件

​ 我们就要用到 Form3类型对象的方法show,它表示在当前桌面中显示出它

​ 同样,也可以让这个创建后的对象进入这个窗体后改变颜色

 f.BackColor = Color.Orange;//改变当前创建的对象的背景颜色

要想让创建后的对象改变颜色,必须要在显示之后让他改变颜色,否则会执行此时已经在上边设定好的颜色

3、如何添加两个气泡运动?

方法:

​ (1)同样,也要创建(实例化)一个对象,不过这次,是使用同项目下另外一个Form窗体中的功能,前提是,你的另外一个Form窗体中也同样有小球运动。可以说是将你另外一个窗体中的气泡运动导入到此时的窗体中。

Form2 f = new Form2();//再创建一个Form2取名为f,
f.Show();
f.BackColor = Color.Orange;

​ 我这里是将Form2的转入到Form3中

​ (2)然后将这三行代码放入到 Form3_Load 事件中去即可

4、画圆三步曲的的优化

this.Size = new Size(200, 200);//设置窗体的宽高为200px

path.AddEllipse(0, 0, 200, 200);//向当前路径中添加一个椭圆

​ (1)上次我们是因为给定窗体宽高为200,200,所以圆的值也是200,200,不过这样有一个缺点,那就是当我们把窗体的宽高设置成其他的值后,圆里边的也要换,这样显得比较麻烦,而且,窗体的宽高改变以后,圆的值不变,会有大量的空白。所以今天介绍另一种方法。

​ (2)优化后的方法

​ 将圆后的200,200值直接改为控件的宽高

path.AddEllipse(0, 0, this.Width, this.Height);//向当前路径中添加一个椭圆

二、一个计时器实现气泡碰撞

1、语句

(1)要利用的语句为if判断语句

(2)在 Form1_Load中定义变量

(3)要运用到负数

2、分析(思想)

​ (1)在让气泡从左上角原点往下跑

​ (2)让后到显示器的下边不让他停下,直接然他往上走,那么该如何是实现呢?

​ ①往上走的话,top应该是减的,left是加的。

​ ②因为我们让他从左上角原点往下跑,top和left都是加的。

③往上走那么,left还是加不变,top要变成减号

④然后我们要让它往右跑,往右跑的话lefr还是加不变,left变成了加

​ 那么我们该如何实现③④呢?

​ 我们可以用if判断当碰到下边,我们直接网上,当碰到上边直接往左,所以是两个条件

​ 然后如何让让top先变减后变加呢?

​ 我们可以让y*(-1)然后赋值给y=y=y*(-1),当到④的时候y已经是-y了所以又乘以-1变成了y

​ (3)往右走以后,到显示器边界,直接让他往下,然后往上

​ 此时也要连个判断

①当气泡往右走的时候left是一直变大的,知道显示器边界,所以我们就可以直接判断,然后往下

②当往下left是一直变小的,所以就可以判断,让他往上,但top一直是增大的不变

​ 那么如何实现①②呢?

​ 往下,x的值是变小的,往上是变大的,所以我们也可以用到上面的方法,让x乘以-1…

​ 三、下面看实际操作(往后顺序已经在代码最后标记)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _20200410study04
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

​    private void Form1_Load(object sender, EventArgs e)
​    {
​        this.FormBorderStyle = FormBorderStyle.None;//设置窗体的边框样式为无边框
​        this.Location = new Point(0, 0);//设置窗体的坐标为左上角原点
​        this.Size = new Size(150, 150);//设置窗体的宽高为150
​        this.BackColor = Color.Pink;//设置窗体的背景颜色
​        //画圆
​        GraphicsPath path = new GraphicsPath();//实例化/创建一个GraphicsPath类型的对象
​        path.AddEllipse(0,0,this.Width,this.Height);//向当前路径中插入一个圆
​        this.Region = new Region(path);//获取与控件关联的窗口区域
​        timer1.Start();//打开timer1
​        timer1.Interval = 20;//设置timer1事件发生的频率
​       
​    }
​    //设置全局变量
​    int y = 7;//定义一个有符号整数的数据类型,起名为y并将7赋值给它
​    int x = 7;//定义一个有符号整数的数据类型,起名为x并将7赋值给它

​    private void timer1_Tick(object sender, EventArgs e)
​    {
​        //气泡从左上方往右下方移动
​        this.Left += x;//控件向右移动x像素距离
​        this.Top += y;//控件向下移动y像素距离
​        if (this.Top+this.Height>=Screen.PrimaryScreen.WorkingArea.Height || this.Top<=0)
​        //两个条件
​        //第一个条件:控件上边缘与容器工作区上边缘之间的距离+容器的高度大于等于显示器工作区域的高度
​        //第二个条件:控件上边缘与容器工作区上边缘之间的距离小于等于0
​        {
​            y =-y;//等于y=-1*y;
​            //①当第一个条件成立以后,y的值变为-y,this.top=this.top-y;就变为往上
​            //②当第二个条件成立时,原先的-y又乘以一个-1变为正数,this.top=this.top+y;就变为往右
​        }
​        if (this.Left+this.Width>=Screen.PrimaryScreen.WorkingArea.Width || this.Left <=0)//
​        {
​            //两个条件
​            //第一个条件:控件左边缘与容器工作区左边缘之间的距离+容器的宽度大于等于显示器工作区域的宽度
​            //第二个条件:控件左边缘与容器工作区左边缘之间的距离小于等于0
​            x = -x;
​            //①当第一个条件成立时,x的值变为-y,this.left=this.left-x;变为往下
​            //②当第二个条件成立时,原先的-x又乘以一个-1变为正数,this.left=this.left+x;变为往上
​            //然后往上满足了(this.Left+this.Width>=Screen.PrimaryScreen.WorkingArea.Width)这个条件然后,x变为-x往左
​            //往左后又满足了(this.Left <=0)这个条件,然后,-x的值变为x就往下
​            //往下后又满足了第一个if中的条件(this.Left+this.Width>=Screen.PrimaryScreen.WorkingArea.Width)y变为-y往上..........
​            //后面你懂的。。。。。。。。
​        }

​    }
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御弟謌謌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值