c# - 在 C# 中构建流畅的动画

标签 c# .net winforms multithreading animation

首先是代码。

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 中)。

感谢您的帮助。

最佳答案

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

即使使用合适的高分辨率时序引擎,您仍然会产生“撕裂”效果。

关于c# - 在 C# 中构建流畅的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13160571/

相关文章:

c# - 从枚举类型创建类的最干净的方法?

c# - Windows Phone开发中如何引用ApplicationBar上的按钮

c# - 为什么这个更新只能工作一次?

.net - DataGrid 列中的列/行索引

winforms - 如何以现有形式显示 FSharp.Charting 图?

c# - 滑动条拇指尺寸

C# 通过 SOCKET 读取/写入 JAVA 并存在一些并发/套接字问题

javascript - jQuery 用户界面 : Uncaught TypeError: Cannot read property 'nodeType' of undefined

c# - 保存 Winform 窗体控件状态的最佳方法?

.net - ASP.NET 2.0 IIS 设置