2011-11-02 29 views
3

我想以隨機方式爲對象生成一個位置,我不希望它們相互重疊。 我的屏幕寬度是4.8米和高度是9.6米,物體寬度是0.5,高度是0.5米。算法爲遊戲對象生成隨機位置

任何人都可以把我放在正確的方向,或任何建議。

問候

回答

2

如果您可以將您的「隨機」物體位置放置在一個網格上,那麼您可以將空間分成0.5米×0.5米的正方形並選擇一個正方形。你的世界是9.6米乘4.8米。因此,您有一個19 x 8的網格。

將所有網格位置放入列表中。對於要放置的每個對象,從列表中隨機選取一個網格位置並將其從列表中移除。

如果您想要避免嚴格的網格外觀,您可以稍微改變網格中心的x和y位置(在這裏和那裏添加一點點)。從邏輯上講,你仍然有一個網格,但外觀不太經常。

+0

我有過這個想法之前是最好的方式?還是有更聰明的方法?對不起我的問題,但這是我第一次開發遊戲 – confucius

+0

@Nammari:我不知道它是否是最好的方式,但它是有效的,易於實現,並且可以快速執行。我會建議使用這種方式開始。一旦你有其他更重要的遊戲部分工作,如果這是一個問題,你可以重新訪問。 –

+0

您可以將網格拆分爲更小的塊。檢查對象將要佔用的所有塊。如果可用,標記對象下的所有塊。如果你想用對象填充整個屏幕,這將不起作用。然後,你寧願穿過屏幕,並用隨機物體填充它。 –

4

可能的算法:

1. Choose random coordinates for all objects. 
2. Test for overlap. If it occurs, repeat step 1. 

可能的改進:

1. Reposition overlapping objects with new random coordinates until there is no 
    overlap. 
2. Shift any overlapping objects to make them not overlap. Do this intelligently 
    to avoid bunching, if necessary. 
+1

根據您對「隨機」的定義,改進#2可能會導致「聚集」對象。如果空間接近滿,改進#1也可以運行很長時間。 –

0

你不碰巧提及你的編程環境或語言,但假設一個函數random()返回一個介於0.0和1.0之間的隨機值,並假設您將對象放在左上角,那麼您可以SE下面的公式:

x = random() * (screenWidth - objectWidth); 
y = random() * (screenHeight - objectHeight); 

我很抱歉,您的文章必須改爲相互重疊。當我最初讀它時,它讀取重疊屏幕寬度/高度。

0

正如Michael Goldshteyn所建議的,如果重疊發生,測試重疊並生成新的座標是一個很好的方法。

如果你只有幾個對象,你可以將它們存儲在一個列表中,併爲每個新的對象進行重疊測試。

測試重疊的一種方法可能是使用表示屏幕上每個像素的布爾數組。那麼查找會很快。

順便說一句,9.6米的屏幕不是一個非常大的屏幕?

+0

它的平截頭體寬度和高度不是屏幕 – confucius

0

選項1:

bool found = false; 
real x; 
real y; 
do 
{ 
    x = random * (4.8 - 0.5); // Rather make it variables 
    y = random * (9.6 - 0.5); 

    found = false; 
    foreach (obj in objs) 
    { 
     if (x > obj.x && x < x+0.5 && y > obj.y && obj.y < y+0.5) 
     { 
      found = true; 
      break; 
     } 
    } 
} 
while (found == true) 

選項2: 創建的,一個二維數組代表sceen。將該類型作爲對象的引用。 正如你放下,參考對象。 然後,您可以檢查陣列是否有碰撞。

第二個選項碰撞檢測更快,但它使用更多的內存。

+0

使用x作爲整數將它分配一個浮點值會發生什麼傢伙? – confucius