【问题标题】:Issue animating sprites C#发出动画精灵 C#
【发布时间】:2012-12-04 08:15:42
【问题描述】:

我正在Form_Paint() 事件中使用e.Graphics.DrawImage 绘制图像。我使用Timer 刷新表单。问题是动画闪烁。似乎更新e 的时间太长了。我在表单中有 2 个PictureBox。

想法?

更新:

    public Bitmap Paint(int state, Graphics g)
    {
        this.state = state;

        Bitmap temp;
        Graphics tempGraphics;
        temp = new Bitmap(45, 47, g);
        tempGraphics = Graphics.FromImage(temp);

        switch (state)
        {
            case 0:
                tempGraphics.DrawImageUnscaled(img, x, y);
                break;

            case 1:
                tempGraphics.DrawImageUnscaled(img, x, y - 42);
                break;
        }
    }

这会在将精灵添加到表单之前准备好精灵。

【问题讨论】:

    标签: c# animation sprite


    【解决方案1】:

    通常的管理方式是将更新绘制到内存位图。然后将位图绘制到屏幕上。过程较慢(因为还有更多工作要做),但看起来更快,因为没有闪烁。

    但是,许多控件实际上会自动为您执行此操作。查看double buffering techniques。

    【讨论】:

    • 我已经在使用 .doublebuffering = true。可能是 GUI 线程忙于处理图片框?
    • 我不知道。我不知道你的代码是做什么的。您还可以在最终绘画之前检查您的背景是否被清除为不同的颜色。无论哪种方式,我已经以许多不同的方式和许多不同的语言完成了双缓冲,我可以向你保证,如果做得好,就不会有闪烁。您是否已经阅读了我引用的文章?
    【解决方案2】:

    在大多数情况下,它是由未正确设置样式引起的,因此首先绘制背景(通常是白色),然后再绘制图像。

    如果简单地绘制缓冲区不够快,还可以搜索/读取双缓冲。

    【讨论】:

      【解决方案3】:

      我通过避免在表单本身上做任何动画来解决这个问题。如果您将控件添加到表单,然后为父级设置动画,则您过度执行 UI 线程。最好的解决方案是将所有动画保存在图片框中。

      所以:您要么直接使用g.DrawImage() 制作动画,要么坚持使用PictureBox。

      【讨论】:

        猜你喜欢
        • 2011-12-01
        • 1970-01-01
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多