首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合并多个精灵节点?

合并多个精灵节点?
EN

Stack Overflow用户
提问于 2022-10-19 07:57:40
回答 1查看 51关注 0票数 1

例如,假设我有2个sprite节点(但也可能超过2个),如下所示:

每个人都有各自的形象

我想要的是将它们组合起来,创建一个具有单个映像的新sprite节点(在工具模式下)。

就像这样:

也许使用Image是可能的?(无疑涉及计算)

或者使用VisualServer的东西

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-24 06:53:05

我找到了解决办法

代码语言:javascript
运行
复制
tool
extends Sprite

export (Vector2) var img_size setget set_img_size
export (String) var img_path = "res://MergeImg.png"
export (bool) var generate_img = false setget set_generate_img

var ep_filesystem=EditorPlugin.new().get_editor_interface().get_resource_filesystem()

func set_img_size(new_val):
    img_size=new_val
    update()

func _draw():
    draw_rect(Rect2(0,0,img_size.x,img_size.y), Color(0,200,0), false, 1.0)

func set_generate_img(new_val):
    if(not new_val):
        return
    
    var screenshot_viewport=Viewport.new()
    screenshot_viewport.size=img_size
    screenshot_viewport.hdr=false
    screenshot_viewport.transparent_bg=true
    screenshot_viewport.render_target_v_flip=true
    
    for child in get_children():
        remove_child(child)
        screenshot_viewport.add_child(child)
    
    add_child(screenshot_viewport)
    
    screenshot_viewport.set_update_mode(Viewport.UPDATE_ONCE)
    yield(VisualServer,"frame_post_draw")
    
    var mergeImg=screenshot_viewport.get_texture().get_data()
    mergeImg.save_png(img_path)
    
    for child in screenshot_viewport.get_children():
        screenshot_viewport.remove_child(child)
        add_child(child)
        child.set_owner(get_tree().get_edited_scene_root())
    screenshot_viewport.queue_free()
    
    ep_filesystem.scan()
    yield(ep_filesystem,"filesystem_changed")
    
    texture=load(img_path)
    centered=false
    region_enabled=true
    region_rect=Rect2(0,0,img_size.x,img_size.y)
    
    print("Merged Images!")

func _init():
    self_modulate=Color("#74646464")

一旦按下generate_img,它就会创建如下所示的图像:

我添加self_modulate=Color("#74646464")的原因是为了在合并的图像和子精灵(像幽灵图像)之间没有混淆。

虽然我仍然觉得有一个更好的解决方案,如果是这样,请张贴一个。

编辑:

用于中心偏移

代码语言:javascript
运行
复制
func _draw():
    var origin_x=0
    var origin_y=0
    if(centered):
        origin_x=-img_size.x/2
        origin_y=-img_size.y/2
    print("Redrawing")
    draw_rect(Rect2(origin_x,origin_y,img_size.x,img_size.y), Color(0,200,0), false, 1.0)

func set_generate_img(new_val=true):
    if(not new_val):
        return
    
    var screenshot_viewport=Viewport.new()
    screenshot_viewport.size=img_size
    screenshot_viewport.hdr=false
    screenshot_viewport.transparent_bg=true
    screenshot_viewport.render_target_v_flip=true
    if(centered):
        screenshot_viewport.global_canvas_transform.origin=Vector2(img_size.x/2,img_size.y/2)
    
    for child in get_children():
        remove_child(child)
        screenshot_viewport.add_child(child)
    
    add_child(screenshot_viewport)
    
    screenshot_viewport.set_update_mode(Viewport.UPDATE_ONCE)
    yield(VisualServer,"frame_post_draw")
    
    var mergeImg=screenshot_viewport.get_texture().get_data()
    mergeImg.save_png(img_path)
    
    for child in screenshot_viewport.get_children():
        screenshot_viewport.remove_child(child)
        add_child(child)
        child.set_owner(get_tree().get_edited_scene_root())
    screenshot_viewport.queue_free()
    
    ep_filesystem.scan()
    yield(ep_filesystem,"filesystem_changed")
    
    texture=load(img_path)
    region_enabled=true
    region_rect=Rect2(0,0,img_size.x,img_size.y)

编辑2:

修复更暗的透明图像,感谢Theraot's answer (请投它!)

代码语言:javascript
运行
复制
tool
extends Sprite

export (Vector2) var img_size setget set_img_size
export (String) var img_path = "res://MergeImg.png"
export (bool) var generate_img = false setget set_generate_img

var ep_filesystem=EditorPlugin.new().get_editor_interface().get_resource_filesystem()

func set_img_size(new_val):
    img_size=new_val
    update()

func _draw():
    var origin_x=0
    var origin_y=0
    if(centered):
        origin_x=-img_size.x/2
        origin_y=-img_size.y/2
    print("Redrawing")
    draw_rect(Rect2(origin_x,origin_y,img_size.x,img_size.y), Color(0,200,0), false, 1.0)

func set_generate_img(new_val=true):
    if(not new_val):
        return
    
    var screenshot_viewport=Viewport.new()
    screenshot_viewport.size=img_size
    screenshot_viewport.hdr=false
    screenshot_viewport.transparent_bg=true
    screenshot_viewport.render_target_v_flip=true
    if(centered):
        screenshot_viewport.global_canvas_transform.origin=Vector2(img_size.x/2,img_size.y/2)
    
    for child in get_children():
        remove_child(child)
        screenshot_viewport.add_child(child)
    
    add_child(screenshot_viewport)
    
    screenshot_viewport.set_update_mode(Viewport.UPDATE_ONCE)
    yield(VisualServer,"frame_post_draw")
    
    var mergeImg=screenshot_viewport.get_texture().get_data()
    ### unmultiplication ###
    mergeImg.lock()
    for y in mergeImg.get_size().y:
        for x in mergeImg.get_size().x:
            var color:Color = mergeImg.get_pixel(x, y)
            if color.a != 0:
                mergeImg.set_pixel(x, y, Color(color.r / color.a, color.g / color.a, color.b / color.a, color.a))
    mergeImg.unlock()
    ###
    mergeImg.save_png(img_path)
    
    for child in screenshot_viewport.get_children():
        screenshot_viewport.remove_child(child)
        add_child(child)
        child.set_owner(get_tree().get_edited_scene_root())
    screenshot_viewport.queue_free()
    
    ep_filesystem.scan()
    yield(ep_filesystem,"filesystem_changed")
    
    texture=load(img_path)

func _init():
    self_modulate=Color("#74646464")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74121784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档