2010-09-27 127 views
6

我正在使用canvas在JavaScript中創建一個平臺遊戲,它完全基於圖塊。什麼是在遊戲中存儲物品塊的最佳方法(牆壁,地板,物品)?事情是每個瓷磚可以被破壞或創建。遊戲中關卡的數據結構

目前我有一個二維陣列,所以我能夠快速檢查一個項目是否在特定的X & Y位置。這個問題是當用戶移動和地圖需要滾動時,我需要重新分配每個塊。當物品在x = 0時會發生什麼?我不能使用負向索引。

我寧願將滾動的模擬器一次放置在一個貼圖上。此外,我計劃隨着用戶的移動而隨機生成地圖,以及是否以前沒有生成地圖。所以一旦產生了,它應該永遠保持這種方式。

另一點我應該提及的是,它也將是多人遊戲。因此,在緩存的數據變髒並需要從數據庫獲取最新數據之前,分屏是一個好主意。嘎,我對這一切都很新穎;似乎不可能,任何幫助,不勝感激。

+0

您的平臺在X軸上無限寬嗎?爲什麼你有x = 0的問題?在這種情況下你應該阻止左側滾動嗎? – 2010-09-27 05:42:51

+1

退房http://www.youtube.com/watch?v=_RRnyChxijA – Sharun 2010-09-27 05:46:11

+0

這是無限的。用戶應該能夠使用相同的圖塊向左返回。 – Louis 2010-09-27 05:49:19

回答

4

既然你有無限的水平,我會建議一個類似於你已有的結構,稍作調整。

而不是將所有內容都存儲在一個大數組中,並且每當用戶移動(ouch)時移動該數組中的東西(而不是存儲9塊地圖(每個地圖的大小約爲屏幕大小的兩倍) ,當用戶接近當前塊的邊緣時,處理離屏的塊,將所有塊移動到左側,並將新塊加載到間隙中。

希望這是明確的,但爲了以防萬一,這裏有一個圖:

Chunking

的字母方塊是地圖的塊,並且紅色方塊是視(我畫它稍微有點大,請記住視口小於黑色方塊)。隨着視口向右移動,您將卸載塊B和C,將所有其他塊移動到左側,並將新數據加載到最右側。由於塊的大小是屏幕寬度的兩倍,因此用戶需要花費時間穿過屏幕來生成/加載這些塊。如果用戶在世界各地快速移動,則可以使用4x4的塊來進行額外的緩衝。

解決返回到以前的地圖塊。有一對夫婦的方式做到這一點:

  • 寫出來的塊狀物時,他們不再使用(或其他等值是在JavaScript)
  • 擴大你的大塊在無限設置硬盤記憶。而不是一個塊的數組有一個混合數組,它採用塊的x/y位置,並返回塊(或null,這表示用戶以前從未來過,並且需要生成它)。
  • 程序上生成你的水平,這是複雜的,但意味着一旦塊熄滅屏幕,你可以只處理它,有信心,你可以重新準確地再次同一塊後
1

顯然有很多方法可以做到這一點。

如果它們的級別不是太大,你可以保留你的原始設計的二維數組,並使用一個變量來存儲當前的x/y滾動位置。這意味着您將所有地圖信息始終存儲在內存中,並且只能訪問需要在屏幕上顯示的部分。

繪畫時,您可以計算當前滾動位置x/y處顯示哪個圖塊,當前屏幕寬度下屏幕上將顯示多少個圖塊,並僅繪製您需要的圖塊。

如果你一次滾動整個瓷磚,那麼它很容易。如果它更類似於模擬滾動,則需要對開始繪製的圖塊中的哪個位置進行更精細的紋理控制,或者可以將整個圖塊集合繪製到內存位圖中,然後使用負值將其繪製到繪圖畫布上抵消。

1

我一旦確定這事在XML和JSON ...我認爲JSON序列化將更快,更高效(更不用說容易)在JavaScript中工作,尤其是JSON可以很好地適應可變長度列表,因爲您需要「N」級別在每場比賽中。

使用標準格式還可以使其更加可重用,並且(理想情況下)鼓勵更多協作(如果這就是您要找的)。您可以查看我的第一次嘗試創建Video Game schema for level structure

正如fileoffset所說,有很多方法可以做到這一點,但我強烈建議將您的關卡數據(即概念)與渲染分開(即運動中的對象,路徑,速度,時序,x/y/z co從屬定位等)。

同樣,文章說這個區域是最快速變化的,並且不知道WebGL,SMIL + SVG,Canvas + Javascript,好的Flash/Actionscript還是別的什麼東西都是最適合你的路線,取決於您的需求和您正在開發的遊戲類型。