input for click and click-drag

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By LightBWK
:warning: 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).

:bust_in_silhouette: Reply From: Scipi

You can use input events to take care of this.

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?

LightBWK | 2016-08-03 06:47

Yeah, I forgot a level of indentation there.

Scipi | 2016-08-03 08:02

:bust_in_silhouette: Reply From: genete

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

att | 2017-09-30 06:34