3

首先是代码。

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

namespace winform_project
{
  public partial class Form1 : Form
  {
    void movement_correct(PictureBox pic, int i)
    {
        System.Threading.Thread.Sleep(25);
        pic.Top += (i - 1);
        pic.Left += (i + 3);
    }

    void movement_up(PictureBox pic, int i)
    {
        System.Threading.Thread.Sleep(25);
        pic.Top -= (i - 1);
        pic.Left -= (i + 3);
    }
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 5; i++)
        {
            movement_correct(pictureBox1, i);
            movement_correct(pictureBox2, i);
            movement_correct(pictureBox3, i);
            movement_correct(pictureBox4, i);
            movement_correct(pictureBox5, i);
            movement_correct(pictureBox6, i);
            movement_correct(pictureBox7, i);
            movement_correct(pictureBox8, i);
            movement_correct(pictureBox9, i);
            movement_correct(pictureBox10, i);
        }

        for (int i = 0; i < 5; i++)
        {
            movement_up(pictureBox1, i);
            movement_up(pictureBox2, i);
            movement_up(pictureBox3, i);
            movement_up(pictureBox4, i);
            movement_up(pictureBox5, i);
            movement_up(pictureBox6, i);
            movement_up(pictureBox7, i);
            movement_up(pictureBox8, i);
            movement_up(pictureBox9, i);
            movement_up(pictureBox10, i);
        }

    }
 }
}

有 10 个虚拟图片框。每当我点击按钮时,它们就会开始移动一点(有点像太空入侵者中的敌人)。

我正在尝试在 winforms 中制作流畅的动画。问题是动画没有我想要的那么流畅。在我的代码中,所有的盒子都没有同时移动,它们的移动有一点明显的差距。我想要的是平稳的运动。

我当时正在考虑对它进行多线程处理,但后来意识到这意味着每个对象都有一个线程。有没有其他方法(在winforms中)。

谢谢您的帮助。

4

3 回答 3

1

Thread.Sleep(n)用于计时目的是保证无法获得流畅动画的方法;这是因为传递给的值Thread.Sleep被操作系统视为最小睡眠时间,这意味着睡眠的实际持续时间可以(并且通常是)更长一些。您应该改为使用QueryPerformanceCounter来驱动动画。

即使使用适当的高分辨率计时引擎,您仍然会有“撕裂”效果。

于 2012-10-31T14:56:25.677 回答
1

在你的 for 循环中调用this.SuspendLayout()andthis.ResumeLayout()将有助于保持所有框同时移动。它可能不会让你变得平滑,但它会让一切都保持一致。

于 2012-10-31T14:58:52.793 回答
1

退出方法并在循环迭代中执行一次将减少每个框和调用sleep()之间的延迟从(超过 250 毫秒)到(略超过 25 毫秒) 。movement_correct()movement_up()

于 2012-11-01T19:58:45.737 回答