我正在寻求的建议不仅仅是直接的帮助。
我正在使用XNA的8位平台游戏。我已经沉入160小时了,我开始遇到引擎问题了。它基本上是XNA平台演示的改编/修改版本。我的所有或大部分瓷砖都是32x32,但有些是64宽,32像素高,就像一张桌子。有些是32宽,64高,像植物。
我将它们一次性发送到gpu只有一个.png,类似于XNA教程的作者进行磁贴映射的方式。对于动画精灵,我会使用角色的不同帧的平铺地图。对于tile地图数据,我在文本文件中读取就像XNA教程一样。
我应该如何容纳宽而高的瓷砖?我应该制作一个双层拼贴系统(我想我应该遵守keep-it-simple-stupid规则)?
现在我正在使用透明瓷砖来扩展宽瓷砖。
带椅子的桌子:
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吗?我可以采取的另一个选择是将每个宽或高的瓷砖切割成两个不同的瓷砖。专业人士如何做到这一点?我不是在寻找一个快速而肮脏的解决方案,而是现代平台游戏的运行方式。
更新:在查看答案后,我找到了一个非常有用的工具,可以将精灵打包成一张纸。
http://spritesheetpacker.codeplex.com/
更新:我新升级的磁贴引擎速度更快,几乎一样简单。以下建议很棒。强力推荐。
答案 0 :(得分:5)
首先关闭 - 不要引入特殊宽度/高度的瓷砖。让艺术家将大对象切成单个图块(然后在地图编辑器上重新组合它们)。每个图块都应该是带有Alpha通道的PNG,这样它们才能正确合成。
记住这一点,我的建议是:
您的瓷砖应仅由单个瓷砖组成,这些瓷砖具有不同物体的预先组成部分,例如,桌子的左侧部分是单个瓷砖,没有椅子的右侧部分是另一个,另外一个是它背后的椅子。 (tilevalue =“dc”,也许?)
您可以定义多个单个图块层并从前向后渲染它们。您还可以为多个图层定义视差因子,从而可以非常轻松地在两个图层之间获得良好的视差效果。当然,玩家必须一次“存在”一层,否则你将无法知道他/她当前位置使用的碰撞几何形状。
您也不应该为每个图块创建一个纹理 - 而是编译的图块(完全类似于spritesheet),以便最小化您所做的渲染更改次数。每次绘制调用进行许多更改都很糟糕,因为每次进行更改(当前纹理,绘图颜色或影响绘制调用的其他内容)时,API,驱动程序以及GPU本身都必须执行更新其状态的工作 - 这加快了。
请注意,这并不意味着您应该将字符和级别放入巨大的spritesheet中 - 这是其他原因造成的。例如,您可以:将所有与级别相关的图块放在一个图块中,将英雄的动画图块放在另一个图块上,将所有敌人放在一个(一起)或类似的东西上。
希望有所帮助,否则我很乐意进一步解释。