1

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

   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);
                }

              }
          }
    }
4

1 回答 1

1

所以我不知道你想要实现什么,但为了让基金们摆脱困境,WinForms 是一个 GDI+ 库,它更多地用于 GUI 的东西,所以像动画这样的东西可能会更好地由图形库处理像SFML一样。

无论如何,有一百万种方法可以实现您想要的。就在圆周上移动某些东西而言,您需要一些简单的触发。对于弹跳运动,我会说遵循正弦曲线将是最简单的方法。

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

字段定义:

private double frame = 0;

上漆:

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

这样,每次触发绘制事件时,t 都会增加 0.01 弧度。sin 有一个在 -1 和 1 之间波动的域,你可以将它乘以 10 以获得弹跳效果。

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

于 2012-04-08T05:20:16.913 回答