https://abitawake.com/news/articles/procedural-generation-with-godot-creating-caves-with-cellular-automata 

爽到不行

@tool
#https://abitawake.com/news/articles/procedural-generation-with-godot-creating-caves-with-cellular-automata
#参考了这篇文章使用tool的办法
extends Node2D


@onready var land_layer: TileMapLayer = %LandLayer
@onready var sea_layer: TileMapLayer = %SeaLayer

var terrain_land_index = 0
var terrain_sea_index =0
var land_array = []
var sea_array  = []
var outer_y = 0
var outer_x = 0
var img_instance:Image

@export var redraw = false

func _on_ready() -> void:
	if redraw == true:
		redraw_map()
	pass # Replace with function body.

func redraw_map():
	# only do this if we are working in the editor
	if !Engine.is_editor_hint(): return
	
	#https://docs.godotengine.org/en/4.3/tutorials/io/runtime_file_loading_and_saving.html
	#读写文件的文档在上面
	var file = FileAccess.open("res://maps/cropped_image_5_8_128x128.png", FileAccess.READ)
	print(file)
	var file_size = file.get_length()
	print("file_size:",file_size)
	
	var file_buffer = file.get_buffer(file_size)
	#print(file_buffer)
	
	#https://docs.godotengine.org/en/4.3/classes/class_image.html#class-image-method-load-png-from-buffer
	#接着是处理png文件的Image类的文档
	img_instance = Image.new()
	var error = img_instance.load_png_from_buffer(file_buffer)
	print("Map Size:",img_instance.get_size())
	#拿到地图的长和宽
	var map_weight = img_instance.get_width()
	var map_height = img_instance.get_height()
	
	land_layer.clear()
	sea_layer.clear()
	
	land_layer.enabled = false
	sea_layer.enabled = false
	
	#沿着y向下递增的扫描整个图像
	var step_size = 128
	for inner_y in range(0, step_size):
		for inner_x in range(0, step_size):
			var color = img_instance.get_pixel(inner_x,inner_y)
			if color == Color.BLUE:
				sea_array.append(Vector2i( inner_x, inner_y))
			if color == Color.BLACK:
				land_array.append(Vector2i(inner_x, inner_y))
	land_layer.set_cells_terrain_connect(land_array,terrain_land_index,0,true)
	sea_layer.set_cells_terrain_connect(sea_array,terrain_sea_index,0,true)
	
	land_layer.enabled = true
	sea_layer.enabled = true
	pass

程序还是一样的,多了一个标志位:

如果点选了,那么切换场景的时候就会触发redraw地图的函数

核心是加了tool注解

redraw之前会先clear地图

重绘的核心逻辑也很简单

一旦点击play之后,场景的数据就会被序列化下来

这很好

就不会程序化生成地图了

秒开

当然TileSets的初始化需要使用日本人的这个脚本

当然,最终的效果也非常完美

与rmmz当中渲染的效果一致

至此,地图的移植算是完成了第一步