微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Godot 2D 自上而下的瓷砖渲染在程序生成的世界中

如何解决Godot 2D 自上而下的瓷砖渲染在程序生成的世界中

我知道这个问题经常被问到。但对于我的生活,我无法在互联网上找到答案。

到目前为止,我已经创建了一个带有 Player 节点(连接了相机)和一个 TileMap 的场景。

TileMap 使用 OpenSimplexNoise 在玩家周围生成一个 32x32 的瓷砖网格,一个“块”。

我创建了一个脚本来不断地在 _process(Delta) 中生成新图块,但是如果“块”太大并且我必须同时更新位掩码,这会破坏帧速率。

通过我的研究,我了解到与其每 0.1 秒更新一次图块,不如在玩家通过“块”移动时将它们分成 9 个“块”绘制。

我模糊地理解使用“块”作为实例并复制它的概念,但似乎只有在 3D 场景中才需要这样做。

我的问题是: 我是否需要实例化一个 TileMap 块,或者我可以将 TileMap 保留在场景中并根据玩家块的位置绘制大块的图块。

我的最终游戏是创建一个程序生成的大型有限地图,但是当我使用位掩码和自动贴图时,我无法通过绘制大量单元格来填充屏幕的阶段。

任何资源、链接、教程都会很有帮助,因为互联网上的知识太多了,我在寻找正确答案时迷失了方向。

这是我的代码

func _ready():
   randomize()
   noise = OpenSimplexNoise.new() # Makes the noise OpenSimplexNoise
   noise.seed = 123456#randi()
   print("seed: " + str(noise.seed))
   noise.octaves = 1.0
   noise.period = 12
   noise.persistence = 0.7
   screensize = get_viewport().get_visible_rect().size
   addChunk()



func addChunk():
   var chunkWidth = 32
   var chunkHeight = 32
   var player_pos = Vector2(0,0)
   var chunkCenter = ($Grid.world_to_map($Player.position)/32)*32
   var PlayerChunkPos = ($Grid.world_to_map($Player.position)/16)
   var columnStart: float = (chunkCenter.x/16 - (chunkWidth/2)+16)
   var columnEnd: float = (chunkCenter.x/16 + (chunkWidth/2)+16)
   var rowStart: float = (chunkCenter.y/16 - (chunkHeight/2)+16)
   var rowEnd: float = (chunkCenter.y/16 + (chunkHeight/2)+16)
      for x in range(columnStart,columnEnd):
        for y in range(rowStart,rowEnd):
           var a = noise.get_noise_2d(x,y)
              if  a < grass_cap:
                $Grass.set_cell(x,y,0)
                #$Grass.update_bitmask_region(Vector2(0.0,0.0),Vector2(x,y))


func _process(delta):
   addChunk()
   print($Grid.world_to_map($Player.position))
   print(($Grid.world_to_map($Player.position)/32).floor())

解决方法

首先,TileMap 已经处理了用于内部渲染的块块。您可以通过设置 cell_quadrant_size 来配置这些块的大小。因此,是的,单个 TileMap 应该适用于合理大尺寸的有限地图。


用于生成块中的内容……好吧,一旦生成了块,您就不必再次生成它,对吗?因此,请跟踪您已经生成的块(我建议使用字典的键作为集合)。

您将使用相机的位置来计算附近块的坐标。对于每一个,您检查它们是否在生成的块集中。对于那些没有生成的块,您调用一个函数,该函数根据其坐标生成块,然后将它们添加到生成的块集合中。


进一步优化的可能路径:您只能在相机从一个块移动到另一个块时生成块。此外,您只能考虑与相机移动的相机方向相同的块(假设相机没有跳过太多块)。


如有其他问题,我建议您访问姊妹网站 gamedev.stackexchange.com。有很多关于区块和世界生成的现有问题可能会对您有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。