如何在C#Windows窗体应用程序中创建平滑的形状动画运动?

东方

我正在制作C#Windows窗体应用程序,在该应用程序中我想在白色背景上进行黑色条的平滑动画移动。我尝试了以下代码,但是即使在1毫秒间隔的计时器上,动作仍然闪烁且无法实现平稳的快速移动。

我尝试了以下代码:

    public Form1()
    {
        InitializeComponent();
        DoubleBuffered = true;
        System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
        timer1.Interval = 30;
        timer1.Tick += Timer1_Tick;
        timer1.Enabled = true;
    }
    int x_position = 0;
    int bar_width = 40;
    int speed = 1;
    private void Timer1_Tick(object sender, EventArgs e)
    {
        x_position += speed;
        if (x_position + bar_width > this.Width) x_position = 0;
        Invalidate();
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.FillRectangle(Brushes.Black, x_position, 0, bar_width, 500);
    }

结果根本不是平稳的运动。我在另一个问题上发现了类似Invalidate(true)或的问题DoubleBuffered = true;但他们没有解决问题。

等待帮助。谢谢

彼得·杜尼奥

Winforms API及其基于其构建的本地Win32窗口消息API根本不是为“平滑动画”设计的。即使不是不可能,也很难实现完美流畅的动画。

也就是说,您可以做很多事情来改善您的上述尝试:

  • 不要使用CreateGraphics()相反,请始终对Paint事件做出反应
  • 不要使用任何.NET计时器实现来计划渲染。取而代之的是,尽可能快地绘制,并考虑帧之间的时间以更新对象位置。

应用这些想法,这里是你的代码的一个版本,作品好:

const float speedXPerSecond = 1000f / 30;
const int bar_width = 40;

public Form1()
{
    InitializeComponent();
    DoubleBuffered = true;
}

float x_position = 0;
TimeSpan _lastFrameTime = TimeSpan.Zero;
Stopwatch _frameTimer = Stopwatch.StartNew();

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    TimeSpan currentFrameTime = _frameTimer.Elapsed;
    float distance = (float)(currentFrameTime - _lastFrameTime).TotalSeconds * speedXPerSecond;

    x_position += distance;
    while (x_position > this.Width) x_position -= this.Width;
    e.Graphics.FillRectangle(Brushes.Black, x_position, 0, bar_width, 500);
    _lastFrameTime = currentFrameTime;

    Invalidate();
}

您可以将此通用技术应用于任何交互式方案。真实游戏将具有此一般“渲染循环”的其他元素,包括用户输入和更新游戏状态(例如,基于物理模型)。这些将增加渲染循环的开销,并且必然会降低帧速率。但是,对于使用任何合理最新硬件(例如,在过去的几十年中构建)的任何基本游戏,其净帧速率仍将远远高于可接受的流畅游戏所需的帧速率。

请注意,在托管.NET / Winforms上下文中,与使用较低级别的API相比,此方法的成功始终受到限制。特别是,如果您没有进行任何额外的工作,则垃圾收集将定期中断,从而导致帧速率稍微停滞不前,以及线程调度和线程的消息队列中的不均匀性。

但是根据我的经验,人们提出这样的问题并不需要绝对完美。他们需要“足够好”,这样他们才能继续学习游戏开发中涉及的其他主题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C#Windows窗体应用程序中动态创建网格

来自分类Dev

如何在C#Windows窗体应用程序中激活spellCheck?

来自分类Dev

如何在C#Windows窗体中创建选项窗体?

来自分类Dev

如何使C#Windows窗体应用程序适合屏幕

来自分类Dev

我们如何在C#Windows应用程序中访问动态创建的控件?

来自分类Dev

在WinForm应用程序中创建平滑的圆角

来自分类Dev

如何在C#Windows Store应用程序(又名WinRT / Metro)中创建查询字符串?

来自分类Dev

C#Windows窗体应用程序关闭

来自分类Dev

我将如何在 pygame 中创建平滑的相机运动?

来自分类Dev

