2013-08-30 37 views
1

我有一个2维迷宫,我画在画布上。在迷宫中显示一个红点,以显示用户在迷宫中的位置。目前,整个迷宫都是可见的,这造成了一个问题。如何使用WPF实现“迷雾战”效果2D迷宫

我想使它使得:

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

我一直在寻找使用OpacityMask属性来实现这一点,这可能很容易实现用户当前位置的可见部分,但是如何实现让访问区域“灰色”?

+0

不同意'太广泛',这是一个简单的设计问题 - 它不是一个巨大的项目,只是一个系统的一部分,OP正在寻找实现的想法。 –

+1

传统上,这可以通过2D位图来完成,其中每一位代表1“区域或其他东西。如果您使用着色器效果,则可以这样做。 –

回答

2

您会在整个迷宫的顶部使用两个OpacityMask图层。

第一个描述了“你在哪里”,它定义了你目前可以清楚看到的内容,其他所有内容将是50%不透明或“灰色”。

第二个描述你去过的地方,透明的地方,你去过的地方,一切都是黑色的。透明的“你去过的地方”区域将允许用户看到底下的“你在哪里”图层,以显示你在哪里的灰色/透明区域,你是不是。

每层都有一定的复杂性。

  • 第一个有一个简单的形状(只是一个关于用户位置的圆圈),但需要禁止刷新基础对象;即灰色区域中的东西不应该刷新或重绘。
  • 第二个有一个微不足道的重绘(无论如何你都看不到黑色),但形状会复杂得多。它可能可能是所有“你在哪里”圈子的联盟,如果可行的话,每隔几秒抽样一次。
+0

谢谢,这正是我期望我需要做的,只是没有意识到这是被允许的,所以,第二层是我一直在努力的。 –

4

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

因此,首先每个单元应该是一个对象。它需要一些属性,如;

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。刷新地图可能应该更改数据,然后其他方法应该使用当前数据重新绘制地图。

这是你如何实现这种类型的事情的一个非常粗略的想法。不要太认真。对于您当前的项目来说,这应该就够了,我相信真实游戏中使用的东西要复杂得多。