2013-11-20 63 views
0

我想在game maker 8.0裏做一個洞穴探險家遊戲。 我做了一個塊對象和一個生成器但我卡住了。這裏是我的發電機遊戲製作者隨機洞穴世代

var r; 
r = random_range(0, 1); 
repeat(room_width/16) { 
    repeat(room_height/16) { 
     if (r == 1) { 
      instance_create(x, y, obj_block) 
     } 
     y += 16; 
    } 
    x += 16; 
} 

代碼現在我總是得到一個空白幀

回答

0

看起來你只是創建當r == 1一個實例。你不應該每次都創建一個實例嗎?

+0

我想製作一個洞穴遊戲,以**自上而下**洞穴genaration。 – user2942734

0
  1. 變量賦值r = random_range(0, 1);在循環之外。因此在開始循環之前僅執行一次。

  2. random_range(0, 1)返回0到1之間的一個隨機實數(不是整數!)。但你有if (r == 1) - 獲得1的概率是非常小的。

爲例:

repeat(room_width/16) { 
    repeat(room_height/16) { 
     if (irandom(1)) { 
      instance_create(x, y, obj_block) 
     } 
     y += 16; 
    } 
    x += 16; 
} 
1

您需要使用irandom(1)所以你得到一個整數。你也應該把它放在循環中,這樣每次都會產生一個新的值。

1

在第二個語句中,您將生成一個隨機值real值並將其存儲在r中。你實際需要的是選擇這兩個值之一。我建議你爲此使用功能choose(...)。這裏去正確的說法:

r = choose(0,1); //Choose either 0 or 1 and store it in r 

此外,將上述語句移動到內部循環。 (因爲你要決定是否要在每點的說(X,Y)的位置來放置塊吧?)

另外,我建議你替換sprite_widthsprite_height,而不是使用值16,所以你對精靈的任何改變都會相應地調整塊的結果佈局。

這裏是更正代碼:

var r; 
repeat(room_width/sprite_width) { 
    repeat(room_height/sprite_height) { 
     r = choose(0, 1); 
     if (r == 1) 
      instance_create(x, y, obj_block); 
     y += sprite_height; 
    } 
    x += sprite_width; 
} 

這應該工作。我希望這有助於!

0

這裏有一個可能,甚至更好的解決方案:

length = room_width/16; 
height = room_height/16; 

for(xx = 0; xx < length; xx+=1) 
{ 
    for(yy = 0; yy < height; yy+=1) 
    { 
    if choose(0, 1) = 1 { 
    instance_create(xx*16, yy*16, obj_block); } 
    } 
} 

如果你想隨機洞穴,你或許應該刪除這些塊, 不只是單一的人的隨機部分。

0

對於獎勵積分,您可以使用隨機洞穴世代的種子值。你也可以有一個通路隨機生成,它將有一個保證路徑到終點,隨機開口和從該路徑隨機生成的假路徑。然後你可以用其他隨機件填寫額外的空格。

但是至於你的代碼,你必須在每次放置一個塊時重新定義隨機數,這就是爲什麼它們都是相同的。它應該在循環內部調用,並且應該是一個整數而不是十進制值。