我沒有遊戲編程知識,也不知道如何存儲2D遊戲中的水平,如馬里奧和Sonic(等)。在二維側卷軸中表示水平的最佳方式是什麼?
如何存儲數據(地面,平臺,按鈕,升降機等)的「存儲」。
I.e.顯然馬里奧的水平不是某種從左到右移動的非常寬的圖像。
我沒有遊戲編程知識,也不知道如何存儲2D遊戲中的水平,如馬里奧和Sonic(等)。在二維側卷軸中表示水平的最佳方式是什麼?
如何存儲數據(地面,平臺,按鈕,升降機等)的「存儲」。
I.e.顯然馬里奧的水平不是某種從左到右移動的非常寬的圖像。
感謝ROM黑客場景超級馬里奧世界的文件格式(我想象大多數時代的其他流行的遊戲)是衆所周知的,基本上完全理解。還有一些文件將在痛苦的細節中描述。不幸的是,因爲這意味着要去法律不合法的網站,我無法爲您提供任何工作鏈接,但是如果您的谷歌爲.MWL文件擴展名和一個名爲Lunar Magic的編輯應用程序,它可能會指向您正確的方向。
雖然基本原理很簡單。首先,你需要你的圖形,所以你可以製作一個單一的圖像,用於定義尺寸的景觀 - 小的是更高的內存效率,更大的更給你更多的細節,所以我們說我們的是32×32像素。所以,你最終像這樣的東西(代表不同的瓷磚字符):
! " £ $ % ^& * ()
你可以製作一個標題每級的「風格」,這麼火的世界,冰雪世界,洞穴世界組等這樣可以節省裝載在你不打算使用的瓷磚中。
接下來,你需要一個級別的文件,這開始了作爲由哪個瓦片設置要加載和數字代表每個圖形,就像這樣:
fireworld.img 2 2 2 2 2 2 2 2 3 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3
合併與地形設置上面你必須(這取決於你如何編號的瓷磚)
" " " " " " " " £ £ " " " " £ £ £ £ £ £ £ £ £ £
顯然,你這時就需要層在此之上的更多信息:哪些磚是固體,這是致命的等,這可以在圖像的水平進行(3是總是堅實的),或者爲了更大的靈活性,更大的文件,在地圖層面湖位標誌會做,第一個數字是實心的,第二個是致命的:
fireworld.img 200 200 200 200 200 200 200 200 310 310 200 200 200 200 310 310 310 310 310 310 310 310 310 310
在所有這一切,你需要後綴級文件,開始和結束點(一對夫婦座標)和敵人的頂部(其中他們使用的圖形,他們使用的AI程序,他們開始的地方)。
完成這一切後,您可以查看壓縮。有很多方法可以節省空間,顯然現在和16和8位時代一樣重要,但即使如此,我們的格式也是非常浪費。
一如既往,這些只是基本原則。你的結果可能會有所不同...
這太寬泛了。
根據引擎,遊戲級別的存儲空間變化很大。
+1,從1場比賽到另一場比賽真的會有所不同。 CAn是一個對象集合,像俄羅斯方塊等遊戲的大陣列等。 – 2009-07-16 13:38:12
通常以遊戲解析的某種自定義文件格式。
XML是純文本文件的可能性。但是,嘗試從您的某款遊戲中打開關卡文件,您很可能會看到亂碼文字。您需要查找有關遊戲使用的特殊文件格式的文檔。
看看你的遊戲的modding網站,你會發現更多。
沒有真正的相關性,但你知道馬里奧的雲與灌木叢一樣的精靈,只是調色板發生了變化?記憶當時真的很貴!
真的不可能知道它們是如何存儲的,但可能使用網格對象方法,並在這裏存儲少量內存技巧。實現必然會在遊戲中大量變化,並且幾乎完全取決於開發人員 - 沒有任何標準方法。
更新:我會想象代表整個水平作爲(很寬)網格將是最好的方法。在每個網格框中,你都會放置一個具有屬性的精靈(spawn,ground,wall,chest,baddie,spike等)。然後引擎會將精靈繪製在正確的位置,但也有與之相關的屬性。如果您連續放置10個地板塊,您必須對引擎進行編碼以識別連接,以及在哪裏放置正確的尾件等等。顯然,任何不是網格的東西都是天空!
如何對這些信息進行編碼幾乎取決於您,而且由於內存不是什麼大問題,效率並不重要。只是一個objectcode的列表,x,y可能會這樣做。
不錯的一個關於馬里奧:-) – 2009-07-16 13:41:56
這是一個有趣的事實,它是驚人的,你怎麼可以玩了幾百個小時的遊戲,並沒有注意到,直到有人指出:) – Meep3D 2009-07-16 13:43:07
@大衛我會讓你在另一個祕密:馬里奧和路易吉也使用相同的精靈,只是調色板轉移。 – Christoffer 2009-07-16 13:44:17
在你提到的(大概是舊的和2D的)Mario和Sonic遊戲的情況下,可能會使用一些神祕的壓縮和優化格式來解決它們所用的遊戲機的存儲和處理限制。
對於大多數2D遊戲,我想象的級別是存儲像瓷磚的位圖。
它的工作原理是這樣的:
首先,你有一大堆的固定說的瓷磚,讓我們說16×16像素。這些瓷磚就像一塊拼圖。你可以用各種方式將它們組合在一起形成一個關卡。例如,這是一個tileset,雖然這看起來是某種自上而下的遊戲,但其原理是相同的:http://silveiraneto.net/wp-content/uploads/2009/04/free_tileset_version_9.png
一旦你的瓷磚組已知,就給每個瓷磚一個數字。如果您的圖塊少於256個,您可以將此數字存儲在一個字節中,如果您有更多的圖塊,則可以用一個字或雙字存儲。在這一點上爲這些數字添加一些語義也很有用。舉個例子,比如瓦片1-100代表了「障礙」,你無法穿過。這將在稍後派上用場。
現在是時候定義地圖。我們可以簡單地將拼圖塊放在一個大網格上!我們爲地圖定義最大尺寸。對於sidescroller,假設地圖寬度爲1000塊,高度爲50塊。你可以選擇任何你想要的。您現在可以將內存(和磁盤上)中的映射表示爲width * height
數字的bix矩陣。網格中的每個「單元格」都包含一個數字,表示應該在該位置繪製的圖塊。
繪製地圖,現在很簡單:
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
draw_tile(x * 16, y * 16, map[y][x]);
}
}
正如其他的東西。請記住,我們將瓷磚1-100定義爲障礙物?我們可以使用地圖來檢測是否有可能爲玩家移動到某一位置:
bool moveable(int x, int y) {
return map[y/16][x/16] > 100;
}
這是一個平鋪地圖的最基本的解釋。通過擴展這個簡單的概念,可以加載更多奇特的東西。這裏有一些想法:
我相當肯定,大多數2D遊戲使用的某種變型的頂部對象平鋪的遊戲地圖技術。
我已經使用Lua腳本來創建Physle games的等級。它們並不像二進制格式那樣快速,但它使得它更容易調試並與其他工具集成。加載水平通常也不是速度真正能帶來任何回報的地方。
我不知道Mario會如何存儲它的水平,我從來沒有做過,但這是我的方法。
我會創建一個簡單的文件格式,可能是基於XML。在那裏,我可能會定義遊戲區域大小以及其他元數據,如名稱和時間限制。然後,我會得到一個將出現在遊戲區域中的對象的列表,其x/y座標和對象的類型(例如,玩家開始位置,關卡退出等)。我甚至可能會有一個存儲遊戲事件發生時間的部分。
然後當遊戲引擎進入視野時,遊戲引擎必須解釋文件並在屏幕上渲染相應的項目。我想可以把數據存儲起來很簡單,它對你的處理很棘手。
希望有所幫助。
一個有點相關的我們尊敬的領導者之一的博客文章是Why are the Microsoft Office file formats so complicated? (And some workarounds)
我經常看到使用陣列,鍵入地形值/填充類型。下面是從託尼·帕 - 美好的 - 教程爲基礎的瓷磚Flash遊戲製作:
然後水平創造者通過掃描並創建文件。在Kongregate上查看允許用戶級創建的遊戲;他們存儲了一個完整的關卡,當你鏈接到遊戲時,這個關卡被作爲POST變量提交。這是一個不經常編碼的透明過程,所以很容易從中學習(並且有很多遊戲類型可以做到這一點)
所有聲稱馬里奧遊戲存儲他們的水平在某種2D陣列結構中的人是方式關閉:除了前兩個GB馬里奧遊戲(可能是第三個),超級馬里奧遊戲是對象基於。
每個級別分爲幾個屏幕,每個級別的總大小是相同的。每個屏幕都包含一個可變長度的對象列表,每個對象都有一個類型,位置和(取決於類型)其他屬性。在關卡開始時,第一或第二個屏幕將被解釋並轉換爲常規2D陣列結構,用於繪製屏幕並進行交互。當關卡滾動過去時,這張地圖在飛行中重建,丟掉超出範圍的部分。
這就是爲什麼敵人可以重生,如果你回溯,最顯着的是在SMW森林水平之一,你可以使用斗篷來回跳三個屏幕從一個毛毛蟲到另一個。順便說一句,因爲你從不碰地板,會帶來很多生命。
該系統的具體細節因課程而異。
除此之外,馬丁哈里斯是完全正確的。
存儲?就像在物理上保存在某種存儲設備上一樣? – northpole 2009-07-16 13:36:51
最好問一下,'我想創建一個2D的橫向卷軸平臺遊戲。代表關卡的最佳方式是什麼?「 – Dynite 2009-07-16 13:54:30