我如何获得素数(C#Windows窗体应用程序中的哥德巴赫猜想)

来自分类Dev

如何使用for循环在c#windows窗体应用程序中检查文本框是否为空,使用数组

来自分类Dev

如何在C#Windows应用程序中为HID设备编写驱动程序

来自分类Dev

覆盖C#Windows应用程序窗体中的透明图片框?

来自分类Dev

SQL命令在C#Windows窗体应用程序中不起作用

来自分类Dev

在C#Windows窗体应用程序中以编程方式继承表

来自分类Dev

如何在C#Windows Form应用程序的Data gridview中搜索?

来自分类Dev

如何在C#Windows应用程序中增加标签框文字的大小?

来自分类Dev

如何在C#Windows Forms应用程序中运行嵌入式.exe文件?

来自分类Dev

如何在C Sharp Windows窗体应用程序中从窗体2修改窗体3中的值

来自分类Dev

使用Visual Studio 2012创建的C#Windows窗体应用程序无法在Windows XP上运行

来自分类Dev

如何在C#Windows窗体中创建一个重置按钮?

来自分类Dev

如何在使用C#Windows应用程序创建文本文件时添加文本?

来自分类Dev

在Windows窗体应用程序中绘制形状

来自分类Dev

如何在C#中从Windows窗体应用程序项目设置.dll文件的路径?

来自分类Dev

如何为菜单创建平滑的动画?

来自分类Dev

如何将C .DLL文件导入C#Windows窗体应用程序并调用其在标头中定义的函数?

来自分类Dev

如何返回父表单而不在C#Windows应用程序中创建父类的新实例

来自分类Dev

如何部署使用SQL Server Express 2012和Crystal Report开发的C#Windows窗体应用程序

来自分类Dev

如何部署使用SQL Server Express 2012和Crystal Report开发的C#Windows窗体应用程序

Related 相关文章

  1. 1

    如何在C#Windows窗体应用程序中动态创建网格

  2. 2

    如何在C#Windows窗体应用程序中激活spellCheck?

  3. 3

    如何在C#Windows窗体中创建选项窗体?

  4. 4

    如何使C#Windows窗体应用程序适合屏幕

  5. 5

    我们如何在C#Windows应用程序中访问动态创建的控件?

  6. 6

    在WinForm应用程序中创建平滑的圆角

  7. 7

    如何在C#Windows Store应用程序(又名WinRT / Metro)中创建查询字符串?

  8. 8

    C#Windows窗体应用程序关闭

  9. 9

    我将如何在 pygame 中创建平滑的相机运动?

  10. 10

    我如何获得素数(C#Windows窗体应用程序中的哥德巴赫猜想)

  11. 11

    如何使用for循环在c#windows窗体应用程序中检查文本框是否为空,使用数组

  12. 12

    如何在C#Windows应用程序中为HID设备编写驱动程序

  13. 13

    覆盖C#Windows应用程序窗体中的透明图片框?

  14. 14

    SQL命令在C#Windows窗体应用程序中不起作用

  15. 15

    在C#Windows窗体应用程序中以编程方式继承表

  16. 16

    如何在C#Windows Form应用程序的Data gridview中搜索?

  17. 17

    如何在C#Windows应用程序中增加标签框文字的大小?

  18. 18

    如何在C#Windows Forms应用程序中运行嵌入式.exe文件?

  19. 19

    如何在C Sharp Windows窗体应用程序中从窗体2修改窗体3中的值

  20. 20

    使用Visual Studio 2012创建的C#Windows窗体应用程序无法在Windows XP上运行

  21. 21

    如何在C#Windows窗体中创建一个重置按钮?

  22. 22

    如何在使用C#Windows应用程序创建文本文件时添加文本?

  23. 23

    在Windows窗体应用程序中绘制形状

  24. 24

    如何在C#中从Windows窗体应用程序项目设置.dll文件的路径?

  25. 25

    如何为菜单创建平滑的动画?

  26. 26

    如何将C .DLL文件导入C#Windows窗体应用程序并调用其在标头中定义的函数?

  27. 27

    如何返回父表单而不在C#Windows应用程序中创建父类的新实例

  28. 28

    如何部署使用SQL Server Express 2012和Crystal Report开发的C#Windows窗体应用程序

  29. 29

    如何部署使用SQL Server Express 2012和Crystal Report开发的C#Windows窗体应用程序

热门标签

归档