爽到不行
@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当中渲染的效果一致
至此,地图的移植算是完成了第一步