Topic was automatically imported from the old Question2Answer platform.
Asked By
LightBWK
Old Version
Published before Godot 3 was released.
Very new to gdscript, sorry for the noob question.
I’m making a minimap.
I need an input setup for click and click-drag.
So far my script can only click then update (once)
but cannot click-drag and updating (every frame).
var pressed = false
func _ready():
set_process_input(true)
func _input(ev):
if ev.type == InputEvent.MOUSE_BUTTON and ev.button_index == BUTTON_LEFT:
pressed = ev.pressed
# Do stuff...
if ev.type == InputEvent.MOUSE_MOTION:
if pressed:
# Do stuff...
So by default, there is no API that directly do click and drag. No wonder I cannot find it in the documentation.
Also, the last 2 ifs, need 1 more indentation in right?
Here is a script for a basic drag and drop with mouse over a Sprite node.
extends Sprite
var status = "none"
var tsize=Vector2()
var offset=Vector2()
var mpos=Vector2()
func _ready():
tsize=get_texture().get_size()
set_process_input(true)
set_process(true)
func _process(delta):
if status == "dragging":
set_global_pos(mpos + offset)
func _input(ev):
if ev.type == InputEvent.MOUSE_BUTTON and ev.button_index == BUTTON_LEFT and ev.is_pressed() and status != "dragging":
var evpos=ev.global_pos
var gpos=get_global_pos()
var spriterect
if is_centered():
spriterect=Rect2(gpos.x-tsize.x/2, gpos.y-tsize.y/2, tsize.x, tsize.y)
else:
spriterect=Rect2(gpos.x, gpos.y, tsize.x, tsize.y)
if spriterect.has_point(evpos):
status="clicked"
offset=gpos-evpos
if status=="clicked" and ev.type == InputEvent.MOUSE_MOTION:
status="dragging"
if status=="dragging" and ev.type == InputEvent.MOUSE_BUTTON and ev.button_index == BUTTON_LEFT:
if not ev.is_pressed():
status="released"
mpos=ev.global_pos
I think ev.global_pos is just clicked position.
extends Sprite
var status = "none"
var tsize=Vector2()
var offset=Vector2()
var mpos=Vector2()
func _ready():
tsize=get_texture().get_size()
set_process_input(true)
set_process(true)
func _process(delta):
if status == "clicked":
set_global_pos(mpos + offset)
func _input(ev):
if ev.type == InputEvent.MOUSE_BUTTON:
if ev.button_index == BUTTON_LEFT:
if ev.is_pressed() and _is_clicked(ev.global_pos):
status = "clicked"
mpos = ev.global_pos
offset = get_global_pos() - mpos
print("clicked")
else:
status = "released"
print("released")
elif ev.type == InputEvent.MOUSE_MOTION:
if status == "clicked":
print("move")
mpos = get_viewport().get_mouse_pos()
func _is_clicked(pos):
var sprite_rect
var gpos = get_global_pos()
if is_centered():
sprite_rect = Rect2(gpos.x - tsize.x/2, gpos.y - tsize.y/2, tsize.x, tsize.y)
else:
sprite_rect = Rect2(gpos.x, gpos.y, tsize.x, tsize.y)
if sprite_rect.has_point(pos):
return true
return false