在 Margin Container->VBox 中拖放(交换)3 个纹理按钮

Drag & Drop (swap) 3 texture buttons in a Margin Container->VBox

跟随一个很棒的教程,代码被复制,但没有如图所示运行。当我尝试拖动纹理按钮时,似乎没有创建新纹理。唯一的区别是教程使用的是 TextureRect,而我使用的是 TextureButton。

extends TextureButton


func get_drag_data(position: Vector2):
    var vControl = Control.new()
    var vData    = {}
    var vTexture = TextureRect.new()
    
    vTexture.expand    = true
    vTexture.texture   = texture_disabled
    vTexture.rect_size = Vector2(320, 400)
    
    vControl.add_child(vTexture)
    vTexture.rect_position = -0.5 * vTexture.rect_size
    
    set_drag_preview(vTexture)
    
    return vData

上面的代码已附加到 Party_1。 texture_disabled 确实有纹理集。

如果 get_drag_data 中的代码看起来像这样,它会起作用:

func get_drag_data(_position: Vector2):
    var vTexture = TextureRect.new()
    vTexture.expand    = true
    vTexture.texture   = texture_disabled
    vTexture.rect_size = Vector2(320, 400)
    set_drag_preview(vTexture)
    return {}

但是,这会将 TextureRect top-left 角放在光标位置。

您想偏移 TextureRect 的位置,使其以光标位置为中心。为此,您创建另一个 Control,将 TextureRect 作为 child 添加到其中……然后仍然传递 TextureRect?不,那不行,你需要通过新的 Control:

func get_drag_data(_position: Vector2):
    var vTexture = TextureRect.new()
    vTexture.expand    = true
    vTexture.texture   = texture_disabled
    vTexture.rect_size = Vector2(320, 400)

    var vControl = Control.new()
    vControl.add_child(vTexture)
    vTexture.rect_position = -0.5 * vTexture.rect_size

    set_drag_preview(vControl)
    return {}

请注意我将 vControlset_drag_preview,而不是 vTexture


你不能给 set_drag_preview 一个有 parent 的 Control。事实上,如果您尝试过,您会在输出控制台中收到一条错误消息:

_gui_set_drag_preview: Condition "p_control->get_parent() != nullptr" is true.

_gui_set_drag_preview: Condition "p_control->is_inside_tree()" is true.