2012-05-23 67 views
1

我在尋找建議,不僅僅是直接幫助。平臺變形瓷磚引擎 - 關於如何處理長瓷磚的建議

我正在XNA的8位平臺遊戲中工作。我已經可能已經沉沒了160個小時,而且我已經開始涉及我擁有的引擎問題。它基本上是XNA平臺遊戲演示的改編/修改版本。我的所有或大部分瓷磚都是32x32,但有些是64寬和32px高,就像桌子一樣。有些32寬64高,就像植物一樣。

我一次性將它們發送到gpu只有一個.png,類似於XNA教程的作者做瓷磚映射的方式。對於動畫精靈,我使用角色不同幀的貼圖。對於瓷磚地圖數據,我讀取的文本文件就像XNA教程。

我應該如何適應寬和高的瓷磚?我應該製作一個雙層瓷磚系統(我認爲我應該遵守保持簡單的愚蠢規則)?

現在我正在使用透明瓷磚來擴展寬的瓷磚。

桌椅:

chair http://dl.dropbox.com/u/8446900/game_screen_desk.png

..... 
...h. 
..d". 
##### 

植物和椅子:

desk http://dl.dropbox.com/u/8446900/game_screen_plant.png

..p...h. 
..,...,. 
######## 

的椅子,是 'H', 'd' 是書桌, 'p'是植物,而','是用於透明背景瓷磚(沒有互動與用戶一起)。 '''用於用戶可以站立的透明瓷磚(擴展桌面)。問題是,正如你所看到的,背景似乎有一個洞。

我應該製作一個實際的瓷磚地圖並將所有東西合併成一個大的PNG?我可以採取的另一個選擇是實際上將每個寬的或高的瓷磚切割成兩個不同的瓷磚,親們如何做到這一點?我不是在尋找一種快速而髒的修復方法,天平臺遊戲將運行

UPDATE:。審查的答案後,我發現,包裝精靈成片狀一個非常有用的工具

http://spritesheetpacker.codeplex.com/

更新:我新升級的瓷磚引擎速度更快,幾乎同樣簡單。下面的建議很好。強力推薦。

回答

5

首先 - 不要引入特殊寬度/高度的瓷磚。讓藝術家將大對象切片成單個圖塊(並因此在地圖編輯器中重新組合它們)。每個瓷磚都應該是帶有Alpha通道的PNG,以便它們可以正確組合。

牢記這一點,我的建議是:

  1. 你的瓷磚應該只包含單一的瓷磚已經預先由不同對象的部分,例如桌子的左邊是一個單一的瓷磚,沒有椅子的右邊部分是另一個,另一個是椅子後面的椅子。 (tilevalue =「dc」,也許?)

  2. 您可以定義多個單個圖塊的圖層並將它們重新渲染。您還可以爲多個圖層定義視差因子,從而很容易地在兩個圖層之間獲得很好的視差效果。當然,玩家必須一次「存在」一層,否則你不會知道用於他/她當前位置的碰撞幾何圖形。

你也應該不會造成瓷磚每一個紋理 - 但是編譯tilesheet(酷似spritesheet),這樣你做的繪製狀態改變的數量最小化。每次繪製調用進行很多更改都很糟糕,因爲每次進行更改(當前紋理,繪製顏色或影響繪製調用的其他內容)API時,驅動程序和GPU可能必須執行更新其狀態的工作 - 此操作快速加起來。

請注意,這並不意味着您應該將字符和級別放入巨大的spritesheet中 - 這對其他原因不利。例如,您可以將所有與關卡等級相關的圖塊放在一張圖片中,將英雄的動畫圖塊放在另一張圖片上,並將所有敵人放在一張圖片上(一起)或類似的東西。

希望有幫助,否則我會很樂意進一步解釋事情。

+0

哈哈,我是藝術家。這應該不成問題。你會如何推薦我將圖形導入遊戲?作爲一個多個瓷磚或幾個圖像的大圖像?我知道內存曾經是一個約束,但現在我想知道它是否值得。它可能會在Windows Phone上發佈,因此性能是一個考慮因素。 – montag

+0

我想我真正的問題是,將每個項目單獨發送到XNA內容管道而不是擁有大量的spritesheet並從中切割出來,這會浪費多少cpu/ram?將每個物品單獨運送到GPU還是從它上面切下一塊大的紙張會更好? – montag

+0

哦,確實是一張單獨的spritesheet。只是不是內存將被浪費,每次你嘗試和綁定不同的紋理 - 這是一個renderstate變化,這些都是昂貴的。 – Ani