2013-08-30 35 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。刷新地圖可能應該更改數據,然後其他方法應該使用當前數據重新繪製地圖。

這是你如何實現這種類型的事情的一個非常粗略的想法。不要太認真。對於您當前的項目來說,這應該就夠了,我相信真實遊戲中使用的東西要複雜得多。