遊戲中的隨機地形生成演算法(二)

2021-08-09 02:53:26 字數 1963 閱讀 1443

在上篇教程中,我們已經小有成就。我們用gizmos畫出了密密麻麻的正方體來展示整個地圖。

現在想象一下,我們把每個正方體縮小為乙個點,就會出現下面的情況:

每個點有兩種狀態:0和1,分別代表道路和障礙,我們把這四個點當成乙個二進位制數字0000。

當它們全部是1的時候,也就是1111=15。如圖:

那我們可以得到的資訊就是這四個點的組合方式有16種。每一種組合對應一種網格(mesh),而網格是由三角形組成的,下面是幾個示例:

可以觀察到的是,除了四個頂點,邊的中點也用來組成網格。我們在這裡定義頂點為控制節點,邊的中點為節點。每個控制節點擁有兩個節點:上方節點和右方節點。

下面我們來定義它們的資料結構,新建乙個指令碼命名為meshgenerator:

public class node

}

public class controlnode : node

}

public class square

}

public class squaregrid

}squares=new square[nodecountx-1,nodecounty-1]; //矩形的數量總是比節點的數量少1

for (int x = 0; x < nodecountx-1;x++ )}}

}

很好,我們現在基本完成了這節內容,我們已經得到了使用squaregrid儲存的地圖資訊。

現在要做的是給meshgenerator類新增乙個欄位和乙個方法:

public squaregrid squaregrid;

public void generatemesh(int[,] map, int squaresize)

接著我們需要在mapgenerator裡呼叫這個方法,對generatemap函式作出如下改動:

void generatemap()

meshgenerator meshgen = getcomponent();

meshgen.generatemesh(map, 1);

}

嗯,你應該注意到了,我們應該把這兩個指令碼掛在同一物體上,否則是無法直接getcomponent的。

先別急著從這個關閉**介面,我們還要把ondrawgizmos函式注釋掉,然後在meshgenerator中重新定義乙個ondrawgizmos方法:

void ondrawgizmos() 

}} }

同樣的,這裡我們首先判斷每個點是否啟用,然後確定它們的顏色,再畫出它們。

我們來看看效果吧:

看不太清楚,放大看一下:

nice!!正是我們想要的效果~!

隨機系列生成演算法

給定乙個正整數n,需要輸出乙個長度為n的陣列,陣列元素是隨機數,範圍為0 n 1,且元素不能重複。比如 n 3 時,需要獲取乙個長度為3的陣列,元素範圍為0 2。首先,讓我們先構造如下函式 cpp view plain copy 隨機數生成函式,生成 a,b 之間的乙個隨機數字 其中0 aint r...

隨機數生成演算法

看到一些介紹隨機數生成演算法的文章,收集下來,有空深入了解下。c語言中偽隨機數生成演算法實際上是採用了 線性同餘法 具體的計算如下 xi xi 1 a c mod m 其中a,c,m都是常數 一般會取質數 當c 0時,叫做乘同餘法。srand 函式置的seed實際上會作為x0被代入上式中,然後每次呼...

隨機數生成演算法

這兩天沒事,就寫了寫數學課上老師說的那個 蒲豐投針實驗 的程式。接觸到了一些隨機數生成方面的東西,寫出來跟大家分享一下。對於計算機生成隨機數這個東西,以前有過一些淺顯的認識。只知道計算機不能生成真正的隨機數,只能用一定的方法來模擬隨機數,叫做偽隨機數。比如c語言裡面的rand 函式,就是乙個偽隨機數...