使用C# / Windows Forms创建简单动画

64

我需要在C#/ Windows Forms中快速制作一个万圣节动画。 只是一些2D形状在纯色背景上移动。 由于这只是一个快速的项目,我真的不想安装和学习一个全新的工具集。(DirectX开发工具包,Silverlight,Flash等)我还必须在多台计算机上安装它,因此任何超出基本.NET框架(2.0)的东西都会很麻烦。

对于工具,我有VS2k8,25年的开发经验,一辆手推车,大屠杀斗篷,以及大约2天的时间来完成这个项目。自从使用我的Atari 130XE (hooray for page flipping and player/missile graphics!)以来,我已经没有做过动画了。

有什么建议吗?以下是我想知道的一些事情:

  • 我可以通过调整其OnPaint处理程序来绘制任何空widget(如面板),对吧? 这就是我绘制自定义小部件的方式。 是否有更好的技术比这个?
  • 是否有适用于Windows Forms的页面翻转技术? 我不需要高帧率,只需要尽可能少的闪烁/绘图。

谢谢。

事后编辑……“几天编码之后”

好了,项目完成了。下面的链接很有用,尽管其中一些链接是404。 (我希望SO允许标记多个答复为“正确”)。 我必须克服的最大问题是闪烁以及当我尝试直接在表单上绘制时出现的持久性错误。

  • 对于表单使用OnPaint事件:不好的想法。 我从来没有使其工作过; 很多神秘的错误(堆栈溢出或ArgumentNullExceptions)。 我最终使用大小填充表单的面板,这很好用。
  • 使用OnPaint方法也很慢。 在网上某个地方我读到说构建PaintEventArgs很慢,他们没有开玩笑。 当我放弃这个时,许多闪烁消失了。 跳过OnPaint / Invalidate()并自己绘制。
  • 设置表单上所有的“双缓冲区”选项仍然留下了一些需要修复的闪烁。(而且我发现有冲突的文档说“将它们设置在控件上”和“将它们设置在表单上”。 好吧,控件没有.SetStyle()方法。)我没有测试过没有它们会发生什么(this就是表单):

        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    

因此,这段代码的工作原理看起来像这样(pf是面板控件):

    void PaintPlayField()
    {
        Bitmap bufl = new Bitmap(pf.Width, pf.Height);
        using (Graphics g = Graphics.FromImage(bufl))
        {
            g.FillRectangle(Brushes.Black, new Rectangle(0, 0, pf.Width, pf.Height));
            DrawItems(g);
            DrawMoreItems(g);
            pf.CreateGraphics().DrawImageUnscaled(bufl, 0, 0);
        }
    }

我刚刚从我的计时器循环中调用了PaintPlayField函数。没有任何闪烁。


1
请查看相关问题 在 WinForms 中制作简单动画 - user18443
最好在代码中每一帧都重复使用Bitmap,只要宽度和高度不变。每一帧都重新分配它是浪费的。当完成使用时,应该将其处理掉,就像pf.CreateGraphics()返回值一样。 - Drew Noakes
你能分享一下你的代码吗?我遇到了“DrawItems不存在”的错误 :( - john k
2个回答

15

按照您所需的帧速率设置一个定时器。每次定时器触发时,根据所需的动画运动扭曲屏幕上的形状(即模型)的内部表示,然后调用Invalidate(true)。在OnPaint中只需在屏幕上绘制模型即可。

哦,对了,您可能想要开启双缓冲(这类似于自动翻页)。


7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接