C# 如何使用WPF为2D迷宫实现“战争迷雾”效果
我在画布上画了一个二维迷宫。迷宫上会显示一个红点,向用户显示他们在迷宫中的位置。目前,整个迷宫可见,这带来了一个问题 我希望这样做: 只有迷宫中用户所在的部分才能清晰可见, 用户访问的迷宫的前面部分可见,但变灰。 还有其他实体在迷宫中漫游,它们应该仅在迷宫中完全可见的部分内可见,换句话说,从用户当前位置的几个单元格内可见;尽管参观过的走廊仍然部分可见,但在迷宫的这些部分漫游的任何实体都不可见。C# 如何使用WPF为2D迷宫实现“战争迷雾”效果,c#,wpf,C#,Wpf,我在画布上画了一个二维迷宫。迷宫上会显示一个红点,向用户显示他们在迷宫中的位置。目前,整个迷宫可见,这带来了一个问题 我希望这样做: 只有迷宫中用户所在的部分才能清晰可见, 用户访问的迷宫的前面部分可见,但变灰。 还有其他实体在迷宫中漫游,它们应该仅在迷宫中完全可见的部分内可见,换句话说,从用户当前位置的几个单元格内可见;尽管参观过的走廊仍然部分可见,但在迷宫的这些部分漫游的任何实体都不可见。 我一直在研究如何使用OpacityMask属性,这对于用户当前位置的可见部分可能很容易实现,但如何实现
我一直在研究如何使用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
每次用户移动时,您应该调用一些方法,如RefreshMapCell Current
在此方法中,您应该使用x、y和y值查找所有边界单元,并将它们标记为可见。还应将当前单元格标记为BeenSen。刷新贴图可能会更改数据,然后其他方法会使用当前数据重新渲染贴图
这是一个关于如何实现这类事情的非常粗略的想法。不要太认真。它应该足以满足您当前的项目,我相信在真实游戏中使用的东西要复杂得多。您的问题太笼统了,但我会尽力让您朝着正确的方向前进 因此,首先,每个单元都应该是一个对象。它需要一些属性,比如
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
每次用户移动时,您应该调用一些方法,如RefreshMapCell Current
在此方法中,您应该使用x、y和y值查找所有边界单元,并将它们标记为可见。还应将当前单元格标记为BeenSen。刷新贴图可能会更改数据,然后其他方法会使用当前数据重新渲染贴图
这是一个关于如何实现这类事情的非常粗略的想法。不要太认真。它应该足以满足您当前的项目,我相信在真正的游戏中使用的东西要复杂得多。您可以在整个迷宫的顶部使用两个不透明的遮罩层
第一个描述了你在哪里,它定义了你目前可以清楚地看到的东西,其他所有东西都将是50%不透明或“灰色”
第二个描述你去过的地方,你去过的地方是透明的,其他一切都是黑色的。透明的“你去过的地方”区域将允许用户看到“你在哪里”层的下方,以显示“你在哪里”和“你不在哪里”的灰色/透明区域
每一层都有一些复杂性
第一个有一个简单的形状,只是一个围绕用户位置的圆圈,但需要禁止刷新底层对象;i、 e.灰色区域中的某些内容不应刷新或重新绘制。
第二个有一个小的重画,你无论如何都看不到在黑色下,但形状会复杂得多。如果可行的话,它可能是所有你们所在的圆的联合,每隔几秒钟采样一次。
你可以在整个迷宫的顶部使用两层不透明的面具
第一个描述了你在哪里,它定义了你目前可以清楚地看到的东西,其他所有东西都将是50%不透明或“灰色”
第二个描述你去过的地方,你去过的地方是透明的,其他一切都是黑色的。透明的“你去过的地方”区域将允许用户看到“你在哪里”层的下方,以显示“你在哪里”和“你不在哪里”的灰色/透明区域
每一层都有一些复杂性
第一个有一个简单的形状,只是一个围绕用户位置的圆圈,但需要禁止刷新底层对象;i、 e.灰色区域中的某些内容不应刷新或重新绘制。
第二个有一个小的重画,你无论如何都看不到在黑色下,但形状会复杂得多。如果可行的话,它可能是所有你们所在的圆的联合,每隔几秒钟采样一次。
不同意“过于宽泛”,这是一个简单的设计问题-它不是一个庞大的项目,只是一个系统的一部分,OP正在寻找实现想法。传统上,这将通过2D位图来完成,其中每个位代表一个1区域或某物。如果你使用着色器效果,你也许可以做到这一点。不同意“太宽”,这是一个简单的设计问题-它不是一个大型项目,只是一个系统的一部分,OP正在寻找实现想法。Tradit
通常情况下,这将通过2D位图实现,其中每个位表示一个1区域或某个区域。如果你使用的是着色器效果,你可能可以这样做。谢谢,这正是我预期我需要做的,只是我不知道这是允许的。所以,第二层是我一直在努力解决的问题。谢谢,这正是我期望我需要做的,只是我不知道这是允许的。所以,第二层是我一直在努力解决的问题。