2012-05-23 54 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