问题描述
我知道这个问题经常被问到。但对于我的生活,我无法在互联网上找到答案。
到目前为止,我已经创建了一个带有 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())
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)