c# - 如何使用 WPF 为 2D 迷宫实现 "fog of war"效果

标签 c# wpf

我在 Canvas 上绘制了一个二维迷宫。迷宫上会显示一个红点,以向用户显示他们在迷宫中导航时的位置。目前整个迷宫是可见的,这会带来问题。

我想这样做:

  1. 只有用户所在的迷宫的一部分可以清晰可见,
  2. 用户访问过的迷宫的先前部分是可见的,但“变灰”了。
  3. 还有其他实体在迷宫中漫游,它们应该只在迷宫中完全可见的部分可见,换句话说,在用户当前位置的几个单元格内;尽管访问过的走廊仍然部分可见,但在迷宫的这些部分漫游的任何实体都是不可见的。

我一直在研究为此使用 OpacityMask 属性,这对于用户当前位置的可见部分可能很容易实现,但是我如何实现让访问区域“变灰”?

最佳答案

你的问题太笼统了,但我会尽力让你朝着正确的方向前进。

所以,首先每个单元格应该是一个对象。它需要一些属性,例如;

    int x // x coordinate
    int y // y coordinate
    bool isVisible // marks if the cell is currently in full view
    bool beenSeen // marks if the user has been here

每次用户移动时,您都应该调用一些方法,例如 RefreshMap(Cell Current);

在此方法中,您应该找到所有边界单元格(使用 x 和 y 值)并将它们标记为可见。您还应该将当前单元格标记为 beenSeen。刷新 map 可能会更改数据,然后一些其他方法应该使用当前数据重新渲染 map 。

这是关于如何实现此类事物的一个非常粗略的想法。不要太认真。它应该足以满足您当前的项目,我相信真正的游戏中使用的要复杂得多。

关于c# - 如何使用 WPF 为 2D 迷宫实现 "fog of war"效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18539376/

相关文章:

WPF Dockpanel 第一个子项使用剩余空间

c# - 专业的 C#/.Net/WPF 开发人员应该知道什么?

c# - 需要一种动态生成 XML 的方法

c# - 使用 ClickOnce 应用程序创建启动文件夹快捷方式?

wpf - Control.Focus() 和 FocusManager.SetFocusedElement() 的区别

c# - 在 Telerik RadGridView 中传递 DataContext

c# - 使用 FormatConvertedBitmap 将位图转换为 Gray8 仅使用 4 位?

c# - 如何从 C# 中的文本框定义计时器间隔

c# - 如何在 C# 中实现 YouTrack REST API

c# - 如何获取 Roslyn 中 NamedTypeSymbol 的所有适用方法,包括扩展方法?