65.9K
CodeProject 正在变化。 阅读更多。
Home

桌面上的弹球

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.26/5 (14投票s)

2007年9月30日

CPOL

1分钟阅读

viewsIcon

48531

downloadIcon

2814

本文介绍了如何创建一个在桌面上移动的简单用户绘制的窗体

Screenshot - ball.png

引言

当我刚开始学习 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 日:初始发布
© . All rights reserved.