我想以隨機方式爲對象生成一個位置,我不希望它們相互重疊。 我的屏幕寬度是4.8
米和高度是9.6
米,物體寬度是0.5
,高度是0.5
米。算法爲遊戲對象生成隨機位置
任何人都可以把我放在正確的方向,或任何建議。
問候
我想以隨機方式爲對象生成一個位置,我不希望它們相互重疊。 我的屏幕寬度是4.8
米和高度是9.6
米,物體寬度是0.5
,高度是0.5
米。算法爲遊戲對象生成隨機位置
任何人都可以把我放在正確的方向,或任何建議。
問候
如果您可以將您的「隨機」物體位置放置在一個網格上,那麼您可以將空間分成0.5米×0.5米的正方形並選擇一個正方形。你的世界是9.6米乘4.8米。因此,您有一個19 x 8的網格。
將所有網格位置放入列表中。對於要放置的每個對象,從列表中隨機選取一個網格位置並將其從列表中移除。
如果您想要避免嚴格的網格外觀,您可以稍微改變網格中心的x和y位置(在這裏和那裏添加一點點)。從邏輯上講,你仍然有一個網格,但外觀不太經常。
可能的算法:
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.
根據您對「隨機」的定義,改進#2可能會導致「聚集」對象。如果空間接近滿,改進#1也可以運行很長時間。 –
你不碰巧提及你的編程環境或語言,但假設一個函數random()
返回一個介於0.0和1.0之間的隨機值,並假設您將對象放在左上角,那麼您可以SE下面的公式:
x = random() * (screenWidth - objectWidth);
y = random() * (screenHeight - objectHeight);
我很抱歉,您的文章必須改爲相互重疊。當我最初讀它時,它讀取重疊屏幕寬度/高度。
正如Michael Goldshteyn所建議的,如果重疊發生,測試重疊並生成新的座標是一個很好的方法。
如果你只有幾個對象,你可以將它們存儲在一個列表中,併爲每個新的對象進行重疊測試。
測試重疊的一種方法可能是使用表示屏幕上每個像素的布爾數組。那麼查找會很快。
順便說一句,9.6米的屏幕不是一個非常大的屏幕?
它的平截頭體寬度和高度不是屏幕 – confucius
選項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。將該類型作爲對象的引用。 正如你放下,參考對象。 然後,您可以檢查陣列是否有碰撞。
第二個選項碰撞檢測更快,但它使用更多的內存。
使用x作爲整數將它分配一個浮點值會發生什麼傢伙? – confucius
我有過這個想法之前是最好的方式?還是有更聰明的方法?對不起我的問題,但這是我第一次開發遊戲 – confucius
@Nammari:我不知道它是否是最好的方式,但它是有效的,易於實現,並且可以快速執行。我會建議使用這種方式開始。一旦你有其他更重要的遊戲部分工作,如果這是一個問題,你可以重新訪問。 –
您可以將網格拆分爲更小的塊。檢查對象將要佔用的所有塊。如果可用,標記對象下的所有塊。如果你想用對象填充整個屏幕,這將不起作用。然後,你寧願穿過屏幕,並用隨機物體填充它。 –