移动图像以反弹或旋转一圈

时间:2012-04-08 05:02:37

标签: c# winforms

我发现这个小应用程序,我一直在玩这个过去一段时间。我想知道,如果我想简单地将图像旋转一圈?或者使整个图像上下弹跳,我将如何修改此程序呢?我尝试的所有东西都会拉伸图像 - 即使我确实让它向左或向右移动。关于我能做什么的任何想法?代码如下

   public partial class Form1 : Form
   {
          private int width = 15;
          private int height = 15;

          Image pic = Image.FromFile("402.png");
          private Button abort = new Button();
          Thread t;

          public Form1()
          {
            abort.Text = "Abort";
            abort.Location = new Point(190, 230);
            abort.Click += new EventHandler(Abort_Click);
            Controls.Add(abort);

            SetStyle(ControlStyles.DoubleBuffer| ControlStyles.AllPaintingInWmPaint| ControlStyles.UserPaint, true);

            t = new Thread(new ThreadStart(Run));
            t.Start();
          }
          protected void Abort_Click(object sender, EventArgs e) 
          {
            t.Abort();
          }

          protected override void OnPaint( PaintEventArgs e )   
          {
             Graphics g = e.Graphics;
             g.DrawImage(pic, 10, 10, width, height);
             base.OnPaint(e);
          }

          public void Run() 
          {

              while (true) 
              {
                for(int i = 0; i < 200; i++) 
                {
                    width += 5;

                  Invalidate();
                  Thread.Sleep(30);
                }

              }
          }
    }

1 个答案:

答案 0 :(得分:1)

所以我不知道你想要实现什么,但是为了让筹款不受影响,WinForms是一个GDI +库,它更多的是用于GUI的东西,所以像动画这样的东西可能会更好地处理像SFML这样的图形库。

无论如何,有一百万种方法可以达到你想要的效果。在围绕一个圆圈移动的东西方面,你需要一点点简单的触发。对于弹跳动作,我会说遵循正弦曲线是最简单的方法。

这是一些用于弹跳的伪代码(不确定这是否是语法完美的):

字段定义:

private double frame = 0;

的OnPaint:

Graphics g = e.Graphics;
g.DrawImage(pic, 10, 10 + Math.sin(frame)*10, width, height);
frame+=.01;
base.OnPaint(e);

这样,每次触发绘制事件时,t都会增加.01弧度。罪有一个在-1和1之间振荡的域,你可以乘以10倍来获得这种弹跳效果。

Frame代表您的“关键帧”。如果您想加快速度,请将frame+=__增加到更高的值。如果要增加范围,请更改偏移量Math.sin(frame)*__