首先是代码。
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内)。
感谢您的帮助。
答案 0 :(得分:1)
使用Thread.Sleep(n)
进行计时是获得平滑动画的有保证的方法;这是因为传递给Thread.Sleep
的值被OS视为最小睡眠时间,这意味着睡眠的实际持续时间可以(通常是)稍微长一点。您应该使用QueryPerformanceCounter来驱动动画。
即使使用适当的高分辨率计时引擎,您仍然会有“撕裂”效果。
答案 1 :(得分:1)
在for循环中调用this.SuspendLayout()
和this.ResumeLayout()
将有助于保持所有框同时移动。它可能不会让你顺利,但它会让一切都像一个人一样移动。
答案 2 :(得分:1)
从循环迭代中获取sleep()
并在循环迭代中执行一次将减少每个框movement_correct()
和{{之间的延迟(超过250毫秒)到(略大于25毫秒) 1}}来电。