桌面上的弹球






3.26/5 (14投票s)
本文介绍了如何创建一个在桌面上移动的简单用户绘制的窗体

引言
当我刚开始学习 C# 时,我一直在思考我可以做些什么。这个简单的例子出现在我的脑海中,因为它在一些不同的地方都有实现,例如 Direct X 浏览器。我只是重新实现了它,并添加了一些重力和透明度。
步骤
1. 创建一种显示球的方式
我们需要某种方式来显示我们要弹跳的球/框。最简单的方法之一是创建一个新的窗体,将其边框样式设置为无,然后自己绘制它。
...
this.ControlBox = false;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.MaximizeBox = false;
this.MinimizeBox = false;
...
private void BallForm_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.Clear(Color.Cyan); //Transparent color
g.FillPie(Brushes.Red, 0, 0, Width - 1, Height - 1, 0, 360);
g.DrawArc(Pens.Black, 0, 0, Width - 1, Height - 1, 0, 360);
}
2. 让球移动
为了移动球,我使用了自己的应用程序循环,但你也可以创建一个定时器,调用一个 OnTick
方法。
我们通过使用两个向量来移动我们的球:第一个用于当前位置,第二个用于速度。
moveY += 0.1; //gravity
X += moveX;
Y += moveY;
Location = new Point((int)X, (int)Y);
3. 让球弹跳
我们将使用桌面的边框作为墙壁;对于碰撞,只需检查球的位置是否超过了它们。
if (X < 0)
{
X = 0;
moveX = -moveX;
moveX *= 0.75;
moveY *= 0.95;
}
if (X > Screen.PrimaryScreen.WorkingArea.Width - 1 - Width)
{
X = Screen.PrimaryScreen.WorkingArea.Width - 1 - Width;
moveX = -moveX;
moveX *= 0.75;
moveY *= 0.95;
}
我减少了两个运动变量,以创建更逼真的运动,因为球通常不会因为摩擦力而无限次地碰撞。
4. 让球在静止后再次弹跳
由于我们添加了摩擦力,球在一段时间后会静止。因此,我们只需给它一个额外的推动,让它再次开始。
if (Math.Abs(moveX) < 0.1 && Math.Abs(moveY) < 0.5 &&
Y > Screen.PrimaryScreen.WorkingArea.Height - 1 - Height - 40)
Bounce();
注意:由于球在屏幕顶部时也会静止,因此我们在弹跳之前检查球是否在桌面的底部。
其他更改
通过改变物理属性,如重力/摩擦力/速度,你可能会得到一些不错的结果……
历史
- 2007 年 9 月 30 日:初始发布