2015-11-20 24 views
0

我試圖做一個遊戲,玩家只可以向前走在無邊的地圖和路徑(其中像點只是事情,路徑是唯一的視覺)的程序產生的。我希望這些路徑具有不同的長度(something like the tree of life,但僅生成所選路徑的分支)。如何隨機放置物體作爲玩家在無限地圖中移動而不重疊?


我這是怎麼產生的分支無重疊:

List<Vector3> everyPos; //predetermined position 

public void Spawn(int amount) 
{ 
    List<Vector3> possiblePos = new List<Vector3>(everyPos); 

    for (int i = 0; i < amount; i++) 
    { 
     int index = Random(0, possiblePos.Count);   //Find a random position 
     SpawnObjectAt(currentPosition+possiblePos[index]));//Create a point there 
     possiblePos.RemoveAt(index);      //Remove that position from the list 
    } 
} 

的問題是,look at this image(I can't embed image yet)

紅色是這裏的球員開始,綠色是在第一個可能的產卵位置移動。

如果有在1和2催生了2點,玩家選擇point1,然後在第二次可能的位置將在黑色區域,其中包括點2點,所以如果我堅持下去就會有最終重疊。


我該如何避免這種情況?我正在製作手機遊戲,所以我不想緩存每一個點。任何幫助將非常感激!謝謝!

這是一個小型的網頁遊戲有幾分相似機械師什麼,我試圖實現:newgrounds.com/portal/view/592325/

+0

您使用哪種語言?你能否包括一些代碼或一些圖像來解釋你的意思? – bigcodeszzer

+0

我使用C#,但任何語言都很好,實際上我不需要任何代碼,只是一個方向。關於圖片我在上面添加了一張圖片,並且一個簡單的遊戲只需要一分鐘就可以嘗試 – leloctai

+0

我玩過這個遊戲,但是我沒有看到您的路徑重疊是什麼意思,但是如果您想生成一個路徑'像',它不應該太難。 – bigcodeszzer

回答

0

這是這裏試圖回答,但說​​實話,你需要提供更多信息。

取決於你正在寫的語言,你可以不同的方式處理這個。你可能需要動態分配,但現在讓我們假設,因爲你的想法很小,你可以在編譯前做一個預定義的大數組。

我假設你知道如何使一個數組,所以創建一個與比方說,500的長度開始。如果你想像他們在那個遊戲中那樣「產生」一個鏈接,你只需要一個隨機函數(幾乎每種語言都有一個內置的庫),你需要做一些小算術。

無論您使用的語言必將有一個內置的圖形庫,或者你可以用一個流行的易於使用的一個。我只是畫一幅圖來說明這一點。

enter image description here

有許多的方法可以做到這一點數學上顯示的圖像,使用角度例如,最簡單的方法,但是,僅僅是跟隨框。

如果您有顯卡工作過,你知道一個載體是什麼,如果不是,你需要學習。在這個圖像(0,1)(1,0)(1,1)等中呈現的9個向量可以創建爲矢量對象,甚至可以作爲單獨的整數存儲。

爲了使您的節點「移動」到另一路徑中,你可以簡單地做一個蘭特1-9,然後將相關結果的9個可能的載體之一,然後將它們添加到您的位置矢量。在數組中執行此操作最簡單,只需使用rand int作爲索引即可。在衍生語言中最多的,你是這樣做的:

positionVector += changeVectorArray[rand(1,9)]; 

然後,通過在9個載體之一增加你的位置矢量如上圖所示。

製作'路徑'的最簡單方法是在添加變化矢量之前複製位置,然後將所有變化順序存儲在另一個「路徑」數組中。

要在屏幕上顯示路徑,只需在路徑數組的第一,第二和第三,第三和第四個元素之間劃一條線即可。如果我沒有弄錯,這個公式(連接線)就是離散數學,如果你願意,你可以做更復雜的路徑形狀,但你得到的要點。

這應該至少讓你開始。沒有更多的信息,我無法真正幫助你。

我可以通過切線描述一系列不同的方式,您可以使這種情況發生不同,但如果您只是詢問具體情況,它可能會更容易。

enter image description here

編輯>>>

繼續這樣的回答,是的,它現在看,節點絕對可以重疊。當然

boolean copy = true; 
for(int i = 0; i < getLength(pathArray); i++){ 

    if(newVector == pathArray[i]){ 
     copy=false; 
    } 
} 

然後,如果副本:要解決這個問題,你可以使用碰撞檢測,每次生成一個新的「位置」,這樣將它和繪畫,你必須環行通過您的陣列之前,仍然是真的,複製pathArray中的新位置。注意:整個解決方案都是sl,不馴的,隨着數組變大,您的程序將花費越來越多的時間來搜索該循環。這可能也不能保證路徑朝一個方向,但很可能。並且請注意,即使位置向量不能位於另一個之上,這些行仍然可以相互重疊。

所有這些考慮,我認爲它會工作,優化取決於你。我會建議使用離散公式可能有更高效的解決方案。你也可以使用這樣的公式來使路徑沿特定的方向行進,並做其他更復雜的事情。

如果您想讓路徑沿特定方向行進,您也可以很容易地在您的隨機捲上應用約束。但是有很多這樣做的方式我不能解釋。你可以谷歌路徑尋找算法。

祝你好運。

+0

感謝您的回答,我更新了我的問題。 關於碰撞檢測,我不認爲這是一個好主意,它像蠻力破解密碼。我相信這樣做一定有更好的方法。 – leloctai

+0

沒問題。點擊綠色檢查即可接受答案。 – bigcodeszzer

+0

解決重疊問題的一個簡單方法是將隨機滾動限制爲(+1,0)(0,+ 1)或(+1,+1) - 這意味着它只能向右,向上或直立。使用這些約束,不應該有任何重疊。 – bigcodeszzer

相關問題