Newer
Older
browserjam / scripts / physics_drag.gd
extends Node2D

var selected_body: RigidBody2D = null
var drag_position: Vector2 = Vector2.ZERO

func _on_mouse_down(event: InputEventMouseButton):
	var space_state = get_world_2d().direct_space_state
	var query = PhysicsPointQueryParameters2D.new()
	query.position = event.position
	var result = space_state.intersect_point(query)
	
	if len(result) > 0:
		selected_body = result[0]['collider']
		drag_position = selected_body.global_transform.inverse() * event.position

func _on_mouse_up(event: InputEventMouseButton):
	selected_body = null

func _process(delta: float):
	if selected_body == null:
		return

	var mouse_position = get_viewport().get_mouse_position()
	var anchor_position = selected_body.global_transform * drag_position
	var force = mouse_position - anchor_position
	selected_body.apply_impulse(force, anchor_position - selected_body.global_position)

func _input(event: InputEvent) -> void:
	if event is InputEventMouseButton:
		if event.is_pressed():
			_on_mouse_down(event as InputEventMouseButton)
		else:
			_on_mouse_up(event as InputEventMouseButton)