2012-04-06 114 views
0

我正在用Java构建一个基于2D的自顶向下拼贴游戏。当然,你可以平移和放大游戏,目前放大10个不同的级别,其中每个瓦片适当地从10x10像素到100x100像素。目前,每个缩放级别的图块都存储在单独的精灵图纸中,在程序启动时读入并存储在缓冲图像数组中。我相信这不可能是解决这个问题的最好方法。Java拼图游戏缩放

我在寻找提高长期效率的技巧,最好是只有100x100的瓷砖,并在java中动态调整它们;以某种方式在Java中使用矢量图形(我确定如何,但我相信谷歌可以帮助我)或什么?

非常感谢!

+1

'svg's(矢量图形)在这里会很好。 – Jon 2012-04-06 17:44:47

+0

我会看看,谢谢你的头:) – 2012-04-06 17:47:39

回答

1

我会去充满活力。 通常在计算机图形学中,您使用适用于图形上下文的矩阵,修改您在其上绘制的所有内容。

这是用来修改位置,比例,旋转等。而不是减去相机的位置到每个瓷砖,你将翻译一次应用到图形上下文,然后你在世界位置绘制瓷砖。图形上下文将负责将拼贴放置在正确的屏幕空间中。

我建议你以下写着:

http://docs.oracle.com/javase/tutorial/2d/advanced/transforming.html http://www.javalobby.org/java/forums/t19387.html

+0

感谢您的意见! – 2012-04-06 18:04:36

+0

对主图形组件使用仿射变换时,计算机是否渲染出来,或者至少计算出可见区域之外的东西。显然,如果游戏必须计算所有常用的东西,但是对于整个地图,不仅仅是可见区域,它将占用更多的CPU使用量。谢谢! – 2012-04-06 18:16:27

+0

@DanielMessias如果一个图块不在视图中,它将不会被渲染,但它会浪费资源。为了剔除,您仍然需要在代码中进行优化。一般来说,你有一个矩形包含相机frustrum,你需要修改应用翻译和缩放。然后,您基于此应用剔除并发送以仅显示可见内容。你不想对不可见的对象进行矩阵计算! – 2012-04-06 18:46:51

0

如果你正在做固定的缩放(即每个缩放级别从CAMER固定的距离),而不是液体变焦(在玩家可以放大3.3倍,7.5倍,而不仅仅是1倍,2倍,3倍等),那么试图通过简单地应用缩放变换来解决这个问题是非常浪费的。这很诱人,因为这是最简单的方法,从实现的角度很容易理解,但这意味着在最大缩小范围内,您将渲染的面积在X方向上大10倍,在10倍大Y方向 - 因此您必须渲染的世界的区域比最大放大时大100倍。我也怀疑,当你缩小时,你会喜欢你的纹理被硬件挤压的方式。计算机图形与光学 - 子像素渲染不同,在计算机图形学中发生的其他事情不会使你的纹理看起来非常好,如果你把这个任务从软件/硬件上移开。

即使您进行流体缩放,我仍然会进行细节层次的纹理处理,并根据呈现的世界与相机之间的距离动态调换它们。

此外,10缩放级别?你确定你真的需要10个缩放级别吗?缩放通常用于2D游戏,以便您在不同的细节层次上执行不同的活动,因为特定的缩放级别特别适合于某些特定的活动。我不记得任何需要10个缩放级别才能完成的2D游戏。 3-5是我见过的最多,我从来没有觉得这是不够的。在10个缩放级别的每个缩放级别上生成图像似乎也有很多艺术作品。

你也很可能会发现应用AffineTransform听起来不错,但是它的计算量非常大,而且如果你需要60fps的性能,你很难以这种方式实现。尽管不要听我的话,但试试吧,看看它本身有多糟糕。

+0

我明白你的观点。我同意你在10个缩放级别太多的观点。这只是一个有趣的项目,所以性能并不重要,但我完全同意你不需要超过5个。我相对较新的Java,因此在简单的游戏中使用图像转换可能更容易我,但我完全看到你的观点,感谢您的输入:) – 2012-04-06 18:29:37

+1

它不是一个或其他。您可以将流体缩放(包含转换)和不同级别的细节组合在一起。以中世纪全面战争II为例。当您缩小时,3D模型会松动纹理质量。如果你缩小更多,他们会变成2D SPRITES! – 2012-04-06 18:50:57

+0

此外,最大放大可能不是“正常缩放”。因此,显示10倍更大的屏幕区域可能并不那么巨大,但正常。这一切都取决于您绘制了多少物体以及它们具有的纹理质量(/像素密度)。 – 2012-04-06 18:51:26