在 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 {}
请注意我将 vControl
给 set_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.
跟随一个很棒的教程,代码被复制,但没有如图所示运行。当我尝试拖动纹理按钮时,似乎没有创建新纹理。唯一的区别是教程使用的是 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 {}
请注意我将 vControl
给 set_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.