2

我正在用 Java 构建一个 2D 自上而下的基于瓷砖的游戏。当然,您可以平移和放大游戏,目前放大了 10 个不同的级别,其中每个图块的范围为 10x10 像素到 100x100 像素。目前,每个缩放级别的图块存储在单独的精灵表中,在程序启动时读取并存储在缓冲图像数组中。我确信这不是解决这个问题的最佳方式。

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

非常感谢!

4

2 回答 2

1

我会动态的。通常在计算机图形中,您使用矩阵,将其应用于图形上下文,修改您在其上绘制的所有内容。

这用于修改位置、缩放、旋转等。不是将相机位置减去每个图块,而是将平移应用到图形上下文一次,然后在世界位置绘制图块。图形上下文将负责将图块放置在正确的屏幕空间中。

我建议您阅读以下内容:

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

于 2012-04-06T17:52:34.590 回答
1

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

即使你进行流体缩放,我仍然会做细节层次纹理,并根据正在渲染的世界和相机之间的距离动态交换它们。

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

您还可能会发现应用 AffineTransform 听起来是个好主意,但它的计算成本非常高,而且如果您需要 60fps 的性能,您不太可能以这种方式实现它。不过,不要相信我的话,去尝试一下,看看它自己摔倒有多严重。

于 2012-04-06T18:19:43.187 回答