diff --git a/Scenes/GUI/Controls/MovementFrameIndicatorOff.tscn b/Scenes/GUI/Controls/MovementFrameIndicatorOff.tscn new file mode 100644 index 0000000..8a2cad7 --- /dev/null +++ b/Scenes/GUI/Controls/MovementFrameIndicatorOff.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=2 format=3 uid="uid://btbdib3vwowhd"] + +[ext_resource type="Script" uid="uid://b4qincechbf63" path="res://Scripts/MovementFrameIndicator.gd" id="1_ttcva"] + +[node name="MovementFrameIndicator" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 2.0 +offset_bottom = 32.0 +script = ExtResource("1_ttcva") + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -2.0 +grow_horizontal = 0 +grow_vertical = 2 +color = Color(0.0941176, 0.0941176, 0.0941176, 1) diff --git a/Scenes/GUI/Controls/MovementFrameIndicatorOn.tscn b/Scenes/GUI/Controls/MovementFrameIndicatorOn.tscn new file mode 100644 index 0000000..49d1ffa --- /dev/null +++ b/Scenes/GUI/Controls/MovementFrameIndicatorOn.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=2 format=3 uid="uid://dao6mf54xule2"] + +[ext_resource type="Script" uid="uid://b4qincechbf63" path="res://Scripts/MovementFrameIndicator.gd" id="1_2om8h"] + +[node name="MovementFrameIndicator" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 2.0 +offset_bottom = 32.0 +script = ExtResource("1_2om8h") + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -2.0 +grow_horizontal = 0 +grow_vertical = 2 +color = Color(0, 1, 0, 1) diff --git a/Scenes/GUI/Controls/MovementRow.tscn b/Scenes/GUI/Controls/MovementRow.tscn index 46c820a..0a6fa47 100644 --- a/Scenes/GUI/Controls/MovementRow.tscn +++ b/Scenes/GUI/Controls/MovementRow.tscn @@ -32,6 +32,7 @@ offset_left = 4.0 offset_top = 4.0 offset_right = 260.0 offset_bottom = 36.0 +tooltip_text = "Click to bind a key to this movement" text = "0 - Name (Unbound)" alignment = 0 @@ -45,4 +46,21 @@ grow_horizontal = 2 grow_vertical = 2 theme_override_styles/panel = ExtResource("1_d1xev") +[node name="InvisibleMask" type="Control" parent="MovementsBG"] +clip_contents = true +layout_mode = 1 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 4.0 +offset_top = 4.0 +offset_right = -4.0 +offset_bottom = -4.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="MovementsHandle" type="Control" parent="MovementsBG/InvisibleMask"] +anchors_preset = 0 +offset_left = 120.0 +offset_right = 120.0 + [connection signal="pressed" from="Button" to="." method="_on_button_pressed"] diff --git a/Scenes/GUI/EditorScreen.tscn b/Scenes/GUI/EditorScreen.tscn index 5e415d6..a0e236a 100644 --- a/Scenes/GUI/EditorScreen.tscn +++ b/Scenes/GUI/EditorScreen.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=26 format=3 uid="uid://oiehbor0dlqx"] +[gd_scene load_steps=27 format=3 uid="uid://oiehbor0dlqx"] [ext_resource type="Script" uid="uid://dfiwoln8mdwm8" path="res://Scripts/EditorScreen.gd" id="1_sd512"] [ext_resource type="Theme" uid="uid://dbgs4id7y5d1c" path="res://UI/Themes/Dark.tres" id="1_v0ton"] @@ -8,6 +8,7 @@ [ext_resource type="Texture2D" uid="uid://dts4eh6hyt8p3" path="res://UI/SkipBackwards.png" id="3_r4ytj"] [ext_resource type="Texture2D" uid="uid://bwhgy4u37jmo1" path="res://UI/Pause.png" id="4_ba3jn"] [ext_resource type="Texture2D" uid="uid://dhx2v2fd0egxd" path="res://UI/FastBackwards.png" id="4_wy7jo"] +[ext_resource type="Texture2D" uid="uid://cttgtbu1xllwq" path="res://UI/Stop.png" id="8_20noo"] [ext_resource type="Texture2D" uid="uid://dsr03w7r667fw" path="res://UI/FastForward.png" id="8_v0ton"] [ext_resource type="Texture2D" uid="uid://bphwtliq2ahus" path="res://UI/SkipForward.png" id="9_20noo"] [ext_resource type="Texture2D" uid="uid://ckg2ihy105ttj" path="res://UI/Record.png" id="10_wy7jo"] @@ -195,13 +196,13 @@ anchor_right = 1.0 offset_bottom = 48.0 grow_horizontal = 2 -[node name="Label" type="Label" parent="SequencerPanel/TransportControls"] +[node name="TimeLabel" type="Label" parent="SequencerPanel/TransportControls"] layout_mode = 0 offset_left = 8.0 offset_top = 8.0 offset_right = 196.0 offset_bottom = 40.0 -text = "00:00:00:00 / 00:00:00:00" +text = "0:00:00:00" vertical_alignment = 1 [node name="Centered" type="Control" parent="SequencerPanel/TransportControls"] @@ -211,19 +212,20 @@ anchor_left = 0.5 anchor_top = 0.5 anchor_right = 0.5 anchor_bottom = 0.5 -offset_left = -156.0 +offset_left = -178.0 offset_top = -24.0 -offset_right = 156.0 +offset_right = 178.0 offset_bottom = 24.0 grow_horizontal = 2 grow_vertical = 2 -[node name="SkipBackwardsButton" type="Button" parent="SequencerPanel/TransportControls/Centered"] +[node name="StepBackwardsButton" type="Button" parent="SequencerPanel/TransportControls/Centered"] layout_mode = 0 offset_left = 4.0 offset_top = 4.0 offset_right = 44.0 offset_bottom = 44.0 +tooltip_text = "Step backward 1 frame" icon = ExtResource("3_r4ytj") [node name="FastBackwardsButton" type="Button" parent="SequencerPanel/TransportControls/Centered"] @@ -232,6 +234,7 @@ offset_left = 48.0 offset_top = 4.0 offset_right = 88.0 offset_bottom = 44.0 +tooltip_text = "Play backwards at 2x speed" icon = ExtResource("4_wy7jo") [node name="PlayBackwardsButton" type="Button" parent="SequencerPanel/TransportControls/Centered"] @@ -240,6 +243,7 @@ offset_left = 92.0 offset_top = 4.0 offset_right = 132.0 offset_bottom = 44.0 +tooltip_text = "Play backwards" icon = ExtResource("3_mr8sb") [node name="PauseButton" type="Button" parent="SequencerPanel/TransportControls/Centered"] @@ -248,30 +252,43 @@ offset_left = 136.0 offset_top = 4.0 offset_right = 176.0 offset_bottom = 44.0 +tooltip_text = "Pause" icon = ExtResource("4_ba3jn") -[node name="PlayButton" type="Button" parent="SequencerPanel/TransportControls/Centered"] +[node name="StopButton" type="Button" parent="SequencerPanel/TransportControls/Centered"] layout_mode = 0 offset_left = 180.0 offset_top = 4.0 offset_right = 220.0 offset_bottom = 44.0 -icon = ExtResource("3_g6u4d") +tooltip_text = "Stop playback and return to frame 0" +icon = ExtResource("8_20noo") -[node name="FastForwardButton" type="Button" parent="SequencerPanel/TransportControls/Centered"] +[node name="PlayButton" type="Button" parent="SequencerPanel/TransportControls/Centered"] layout_mode = 0 offset_left = 224.0 offset_top = 4.0 offset_right = 264.0 offset_bottom = 44.0 -icon = ExtResource("8_v0ton") +tooltip_text = "Play" +icon = ExtResource("3_g6u4d") -[node name="SkipForwardButton" type="Button" parent="SequencerPanel/TransportControls/Centered"] +[node name="FastForwardButton" type="Button" parent="SequencerPanel/TransportControls/Centered"] layout_mode = 0 offset_left = 268.0 offset_top = 4.0 offset_right = 308.0 offset_bottom = 44.0 +tooltip_text = "Play at 2x speed" +icon = ExtResource("8_v0ton") + +[node name="StepForwardButton" type="Button" parent="SequencerPanel/TransportControls/Centered"] +layout_mode = 0 +offset_left = 312.0 +offset_top = 4.0 +offset_right = 352.0 +offset_bottom = 44.0 +tooltip_text = "Step forward 1 frame" icon = ExtResource("9_20noo") [node name="RecordButton" type="Button" parent="SequencerPanel/TransportControls"] @@ -287,6 +304,7 @@ offset_right = -4.0 offset_bottom = 20.0 grow_horizontal = 0 grow_vertical = 2 +tooltip_text = "Start recording" icon = ExtResource("10_wy7jo") [node name="TimelinePanel" type="Panel" parent="SequencerPanel"] @@ -336,6 +354,14 @@ grow_vertical = 2 [node name="HelenHouseMovementRows" parent="SequencerPanel/TimelinePanel/InvisibleMask/RowsHandle" instance=ExtResource("12_20noo")] layout_mode = 1 +[node name="VSeparator" type="VSeparator" parent="SequencerPanel/TimelinePanel"] +layout_mode = 1 +anchors_preset = -1 +anchor_bottom = 1.0 +offset_left = 398.0 +offset_right = 4.0 +grow_vertical = 2 + [node name="HelenHouseFlyout" parent="." instance=ExtResource("13_wy7jo")] layout_mode = 1 anchors_preset = -1 @@ -395,8 +421,9 @@ Play/Pause: Space Play Reverse: Shift + Space Fast Forward: Shift + Right Arrow Fast Reverse: Shift + Left -Skip Forward: Right Arrow -Skip Backward: Left Arrow +Step Forward: Right Arrow +Step Backward: Left Arrow +Go to start of showtape: Home Change Camera Angle: Tab" horizontal_alignment = 1 vertical_alignment = 1 @@ -472,6 +499,15 @@ expand_mode = 2 [connection signal="pressed" from="MenuBar/ControlsButton" to="." method="_on_controls_button_pressed"] [connection signal="pressed" from="MenuBar/CreditsButton" to="." method="_on_credits_button_pressed"] +[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/StepBackwardsButton" to="." method="_on_step_backwards_button_pressed"] +[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/FastBackwardsButton" to="." method="_on_fast_backwards_button_pressed"] +[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/PlayBackwardsButton" to="." method="_on_play_backwards_button_pressed"] +[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/PauseButton" to="." method="_on_pause_button_pressed"] +[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/StopButton" to="." method="_on_stop_button_pressed"] +[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/PlayButton" to="." method="_on_play_button_pressed"] +[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/FastForwardButton" to="." method="_on_fast_forward_button_pressed"] +[connection signal="pressed" from="SequencerPanel/TransportControls/Centered/StepForwardButton" to="." method="_on_step_forward_button_pressed"] +[connection signal="pressed" from="SequencerPanel/TransportControls/RecordButton" to="." method="_on_record_button_pressed"] [connection signal="value_changed" from="SequencerPanel/TimelinePanel/VScrollBar" to="." method="_on_v_scroll_bar_value_changed"] [connection signal="pressed" from="ControlsScreen/InputEater" to="." method="_on_controls_input_eater_pressed"] [connection signal="pressed" from="CreditsScreen/InputEater" to="." method="_on_credits_input_eater_pressed"] diff --git a/Scripts/EditorScreen.gd b/Scripts/EditorScreen.gd index 571c16f..7e89172 100644 --- a/Scripts/EditorScreen.gd +++ b/Scripts/EditorScreen.gd @@ -1,5 +1,24 @@ extends Control +var playing : bool = false +var recording : bool = false +var index : int = 0 +var playback_rate : int = 1 + +signal step_forward() +signal step_backward() +signal start_recording() +signal end_recording() +signal return_to_zero() + +func update_time_label() -> void: + var frames = index % 60 + var seconds = floori(index/60) % 60 + var minutes = floori(index/360) % 60 + var hours = floori(index/7200) + $SequencerPanel/TransportControls/TimeLabel.text = "%d:%02d:%02d:%02d" % [hours, minutes, seconds, frames] + #$SequencerPanel/TransportControls/TimeLabel.text = str(index) + func _ready() -> void: get_tree().get_root().size_changed.connect(_on_size_changed) @@ -8,6 +27,12 @@ func _input(event: InputEvent) -> void: $CameraPreview.visible = !$CameraPreview.visible; $CameraFullScreen.visible = !$CameraFullScreen.visible; +func _physics_process(_delta: float) -> void: + if (playing || recording): + step_forward.emit() + index += 1 + update_time_label() + func _on_size_changed() -> void: $SubViewport.size = $ColorRect.size @@ -25,3 +50,63 @@ func _on_credits_input_eater_pressed() -> void: func _on_v_scroll_bar_value_changed(value: float) -> void: $SequencerPanel/TimelinePanel/InvisibleMask/RowsHandle.position.y = value * -44 + + +func _on_play_button_pressed() -> void: + playback_rate = 1 + playing = true + recording = false + end_recording.emit() + +func _on_pause_button_pressed() -> void: + playing = false + recording = false + end_recording.emit() + +func _on_play_backwards_button_pressed() -> void: + playback_rate = -1 + playing = true + recording = false + end_recording.emit() + +func _on_fast_backwards_button_pressed() -> void: + playback_rate = -2 + playing = true + recording = false + end_recording.emit() + +func _on_step_backwards_button_pressed() -> void: + playing = false + recording = false + end_recording.emit() + step_backward.emit() + if (index != 0): index -= 1 + update_time_label() + +func _on_fast_forward_button_pressed() -> void: + playback_rate = 2 + playing = true + recording = false + end_recording.emit() + +func _on_step_forward_button_pressed() -> void: + playing = false + recording = false + end_recording.emit() + step_forward.emit() + index += 1 + update_time_label() + +func _on_record_button_pressed() -> void: + playback_rate = 1 + playing = false + recording = true + start_recording.emit() + +func _on_stop_button_pressed() -> void: + playing = false + recording = false + index = 0 + end_recording.emit() + return_to_zero.emit() + update_time_label() diff --git a/Scripts/MovementFrameIndicator.gd b/Scripts/MovementFrameIndicator.gd new file mode 100644 index 0000000..67590fe --- /dev/null +++ b/Scripts/MovementFrameIndicator.gd @@ -0,0 +1,6 @@ +extends Control + +@export var x_offset : int = 0 + +func _ready() -> void: + self.size.x += x_offset diff --git a/Scripts/MovementFrameIndicator.gd.uid b/Scripts/MovementFrameIndicator.gd.uid new file mode 100644 index 0000000..ce8fc88 --- /dev/null +++ b/Scripts/MovementFrameIndicator.gd.uid @@ -0,0 +1 @@ +uid://b4qincechbf63 diff --git a/Scripts/MovementRow.gd b/Scripts/MovementRow.gd index 65d3ccd..51adffa 100644 --- a/Scripts/MovementRow.gd +++ b/Scripts/MovementRow.gd @@ -1,21 +1,84 @@ extends Panel -@export var movement_bit : int = 0; +@export var movement_bit : int = 0 @export var movement_name : String = "Name" @export var flow_path : String = "../../../../../../HelenHouseFlyout/FlowControls/" -@export var recording : bool = false -@export var current_index : int = 0; +@export var animatronic_path : String = "../../../../../../SubViewport/HelenHouse/3stHelen" +@export var movements : Array[bool] var in_flow : float = 1.0 var out_flow : float = 1.0 var key_binding : InputEventKey = InputEventKey.new() +var current_index : int = 0 var binding : bool = false var held_on_previous_frame : bool = false +var playback_held_on_previous_frame : bool = false +var etching: bool = false +var recording : bool = false +var playing : bool = true signal movement_in(movement, rate) signal movement_out(movement, rate) +func set_at_current() -> void: + if (current_index > self.movements.size()-1): self.movements.append(true) + else: self.movements.set(current_index, true) + var indicator = load("res://Scenes/GUI/Controls/MovementFrameIndicatorOn.tscn") + var instance = indicator.instantiate() + instance.x_offset = current_index * 2 + $MovementsBG/InvisibleMask/MovementsHandle.add_child(instance) + +func unset_at_current() -> void: + if (current_index > self.movements.size()-1): self.movements.append(false) + else: self.movements.set(current_index, false) + var indicator = load("res://Scenes/GUI/Controls/MovementFrameIndicatorOff.tscn") + var instance = indicator.instantiate() + instance.x_offset = current_index * 2 + $MovementsBG/InvisibleMask/MovementsHandle.add_child(instance) + +func check_at_current() -> bool: + if (current_index > self.movements.size()-1): return false + var out = self.movements.get(current_index) + if (out == null): return false + return out + +func _step_forward(): + if (recording && etching): set_at_current() + elif (recording && !etching): unset_at_current() + if (playing): + if (check_at_current()): + if (!playback_held_on_previous_frame): + movement_in.emit(movement_name, in_flow) + playback_held_on_previous_frame = true; + else: + if (playback_held_on_previous_frame): + movement_out.emit(movement_name, out_flow) + playback_held_on_previous_frame = false; + current_index += 1 + $MovementsBG/InvisibleMask/MovementsHandle.position.x -= 2 + +func _step_backward(): + if (current_index == 0): return + current_index -= 1 + $MovementsBG/InvisibleMask/MovementsHandle.position.x += 2 + +func _return_to_zero(): + current_index = 0 + $MovementsBG/InvisibleMask/MovementsHandle.position.x = 120 + +func _start_recording(): + recording = true + +func _end_recording(): + recording = false + +func _start_playback(): + playing = true + +func _end_playback(): + playing = false + func update_text() -> void: $Button.text = "%d - %s (%s)" % [movement_bit, movement_name, key_binding.as_text() if key_binding.keycode != 0 else "Unbound"] @@ -26,7 +89,7 @@ func _update_out_flow(new_value: float) -> void: out_flow = new_value func _ready() -> void: - var animatronic = get_node("../../../../../../SubViewport/HelenHouse/3stHelen") + var animatronic = get_node(animatronic_path) if (flow_path != "None"): var if_node = get_node(flow_path + "InFlows/" + movement_name.replace(" ", "") + "Flow") var of_node = get_node(flow_path + "OutFlows/" + movement_name.replace(" ", "") + "Flow") @@ -38,9 +101,15 @@ func _ready() -> void: movement_out.connect(animatronic._movement_out) movement_in.connect(self._movement_in) movement_out.connect(self._movement_out) + var editor = get_node("../../../../../../") + editor.step_forward.connect(_step_forward) + editor.step_backward.connect(_step_backward) + editor.start_recording.connect(_start_recording) + editor.end_recording.connect(_end_recording) + editor.return_to_zero.connect(_return_to_zero) update_text() -func _process(delta: float) -> void: +func _process(_delta: float) -> void: if (binding): return if (Input.is_key_pressed(key_binding.keycode)): if (!held_on_previous_frame): @@ -51,14 +120,15 @@ func _process(delta: float) -> void: movement_out.emit(movement_name, out_flow) held_on_previous_frame = false; -func _movement_in(movement, rate): +func _movement_in(_movement, _rate): $ActiveBG.visible = true + if (recording): etching = true -func _movement_out(movement, rate): +func _movement_out(_movement, _rate): $ActiveBG.visible = false + etching = false func _on_button_pressed() -> void: - if (recording): return if (binding): update_text() binding = false @@ -67,7 +137,7 @@ func _on_button_pressed() -> void: $Button.text = "Press a key to bind." binding = true else: - key_binding.keycode = 0 + key_binding.keycode = KEY_NONE update_text() func _input(event: InputEvent) -> void: diff --git a/UI/SkipBackwards.png b/UI/SkipBackwards.png index 4d5befc..f3e1d5a 100644 Binary files a/UI/SkipBackwards.png and b/UI/SkipBackwards.png differ diff --git a/UI/SkipForward.png b/UI/SkipForward.png index 270f680..29c5dec 100644 Binary files a/UI/SkipForward.png and b/UI/SkipForward.png differ diff --git a/project.godot b/project.godot index 1e23040..4ef3b9f 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="Pneumatic Plaything" -config/version="v0.1" +config/version="v0.2" run/main_scene="uid://oiehbor0dlqx" config/features=PackedStringArray("4.4", "GL Compatibility") boot_splash/show_image=false @@ -54,61 +54,28 @@ sequencer_fast_reverse={ , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } -sequencer_skip_forward={ +sequencer_step_forward={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":10,"pressure":0.0,"pressed":true,"script":null) ] } -sequencer_skip_backward={ +sequencer_step_backward={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":9,"pressure":0.0,"pressed":true,"script":null) ] } -camera_angle_1={ +cycle_camera_angle={ "deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":49,"key_label":0,"unicode":49,"location":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":false,"script":null) ] } -camera_angle_2={ +sequencer_home={ "deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":50,"key_label":0,"unicode":50,"location":0,"echo":false,"script":null) -] -} -camera_angle_3={ -"deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":51,"key_label":0,"unicode":51,"location":0,"echo":false,"script":null) -] -} -camera_angle_4={ -"deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":52,"key_label":0,"unicode":52,"location":0,"echo":false,"script":null) -] -} -camera_angle_5={ -"deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":53,"key_label":0,"unicode":53,"location":0,"echo":false,"script":null) -] -} -camera_angle_6={ -"deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":54,"key_label":0,"unicode":54,"location":0,"echo":false,"script":null) -] -} -camera_angle_7={ -"deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":55,"key_label":0,"unicode":55,"location":0,"echo":false,"script":null) -] -} -camera_angle_8={ -"deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":56,"key_label":0,"unicode":56,"location":0,"echo":false,"script":null) -] -} -camera_angle_9={ -"deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":57,"key_label":0,"unicode":57,"location":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194317,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":2,"pressure":0.0,"pressed":false,"script":null) ] }