2013-12-18 71 views
1

我最近開始學習canvas + easeljs,目前我正在開發2D遊戲。 玩家(小紅色矩形)可以在畫布上移動,當他「走出去」(不在邊界旁邊)時,線條將被拉到身後。畫布中的兩個(任何)區域:確定哪個更大

當他來到下一個邊框時,線停止繪製自己 - 這會創建由此線分隔的兩個區域。

在這一點上,我需要弄清楚每個區域與另一個區域相比有多大。

所以我需要弄清楚的是:

  • 其面積更小/大
  • 算球(紅色的小圓圈)在各地區

所繪製的網格後面是爲了更容易理解UI背後的邏輯是什麼:零表示空格(白色矩形),二表示灰色矩形(邊框和我們的行)。

我試圖通過整個畫布上的「for循環」來計算每個區域中的零,但由於您需要在每個區域之間仔細切換,所以效果不佳。

有沒有更好的方法來解決這個問題?也許以某種方式遞歸地做呢?

The two areas I need to use

如果我不太清楚,請不要猶豫,要求更多信息。 對於壞的標題感到抱歉,我不知道如何使它更清晰。

期待任何建議,謝謝!

EDIT1:遊戲是類似這樣的:http://xonix.vamplabs.com

+0

請分享您有問題的代碼。 – K3N

+0

我並沒有遇到任何特定線路或問題 - 我只是不確定採取什麼方法。目前的代碼已超過500行,因此發佈它可能不太有用。 – trainoasis

+0

你能否更好地解釋你的遊戲?所以玩家在移動時會以某種方式創造障礙牆? – markE

回答

0

的可能,但相當無效的方法:

  • 倒置的表示更容易理解。讓灰色單元爲0,白色單元爲1.
  • 當玩家回到邊界時觸發區域標識。製作遊戲領域的臨時副本。遍歷整個字段,直到找到一個帶有1的單元格爲止。開始計算大小:(記住在複製的字段上進行所有的值更改!)

  • 在這裏,您可以嘗試一種遞歸方法。選擇「1」單元格並將1加到計數器變量中。將單元交換爲0並查看任何相鄰的單元。遞歸地爲任何值爲「1」的單元分支。

  • 現在發生的事情是,您從一個AREA開始,開始用「牆」填充AREA區域,同時記住您填充了多少個字段。由於從邊界分支出來,你應該通過向鄰居發展而打開任何包含的區域,而不會離開區域邊界。

  • 當區域「完成」(所有字段都變爲0,所有遞歸分支返回)時,您的計數器變量代表該區域的大小。您也可以檢查您的紅球,同時在前面的步驟中遍歷該區域進行計數。

  • 要轉到下一個區域,只需重新遍歷整個區域,直到您達到1,然後重複前面的步驟。

  • 當你遍歷整個領域,並沒有找到任何1,你評估所有領域和完成。

至於警告,可怕的是無效的,但現在我想不出更好的辦法,而不會在複雜的極端案例...


UPDATE的澄清,看評論這個答案僅供參考。對於一個區域的遞歸小區評估

僞代碼:

int areaSize = 0; 
//find the first starter cell to detect first area 
Cell starter = findCellWithValue1(); 
//if starter is null, no cell with value 1 has been found 
if(starter != null) { 
    //feed the starter cell into the recursive function 
    areaSize = evaluateCell(starter); 
} 

int evaluateCell(Cell selected) { 
    //counter variable to accumulate branched values 
    int counter = 1; 
    //set this cell to 0 to not hit it again when evaluating neighbours 
    selected.setValue(0); 

    //check neighbour to the left 
    Cell neighbour = getCellAt(selected.getX()-1, selected.getY()); 
    if(neighbour.getValue()==1) { 
     counter += evaluateCell(neighbour); 
    } 
    //check neighbour to the right 
    neighbour = getCellAt(selected.getX()+1, selected.getY()); 
    if(neighbour.getValue()==1) { 
     counter += evaluateCell(neighbour); 
    } 
    //check top neighbour 
    neighbour = getCellAt(selected.getX(), selected.getY()+1); 
    if(neighbour.getValue()==1) { 
     counter += evaluateCell(neighbour); 
    } 
    //check bottom neighbour 
    neighbour = getCellAt(selected.getX(), selected.getY()-1); 
    if(neighbour.getValue()==1) { 
     counter += evaluateCell(neighbour); 
    } 

    //return accumulated size 
    return counter; 
} 

這將執行相當多的最終不必要的檢查,但我不認爲他們是太貴了,除非你計劃有一個巨大的賽場。

該區域的最終大小將是areaSize變量的內容。

+0

問題是,你怎麼知道你來到第二個區域?你製作的線條可以在到達「邊框」之前去任何地方。因此,弄清楚這一點很奇怪,它並不總是一個長方形 - 即使它是,你怎麼知道你來到了2區?對不起,我在這裏有點困惑 – trainoasis

+0

1st:只要一個區域的白色區域至少在一側全部接觸,區域可以是任何形狀的算法。 第二:在評估一個時,你不會「進入」第二個區域。你的區域全部被0包圍,所以當你從1跳到1時,評估一個區域時你永遠不會越過這個周圍的邊界。當您刪除複製字段中的第一個區域時,您只能到達第二個區域,然後再次開始搜索任何其他區域。 – kasoban

+0

將嘗試實現您今天的建議,並讓您知道 - – trainoasis