15
I am working on the input and it feels like its getting out of hand. I wanted to check in with people and see how people structure their input handling.
Currently I have 1 function _unhandled_unput(event) and inside there I have a ton of elif statements trying to handle every possible situation and event. Its manageable at the moment but I only have like 4 events so its going to get very out of hand if I continue.
I need to have 100s of these events based on whats selected and what mouse/keyboard buttons are being pressed and I need some way to resuse the actions.
spoiler
func _unhandled_input(event):
if event is InputEventMouseButton and event.pressed:
if event.button_index == MOUSE_BUTTON_RIGHT:
clear_selection()
gui.queue_redraw()
get_viewport().set_input_as_handled()
return
if selected_item == "colonist": #broken
if event is InputEventKey:
if event.OS.get_keycode_string() == "r":
for colonist in selected_group:
colonist.set_state("DRAFT")
get_viewport().set_input_as_handled()
gui.queue_redraw()
#nothing selected dragbox to select things and single click to select things - does not work at the moment
elif selected_type == "" or selected_type == "basic":
if is_dragging and event is InputEventMouseMotion:
drag_end = camera.get_global_mouse_position()
cam_drag_end= get_viewport().get_mouse_position()
get_selection(drag_start, drag_end)
gui.queue_redraw()
get_viewport().set_input_as_handled()
return
elif event is InputEventMouseButton and not event.pressed:
is_dragging = false
gui.queue_redraw()
drag_start = null
drag_end = null
get_viewport().set_input_as_handled()
return
elif event is InputEventMouseButton and event.pressed:
if event.button_index == MOUSE_BUTTON_LEFT:
selected_type = "basic"
is_dragging = true
drag_start = camera.get_global_mouse_position()
cam_drag_start = get_viewport().get_mouse_position()
gui.queue_redraw()
get_viewport().set_input_as_handled()
return
#command flow for dragging a selection box
elif selected_type == "command":
if selected_item == "structure_dict_growing":
if is_dragging and event is InputEventMouseMotion:
var grid_pos = tilemap.local_to_map(camera.get_global_mouse_position())
var local_pos = tilemap.map_to_local(grid_pos)
drag_end = local_pos + Vector2(32, 32)
cam_drag_end = get_viewport().get_mouse_position()
gui.queue_redraw()
get_viewport().set_input_as_handled()
return
elif event is InputEventMouseButton and not event.pressed:
if event.button_index == MOUSE_BUTTON_LEFT:
is_dragging = false
gui.queue_redraw()
get_viewport().set_input_as_handled()
MessageBus.rpc_id(1, "request_zone_growing", selected_item ,drag_start, drag_end, multiplayer.get_unique_id())
drag_start = null
drag_end = null
return
elif event is InputEventMouseButton and event.pressed:
if event.button_index == MOUSE_BUTTON_LEFT:
is_dragging = true
#to snap to grid
var grid_pos = tilemap.local_to_map(camera.get_global_mouse_position())
var local_pos = tilemap.map_to_local(grid_pos)
drag_start = local_pos - Vector2(32, 32)
cam_drag_start = get_viewport().get_mouse_position() #this is broken cbf fixing maybe one day after selection is working
gui.queue_redraw()
get_viewport().set_input_as_handled()
return
elif selected_type == "floor":
if event is InputEventMouseButton and event.pressed:
if event.button_index == MOUSE_BUTTON_LEFT:
var global_mouse_pos = camera.get_global_mouse_position()
var grid_pos = tilemap.local_to_map(global_mouse_pos)
if selected_item == "":
return
MessageBus.rpc_id(1, "request_build_floor", selected_item, grid_pos, multiplayer.get_unique_id())
get_viewport().set_input_as_handled()
return
elif selected_type == "building":
if event is InputEventMouseButton and event.pressed:
if event.button_index == MOUSE_BUTTON_LEFT:
var global_mouse_pos = camera.get_global_mouse_position()
var grid_pos = tilemap.local_to_map(global_mouse_pos)
if selected_item == "":
return
MessageBus.rpc_id(1, "request_build_structure", selected_item, grid_pos, multiplayer.get_unique_id())
get_viewport().set_input_as_handled()
return
if you hardcode letters for keys, you can't handle alternate keyboard layouts. without rebinding, that means some users will have to be contortionists to play.