C# WinForm绘图 - 如何清除并重新绘制

3
这是我的游戏截图。左边是问题,似乎“旧绘制”仍然存在。右边是应该的样子。 http://img682.imageshack.us/img682/1058/38995989.jpg 绘图代码
        Graphics g = e.Graphics;

        for (int i = 1; i < 27; i += 1)
        {
            for (int j = 0; j < 18; j += 1)
            {
                ZPoint zp = zpoints[i, j];

                if (zp != null)
                {
                    g.DrawImage(zp.sprite_index, new Point(zp.x, zp.y));

                    Image arrow;
                    if (zp.sprite_index == spr_green_zpoint)
                    {
                        arrow = spr_green_arrows[zp.image_index];
                    }
                    else if (zp.sprite_index == spr_red_zpoint)
                    {
                        arrow = spr_red_arrows[zp.image_index];
                    }
                    else
                    {
                        arrow = spr_grey_arrows[zp.image_index];
                    }

                    g.DrawImage(arrow, new Point(zp.x - 4, zp.y - 4));
                }
            }
        }

        if (latest_p1 != -1 && latest_p2 != -1)
        {
            ZPoint zp = zpoints[latest_p1, latest_p2];

            if (zp != null)
            {
                g.DrawImage(spr_focus, new Point(zp.x - 6, zp.y - 6));
            }
        }
2个回答

8

Control类中有几种处理重绘的方法:

  • Invalidate - 此方法将特定区域标记为无效,并在下一次绘制操作时重新绘制它。
  • Update - 此方法触发任何已失效区域的重绘。
  • Refresh - 此方法使控件的整个表面无效,并立即重新绘制。等同于立即连续调用Invalidate()Update()方法。

0
如果你的游戏从未将时间让给操作系统,它可能无法很好地绘制物体。这就是绘图工作所在之处。如果你在代码中插入一个Invalidate()调用和一个"Thread.Sleep(0);",并在想要刷新屏幕的位置上使用它,可能会有所帮助。

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