Tomorrow – 地形生成(1)

原理很簡單,請不要噴。


效果展示

種子輸入框 種子輸入框

種子為12345的地形 種子為12345的地形

種子為23456的地形 種子為23456的地形


代碼展示

globalvar map

random_set_seed(real(get_string("Seed: ","")))//獲取種子

for(i=0;i<=room_width/32;i+=1)
{
    for(j=0;j<=room_height/32;j+=1)
    {
        map[i,j]=0;//初始化數組
    }
}

for(i=0;i<=room_width/32;i+=1)
{
    for(j=0;j<=room_height/32;j+=1)
    {
        if(random_range(0,100)>=65) map[i,j]=1;//按概率填充房間
    }
}

for(n=1;n<=room_height/32;n+=1)
{
    for(i=0;i<=room_width/32;i+=1)
    {
        for(j=0;j<=room_height/32-1;j+=1)
        {
            if(map[i,j+1]==0&&map[i,j]==1)
            {
                map[i,j+1]=map[i,j];
                map[i,j]=0;//方塊重力處理
            }
        }
    }
}

for(i=0;i<=room_width/32;i+=1)
{
    for(j=0;j<=room_height/32;j+=1)
    {
       if(map[i,j]==1) instance_create(i*32,j*32,obj_block)//在房間中按地圖創建物體
    }
}

代碼講解

使用的坐標系

0 1 2 3 4 5 6 7 8 9 ...  
1  
2  
3  
4  
5  
6  
7  
8  
9  
...  

隨機數

random_set_seed():置隨機數種子
random_range:生產隨機數

方塊重力處理

map[i,j]==1是確保正在處理的位置有方塊
map[i,j+1]==0是確保正在處理的位置下面一格沒有方塊

如果符合條件的話

map[i,j+1]=map[i,j]//清空當前格
map[i,j]=0;//填充下面格

(即當前方塊下落)

注意一下,這裡沒有用map[i,j+1]=1,讓日後二次開發有更多方塊。

放置方塊

其實它的本質就是創建對象。

instance_create(x,y,obj)的用法自己看F1.

結語

這是我做的第一個記錄,希望我的沙盒遊戲也能堅持做下去!

說明

本文原作者Tesla,首發於Tesla-173的個人博客

Tesla本人轉載至Gamemaker開發者之家

未經授權禁止轉載。

如需轉載請聯繫[email protected]

 

PS:剛才在Gamemaker開發者之家(//gamemake.org/thread-2148.htm)發了,看到一個回帖:

摸魔抹莫  發表於 2020-04-18 07:10:21

已閱讀,樓主的代碼思路以及講解較清晰,但以下幾點希望改進: ①下述用法

real(get_string(...))
GameMaker Language

如果輸入有誤,導致輸入的字符串不能被轉換成實數,則會引發錯誤。推薦自己實現real()函數以做到可控錯誤處理。 ②二維數組map[][]中存儲的值都是邏輯值(布爾值),這種情況下用true和false來代替1和0能使代碼更具有可讀性。在判斷時也無需寫成==0或者==1,直接寫或者用邏輯取反符號!更合理。 希望樓主繼續進步!

 

我覺得還是應該解釋一下。
第一點我之後是準備自己寫編輯框,只允許檢測0-9的按鍵。
第二點是因為沙盒遊戲不僅存在有(1)和沒有(2)兩種方塊,使用1是因為現在暫時沒有更多方塊,以後會採用類似方塊id的形式存儲地圖,所以要用real型的數組。正因如此必須使用表達式來判斷。

Tags: