使已经绘制的内容透明?

Posted

技术标签:

【中文标题】使已经绘制的内容透明?【英文标题】:Make what's already been drawn transparent? 【发布时间】:2012-06-09 19:56:49 【问题描述】:

我正在完成 Connect 4 游戏的最后一个。我想让图块实际下拉而不是只出现在插槽中,但是存在 z 排序问题。

为了绘制我的场景,我首先为板画了一个矩形,然后用背景颜色在上面画出一些洞。问题是瓷砖没有空间。我试过先画瓷砖。它掉下来了,但是你在洞后面看不到它,因为它们是在我的瓷砖上用纯黑色画在纯黄色上的。我不能在黑色之后画它,但也不能在黄色之前画,因为黄色是先画的。这是一张漂亮的照片:

我有几种可能的解决方案,但每个都有问题:

    使用已切出孔的电路板位图。

    我可以绘制瓷砖,然后用透明度键绘制形状奇特的框架。 StretchBlt 或类似的东西实际上会拉伸电路板以在不同的分辨率下看起来相同,包括不同的纵横比(我的意思是水平和垂直缩放以使每次都具有相同的比例)?参考图片,无论分辨率如何,它都适合这样的窗口。

    逐个像素检查要绘制的内容。

    很简单,但是会不会很慢?我听说可能不会遍历每个像素,但还没有在任何地方真正验证过。

    (我认为效果最好的那个)- 画板,但不是顶部的黑洞,而是让板在这些区域透明。

    这是最少的工作量,而且在效率方面应该没问题,但我该怎么做呢?

这些解决方案(尤其是第三种)是否合理?有没有一种简单的方法可以解决这个 z 顺序问题?

【问题讨论】:

哦,出于某种原因,我将其视为 OpenGL 问题。那没关系。 @Pubby,我明白了。我在 Direct3D 中使用过它们,所以我知道你来自哪里。 我认为实现方法 #2 的快速方法是提供单色蒙版位图来指定源位图中的哪些像素实际上应该复制到目标位图中。 (见msdn.microsoft.com/en-us/library/windows/desktop/…) @JeremyFriesner,我一定会记住这一点的。 顺便说一句,该图像令人眼花缭乱(传统瓷砖颜色不也是红色和黑色吗?)。我不知道是配色方案(尝试灰色或灰蓝色背景,或者可能使黄色变暗)还是实际图案(尝试添加装饰或调整间距)有问题。 【参考方案1】:

似乎最“正确”的方法(不一定是最好的方法)是填充一个带有孔的矩形形状,而不是稍后添加孔。

如果您使用 GDI 或 GDI+,您可以通过创建一个包含矩形和其中所有圆圈的路径,然后填充该路径来完成此操作。

要在 gdi32 中执行此操作,请调用 BeginPath,使用 Rectangle 和 Ellipse 函数将形状添加到路径中,然后调用 EndPath 来完成它。使用 SetPolyFillMode 将 HDC 设置为 ALTERNATE 模式。在 HDC 中选择合适的画笔,然后调用 FillPath。

在 GDI+ 中,以交替模式构建路径,使用 GraphicsPath::AddRectangle 和 GraphicsPath::AddEllipse 添加形状,并使用 Graphics::FillPath 填充。

(您可以使用缠绕模式而不是交替模式来执行此操作,但是您必须小心在路径中形成形状的线条是顺时针还是逆时针。)

【讨论】:

嗯,我花了一些时间,但我终于有时间尝试了,而且效果很好。非常感谢!

以上是关于使已经绘制的内容透明?的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX WebView:透明WebView保持绘制旧内容

如何使DIV背景透明内容不透明

如何使我的网站背景透明而不使内容(图像和文本)也透明?

OpenGL 使纹理透明 VBO

在 UIImageView 上绘制使图像透明

使richtextbox透明后,但也显示不出字了内容也成透明的了,怎么办