Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java瓷砖游戏缩放_Java_2d_Zooming_Tile_Graphic - Fatal编程技术网

Java瓷砖游戏缩放

Java瓷砖游戏缩放,java,2d,zooming,tile,graphic,Java,2d,Zooming,Tile,Graphic,我正在用Java构建一个2D自上而下的基于平铺的游戏。当然,你可以在游戏中四处平移和放大,目前可以在10个不同的级别上放大,每个平铺的范围为10x10像素到100x100像素。目前,每个缩放级别的平铺存储在单独的精灵表中,在程序启动时读取,并存储在缓冲图像阵列中。我相信这不是最好的办法 我正在寻找任何长期提高效率的技巧,是否最好只使用100x100瓷砖,并在java中动态扩展它们;以某种方式在java中使用矢量图形(我知道如何使用,但我相信谷歌可以帮助我)或者什么 非常感谢 我会变得充满活力。

我正在用Java构建一个2D自上而下的基于平铺的游戏。当然,你可以在游戏中四处平移和放大,目前可以在10个不同的级别上放大,每个平铺的范围为10x10像素到100x100像素。目前,每个缩放级别的平铺存储在单独的精灵表中,在程序启动时读取,并存储在缓冲图像阵列中。我相信这不是最好的办法

我正在寻找任何长期提高效率的技巧,是否最好只使用100x100瓷砖,并在java中动态扩展它们;以某种方式在java中使用矢量图形(我知道如何使用,但我相信谷歌可以帮助我)或者什么

非常感谢

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

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

我建议你这样做:


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

即使您执行流体缩放,我仍然会执行细节级别纹理,并根据渲染的世界与摄影机之间的距离动态交换它们

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


您还可能会发现应用仿射变换听起来是个好主意,但它在计算上非常昂贵,如果您需要60fps的性能,那么用这种方法很难实现。不过,不要相信我的话,去试试看,看看它自己掉下来有多严重。

svg
s(矢量图形)在这里会很好。谢谢提醒,我会研究一下:)当对主要图形组件使用仿射变换时,计算机会渲染,或者至少计算出可见区域之外的内容吗。显然,如果游戏必须计算所有常规的东西,但对于整个地图,而不仅仅是可视区域,它将需要更多的CPU使用。谢谢@DanielMessias如果一个平铺在视图之外,它将不会被渲染,但它仍然会浪费资源。对于剔除,您仍然需要在代码中进行优化。通常,您有一个包含相机平截体的矩形,需要通过应用平移和缩放来修改该矩形。然后在此基础上应用剔除,并发送以仅渲染可见的内容。你不想在看不见的对象上进行矩阵计算!这个答案可能改变了我的生活。我明白你的意思。我同意你关于10个缩放级别太多的观点。这只是一个业余的有趣的项目,所以性能并不重要,但我完全同意你不需要超过5个。我对Java比较陌生,所以在一个过于简单的游戏中使用图像转换对我来说可能更容易,但我完全明白你的意思,谢谢你的输入:)这不是一个或另一个。可以将流体缩放(带变换)和不同的细节级别结合起来。以中世纪的第二次全面战争为例。缩小时,三维模型会降低纹理质量。如果你进一步缩小,它们就会变成2D精灵!!此外,最大放大可能不是“正常放大”。因此,显示10倍大的屏幕面积可能没有那么大,但很正常。这一切都取决于你画了多少对象和它们的纹理质量(/像素密度)。我相信很多实现细节都是游戏特有的。我同意,这不是一件或另一件事——它是流体僵尸的动态和细节层次的结合。