【问题标题】:Layering graphics with transparency具有透明度的分层图形
【发布时间】:2017-03-22 17:10:56
【问题描述】:

只是做了一个小游戏,想把我的暂停菜单放在上面。

计时器负责游戏循环。当它暂停时,它会调用一个单独的函数来绘制暂停菜单。现在我正在绘制一个小的居中矩形。然而,矩形不是透明的,即使我将其清除为透明。

有什么办法可以做到吗?

这是我的游戏循环的代码,它更新状态并根据它们进行绘制。如您所见,当游戏暂停时,它会调用一个单独的方法。

    private void tmrGameLoop_Tick(object sender, EventArgs e)
    {

        if (Paused)
        {
            Pause();
            return;
        }

        using (Graphics gr = CreateGraphics())
        {
            using (BufferedGraphicsContext bgc = new BufferedGraphicsContext())
            {
                using (BufferedGraphics bg = bgc.Allocate(gr, DisplayRectangle))
                {
                    bg.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
                    bg.Graphics.Clear(Color.Transparent);
                    // draw the stuff
                    bg.Render();
                }
            }
        }
    }

这是暂停()。它按预期绘制在顶部,但因为它是一个单独的图形对象,所以它会绘制并且不像我预期的那样透明。

    private void Pause()
    {
        using (Graphics gr = CreateGraphics())
        {
            using (BufferedGraphicsContext bgc = new BufferedGraphicsContext())
            {
                using (BufferedGraphics bg = bgc.Allocate(gr, m_menu))
                {
                    bg.Graphics.Clear(Color.Transparent);
                    // draw pause menu
                    bg.Render();
                }
            }
        }
    }

有什么办法可以做到透明吗?

【问题讨论】:

  • 显示你的代码!
  • 我添加的代码没有我实际绘制的所有部分,因为这无关紧要。我尝试过以各种方式传递图形对象,但没有成功。
  • 那么,您只是在 From 上绘图吗?没有其他控件吗?您确实知道您从不应该使用 CreateGrpahics,因为它无效,然后它绘制的图形是非持久的!?
  • 我真的不知道你在说什么。我是个菜鸟。
  • 嗯,回答我的问题将是一个好的开始 :-) - 至于其他点:只要你从 Tick 中绘制,持久性实际上可能无关紧要.. 但是没有看到绘图的代码我们如何提供帮助?至少显示 bg.Draw()。请注意 Clear(transparent) 使表单变黑,因为它试图使父级发光,但由于没有结果是黑色的..

标签: c# .net transparency gdi+ drawstring


【解决方案1】:

你似乎相信Graphics.Clear(Color.Transparent) 会创建一个透明的画布。

好吧,只有将它应用于Bitmap 时才会如此。对于controls,它让ParentBackColor 发光,对于没有ParentForms,它使Form 看起来黑色。 p>

它还重置 Graphics 对象,这也可能不是您想要的......

下面是如何在Form 上绘制半透明叠加层:

using (SolidBrush br = new SolidBrush(Color.FromArgb(192, Color.Silver)))
    g.FillRectangle(br, ClientRectangle);

StringFormat fmt = new StringFormat()
    { Alignment = StringAlignment.Center,
      LineAlignment = StringAlignment.Center };

using (SolidBrush br = new SolidBrush(Color.FromArgb(128, Color.Tomato)))
using (Font f = new Font("Consolas", 40f))
    g.DrawString("PAUSED",f, br, ClientRectangle, fmt);

结果:

使用您的数字作为叠加层的 alpha 值和(也许)文本!

通常使用的Graphics 对象应该是来自FormPaint 事件的e.Graphics

但由于您似乎是从Timer.Tick 完成所有绘图,因此您可能会使用CreateGraphics 创建它,通常不建议这样做,因为结果是非持久性。 .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    相关资源
    最近更新 更多