From: Clifton Palmer Date: Thu, 19 Dec 2024 18:13:57 +0000 (+0200) Subject: Squashed commit of the following: X-Git-Tag: 0.9.0~6 X-Git-Url: http://git.purplebirdman.com/lightcycles.git/commitdiff_plain/641c10419faa820148a6939ae3c24db13ee749e1?ds=sidebyside Squashed commit of the following: * Added splitscreen * Can pick player colors * Added additional player input mapping --- diff --git a/map/split_screen_container.gd b/map/split_screen_container.gd new file mode 100644 index 0000000..b5fc1bc --- /dev/null +++ b/map/split_screen_container.gd @@ -0,0 +1,14 @@ +class_name SplitScreenContainer +extends GridContainer + + +@onready var viewport1: SubViewport = $SubViewportContainer/SubViewport +@onready var viewport2: SubViewport = $SubViewportContainer2/SubViewport2 + + +func set_splitscreen(players: Array[Player]) -> void: + var viewports = [viewport1, viewport2] + for player in players: + var camera_rid = player.get_camera_rid() + var viewport_rid = viewports.pop_front().get_viewport_rid() + RenderingServer.viewport_attach_camera(viewport_rid, camera_rid) diff --git a/map/world.gd b/map/world.gd index bd73e20..32f1a7c 100644 --- a/map/world.gd +++ b/map/world.gd @@ -1,12 +1,32 @@ extends Node3D +@onready var _screen: SplitScreenContainer = $SplitScreenContainer + var _player_wall_tscn = preload("res://player/player_wall.tscn") var _player_wall_map = {} +var _input_map = [ + { + "left": "player1_left", + "right": "player1_right", + "restart": "player1_restart" + }, + { + "left": "player2_left", + "right": "player2_right", + "restart": "player2_restart" + } +] func _ready() -> void: - _player_add_wall($player) + var players: Array[Player] = [$Player1, $Player2] + + _screen.set_splitscreen(players) + + for player in players: + _player_add_wall(player) + player.set_input_map(_input_map.pop_front()) func _input(event: InputEvent) -> void: diff --git a/map/world.tscn b/map/world.tscn index 6cc47f7..3e4ccba 100644 --- a/map/world.tscn +++ b/map/world.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=9 format=3 uid="uid://6tmryoxhs3yq"] +[gd_scene load_steps=10 format=3 uid="uid://6tmryoxhs3yq"] [ext_resource type="PackedScene" uid="uid://dysxftv7xniv0" path="res://player/player.tscn" id="1_3tqxd"] [ext_resource type="Script" path="res://map/world.gd" id="1_mjcfj"] [ext_resource type="Texture2D" uid="uid://cp8pv6wya3ep2" path="res://textures/untextured.png" id="2_sxhh7"] +[ext_resource type="Script" path="res://map/split_screen_container.gd" id="4_nc5g8"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ul8mq"] albedo_color = Color(0.199732, 0.199732, 0.199732, 1) @@ -83,10 +84,49 @@ skeleton = NodePath("../..") [node name="CollisionShape3D" type="CollisionShape3D" parent="map/wall4/StaticBody3D"] shape = SubResource("ConcavePolygonShape3D_qttgn") -[node name="player" parent="." instance=ExtResource("1_3tqxd")] +[node name="Player1" parent="." instance=ExtResource("1_3tqxd")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -16) distance = 5.0 -[connection signal="playerDestroyed" from="player" to="." method="_on_player_destroyed"] -[connection signal="playerRestart" from="player" to="." method="_on_player_player_restart"] -[connection signal="playerTurn" from="player" to="." method="_player_add_wall"] +[node name="Player2" parent="." instance=ExtResource("1_3tqxd")] +transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 16) +color = Color(1, 0, 0, 1) +distance = 5.0 + +[node name="SplitScreenContainer" type="GridContainer" parent="."] +custom_minimum_size = Vector2(3456, 1944) +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("4_nc5g8") + +[node name="SubViewportContainer" type="SubViewportContainer" parent="SplitScreenContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +stretch = true + +[node name="SubViewport" type="SubViewport" parent="SplitScreenContainer/SubViewportContainer"] +handle_input_locally = false +size = Vector2i(3456, 970) +render_target_update_mode = 4 + +[node name="SubViewportContainer2" type="SubViewportContainer" parent="SplitScreenContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +stretch = true + +[node name="SubViewport2" type="SubViewport" parent="SplitScreenContainer/SubViewportContainer2"] +handle_input_locally = false +size = Vector2i(3456, 970) +render_target_update_mode = 4 + +[connection signal="playerDestroyed" from="Player1" to="." method="_on_player_destroyed"] +[connection signal="playerRestart" from="Player1" to="." method="_on_player_player_restart"] +[connection signal="playerTurn" from="Player1" to="." method="_player_add_wall"] +[connection signal="playerDestroyed" from="Player2" to="." method="_on_player_destroyed"] +[connection signal="playerRestart" from="Player2" to="." method="_on_player_player_restart"] +[connection signal="playerTurn" from="Player2" to="." method="_player_add_wall"] diff --git a/player/player.gd b/player/player.gd index c71d952..ed5bba0 100644 --- a/player/player.gd +++ b/player/player.gd @@ -10,6 +10,9 @@ signal playerRestart @onready var _skin = $skin +@export_category("Appearance") +@export var color: Color = Color.GOLD + @export_category("Movement") @export var speed = 5.0 @@ -18,24 +21,29 @@ signal playerRestart @onready var _springArm = $SpringArm3D +@onready var _camera = $SpringArm3D/Camera3D enum state {ALIVE, DEAD} var _state = state.ALIVE +var _input_map = null + + func _ready() -> void: _springArm.spring_length = distance + _skin.set_color(color) func _input(event: InputEvent) -> void: if _state == state.ALIVE: - if event.is_action_pressed("player_left"): + if event.is_action_pressed(_input_map.left): global_rotate(Vector3.UP, PI/2) playerTurn.emit(self) - elif event.is_action_pressed("player_right"): + elif event.is_action_pressed(_input_map.right): global_rotate(Vector3.UP, -PI/2) playerTurn.emit(self) else: - if event.is_action_pressed("player_restart"): + if event.is_action_pressed(_input_map.restart): playerRestart.emit(self) @@ -51,3 +59,11 @@ func _explode() -> void: _skin.visible = false _state = state.DEAD playerDestroyed.emit(self) + + +func get_camera_rid() -> RID: + return _camera.get_camera_rid() + + +func set_input_map(input_map) -> void: + _input_map = input_map diff --git a/project.godot b/project.godot index a8253b7..2e6aab3 100644 --- a/project.godot +++ b/project.godot @@ -26,28 +26,53 @@ wall_origin="" [input] -player_left={ +player1_left={ "deadzone": 0.5, "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":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) ] } -player_right={ +player1_right={ "deadzone": 0.5, "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":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null) ] } -player_forward={ +player1_up={ "deadzone": 0.5, "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":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null) ] } -player_backward={ +player1_down={ "deadzone": 0.5, "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":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) ] } -player_restart={ +player1_restart={ "deadzone": 0.5, "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":82,"key_label":0,"unicode":114,"location":0,"echo":false,"script":null) ] } +player2_left={ +"deadzone": 0.5, +"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) +] +} +player2_right={ +"deadzone": 0.5, +"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) +] +} +player2_up={ +"deadzone": 0.5, +"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":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +player2_down={ +"deadzone": 0.5, +"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":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +player2_restart={ +"deadzone": 0.5, +"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":47,"key_label":0,"unicode":47,"location":0,"echo":false,"script":null) +] +} diff --git a/skins/bike/bike.gd b/skins/bike/bike.gd new file mode 100644 index 0000000..96a1564 --- /dev/null +++ b/skins/bike/bike.gd @@ -0,0 +1,19 @@ +class_name BikeSkin +extends Node3D + + +@export_category("Material") +@export var _color: Color = Color.GOLD + + +@onready var mesh: MeshInstance3D = $Cylinder_001 + + +func _ready() -> void: + set_color(_color) + + +func set_color(color: Color) -> void: + var material = mesh.get_active_material(0) + material.albedo_color = color + mesh.set_surface_override_material(0, material.duplicate()) diff --git a/skins/bike/bike.tscn b/skins/bike/bike.tscn index c2190bf..876dc6a 100644 --- a/skins/bike/bike.tscn +++ b/skins/bike/bike.tscn @@ -1,8 +1,10 @@ -[gd_scene load_steps=2 format=3 uid="uid://d13jnq5vpvhl0"] +[gd_scene load_steps=3 format=3 uid="uid://d13jnq5vpvhl0"] [ext_resource type="PackedScene" uid="uid://4k4cakwd4deq" path="res://skins/bike/bike.glb" id="1_oaqa0"] +[ext_resource type="Script" path="res://skins/bike/bike.gd" id="2_ycudv"] [node name="bike" instance=ExtResource("1_oaqa0")] +script = ExtResource("2_ycudv") [node name="Cylinder_001" parent="." index="0"] transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)