# 窗口渲染 + 顶视/斜视截图(W2-W4 视觉核对)。非 headless。 # godot --path project --script world_shot.gd --quit-after 90 extends SceneTree var _w: Node var _frames := 0 func _init() -> void: var assets: String = AssetRoot.path() _w = ClassDB.instantiate("Metin2World") _w.set("assets_root", assets) _w.set("map_path", "OutdoorA1/metin2_map_a1") _w.set("auto_load", false) get_root().add_child(_w) var ok: bool = _w.call("load_map") var rep: Dictionary = _w.call("get_load_report") print("ok=", ok, " report=", rep) var msx: float = float(rep["map_size_x"]) * 256.0 var msy: float = float(rep["map_size_y"]) * 256.0 # 光照 / 天空 / 雾 / 色调由 Metin2World 从 A1.msenv 建(env_ok=%s) print("env_ok=", rep.get("env_ok"), " fog_level=", rep.get("fog_level")) var top := Camera3D.new() top.name = "TopCam" top.projection = Camera3D.PROJECTION_ORTHOGONAL top.size = max(msx, msy) * 1.05 top.position = Vector3(msx * 0.5, 3000.0, msy * 0.5) top.rotation_degrees = Vector3(-90.0, 0.0, 0.0) top.far = 8000.0 get_root().add_child(top) var persp := Camera3D.new() persp.name = "PerspCam" persp.fov = 55.0 persp.position = Vector3(msx * 0.35, 260.0, msy * 0.62) persp.look_at(Vector3(msx * 0.5, 150.0, msy * 0.45)) persp.far = 6000.0 get_root().add_child(persp) top.make_current() func _process(_dt: float) -> bool: _frames += 1 var outdir: String = ProjectSettings.globalize_path("res://../test/golden") DirAccess.make_dir_recursive_absolute(outdir) if _frames == 6: var img := get_root().get_texture().get_image() img.save_png(outdir + "/world-a1-terrain-top.png") print("saved terrain-top.png ", img.get_size()) get_root().get_node("PerspCam").make_current() elif _frames == 12: var img2 := get_root().get_texture().get_image() img2.save_png(outdir + "/world-a1-persp.png") print("saved world-a1-persp.png ", img2.get_size()) quit(0) return false