2012-02-02 108 views
1

如何製作具有固定尺寸的2D世界,當它到達地圖的任何一側時會重複其自身?重複2D世界

當您到達地圖的一側時,您會看到與此地圖合併在一起的地圖的另一側。這個想法是,如果你沒有小地圖,你甚至不會注意到地圖重複自身的轉變。

我有一些想法如何使它: 1)保持總是像這樣的3x3世界這些完全相同和更新相同的方式,只有球員存在於其中的一個。 2)另一種方法是將地圖分成較小的和平面,並在被問到時將它們添加到需要的地方。無論哪種方式,完成它可能很複雜。我記得更多的是在10年前我玩過一些類似的遊戲,士兵們在跟着對方重複拍攝其他人工智能士兵。 大部分人都聽到你對這個想法的想法以及如何實現。我在XNA(C#)中編碼。

+0

您是否必須連續滾動顯示地圖?或者屏幕在轉換點切換?地圖是一個屏幕寬或者一次只顯示一部分地圖?或者'與這個合併。'是否意味着一旦達到邊緣就想縮小並顯示更多? – zeller 2012-02-02 12:19:35

+0

井地圖不是靠自己滾動的。玩家只是自由奔跑,如果他靠近地圖的一側,他可以看到對面的開始。相機固定在玩家位置,但地圖比相機屏幕大。我不知道地圖是否應該切換到地圖或相機的邊界,以及這些東西應該如何工作。無論如何,當邊緣到達時,我希望能夠看到對面,並且也可以跨越。 這裏是可能有助於理解這個想法的圖像: http://img846.imageshack.us/img846/6190/fullyt.jpg – Sunder 2012-02-02 12:37:24

+0

所以相機跟隨玩家,他總是在中心?遊戲是基於平鋪的? – zeller 2012-02-02 12:48:05

回答

0

如果遊戲基於圖塊,我認爲你應該做的是:

  • 只保留一個陣列的遊戲區。
  • 使用遊戲區域大小mod w和h的模運算確定可見區域,其中這些是表格的寬度和高度。
    例如如果表格是80x100(0,0)左上角座標,寬度爲80,高度爲100,並且視口矩形爲(70,90),寬度爲40,高度爲20,則使用[70- 79] [0-29]爲y座標,[90-99] [0-9]爲y。這可以通過使用以下公式計算索引來實現:
    idx = (n+i)%80(或%100)其中n是矩形的頂部座標(x或y),而i位於視口的寬度/高度範圍內。
  • 這假定一個移動步驟移動相機與非小數座標。

因此,這是您的第二個選擇,以更詳細的方式。如果你只想重複地形,你應該分開瓦片的內容。在這種情況下,由於您不存儲內容,所以內容很可能會即時生成。

希望這對我有所幫助。

+0

有點像「80w和100h」 而不是「[70-79] [0-30]」不應該是「[70-99] [0-9]」這樣的數字? 總而言之,你基本上建議只有一張地圖,如果視口跨越地圖的邊緣,然後從這張地圖上繪製出實際不在那裏的圖塊,但是從數組[tile-map size]中取出它們,其中'瓦片'是預期的平鋪像101那樣的位置或類似於實際陣列之外的東西。 – Sunder 2012-02-02 15:48:59

+0

這些只是縮寫(寬度爲80),更新了答案。無論如何,是的,這就是模數。 (我也搞砸了數字,現在他們是正確的) – zeller 2012-02-02 15:52:13

+0

好的,謝謝,現在非常清楚。另一個麻煩的事情可能是當地圖的一邊要與其他地方互動時,例如像射擊和單位跟隨,但可能很可能只會下注大量的代碼和ifs。 K TNX BYE – Sunder 2012-02-02 16:04:06

1

另一種選擇是使用libnoise庫產生噪聲。這樣的美妙之處在於,你可以在理論無限的空間上產生噪音。

看看以下內容: http://libnoise.sourceforge.net/tutorials/tutorial3.html#tile

還有上述在XNA端口:http://bigblackblock.com/tools/libnoisexna

如果你最終使用XNA端口,你可以做這樣的事情:

Perlin perlin = new Perlin(); 
perlin.Frequency = 0.5f;    //height 
perlin.Lacunarity = 2f;     //frequency increase between octaves 
perlin.OctaveCount = 5;     //Number of passes 
perlin.Persistence = 0.45f;    // 
perlin.Quality = QualityMode.High; 
perlin.Seed = 8; 

//Create our 2d map 
Noise2D _map = new Noise2D(CHUNKSIZE_WIDTH, CHUNKSIZE_HEIGHT, perlin); 

//Get a section 
_map.GeneratePlanar(left, right, top, down); 

GeneratePlanar是調用以獲取各個方向上的部分的函數,它們將與您的世界的其他部分無縫連接。

+0

我從來沒有用過這些東西。聽起來很複雜。 關於我最初的想法,我有點想辦法很容易。 到目前爲止的Youtube鏈接:http://youtu.be/2-bT3KtW5ko – Sunder 2012-02-04 05:25:37

+0

@Sunder這是一個比我提出的模更好的解決方案,所以你應該嘗試一下。更大的項目可擴展性。 – zeller 2012-02-07 08:52:36