如何让set_drag_preview()使用的TextureRect实现居中拖拽?
问题描述
我使用以下代码展示拖拽物品预览:
func _get_drag_data(at_position: Vector2) -> Variant: var drag_preview := TextureRect.new() drag_preview.expand_mode = TextureRect.EXPAND_IGNORE_SIZE drag_preview.texture = icon_texture_rect.texture drag_preview.custom_minimum_size = Vector2(80, 80) drag_preview.modulate = Color(1, 1, 1, 0.75) set_drag_preview(drag_preview) # return this item slot as the thing to be dragged return self
这段代码可正常运行,但当前拖拽的矩形以左上角跟随鼠标指针,我希望鼠标指针能拖动矩形的中心(效果为预览图中心始终对齐鼠标指针)。请问有没有实现该效果的建议?我在TextureRect和Control文档中未找到合适方法。
解决方案
方法一:使用容器节点偏移(推荐)
通过给TextureRect套一个同尺寸的容器,利用容器的定位让预览图中心对齐鼠标:
func _get_drag_data(at_position: Vector2) -> Variant: # 创建容器作为拖拽预览的根节点,尺寸和预览图一致 var drag_container := Control.new() drag_container.custom_minimum_size = Vector2(80, 80) var drag_preview := TextureRect.new() drag_preview.expand_mode = TextureRect.EXPAND_IGNORE_SIZE drag_preview.texture = icon_texture_rect.texture drag_preview.custom_minimum_size = Vector2(80, 80) drag_preview.modulate = Color(1, 1, 1, 0.75) # 将预览图偏移自身尺寸的一半,使其中心对齐容器左上角 drag_preview.position = -drag_preview.size / 2 drag_container.add_child(drag_preview) set_drag_preview(drag_container) return self
原理:Godot默认以拖拽预览节点的左上角对齐鼠标,容器左上角对齐鼠标后,内部偏移的预览图自然会中心对齐鼠标。
方法二:直接调整预览图的锚点和位置
如果不想额外创建容器,可通过修改TextureRect的锚点和位置实现:
func _get_drag_data(at_position: Vector2) -> Variant: var drag_preview := TextureRect.new() drag_preview.expand_mode = TextureRect.EXPAND_IGNORE_SIZE drag_preview.texture = icon_texture_rect.texture drag_preview.custom_minimum_size = Vector2(80, 80) drag_preview.modulate = Color(1, 1, 1, 0.75) # 设置锚点为自身中心,再偏移位置让中心对齐鼠标 drag_preview.anchor_center = Vector2(0.5, 0.5) drag_preview.position = -drag_preview.size / 2 set_drag_preview(drag_preview) return self
内容的提问来源于stack exchange,提问作者Alexander Farber
相关产品推荐
相关产品推荐

