1

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

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

棋盘。

我有一些解决方案的可能性,但每个都有问题:

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

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

    • 这很简单,但是会不会很慢?我听说通过每个像素可能不会,但还没有在任何地方真正验证过。
  3. (我认为效果最好的那个) - 画板,但不是顶部的黑洞,而是使板在这些区域透明。

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

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

4

1 回答 1

2

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

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

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

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

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

于 2012-06-10T04:17:32.617 回答