]> Untitled Git - lightcycles.git/commitdiff
Squashed commit of the following:
authorClifton Palmer <clifton.james.palmer@protonmail.com>
Thu, 19 Dec 2024 18:13:57 +0000 (20:13 +0200)
committerClifton Palmer <clifton.james.palmer@protonmail.com>
Thu, 19 Dec 2024 18:13:57 +0000 (20:13 +0200)
    * Added splitscreen
    * Can pick player colors
    * Added additional player input mapping

map/split_screen_container.gd [new file with mode: 0644]
map/world.gd
map/world.tscn
player/player.gd
project.godot
skins/bike/bike.gd [new file with mode: 0644]
skins/bike/bike.tscn

diff --git a/map/split_screen_container.gd b/map/split_screen_container.gd
new file mode 100644 (file)
index 0000000..b5fc1bc
--- /dev/null
@@ -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)
index bd73e20dbec4b254b38307202d8074d6ea634d7a..32f1a7c72379da5ad56613204eb1f2e52e667334 100644 (file)
@@ -1,12 +1,32 @@
 extends Node3D
 
 
 extends Node3D
 
 
+@onready var _screen: SplitScreenContainer = $SplitScreenContainer
+
 var _player_wall_tscn = preload("res://player/player_wall.tscn")
 var _player_wall_map = {}
 
 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:
 
 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:
 
 
 func _input(event: InputEvent) -> void:
index 6cc47f781d3ba1c0491e6f1fb10905b93683b48e..3e4ccbaa14942cd9f0395e6cab7d486773c37ae9 100644 (file)
@@ -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="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)
 
 [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="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
 
 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"]
index c71d9525cf3f9dc95aa1ec6ceb768d96e9c94497..ed5bba0c54fd0256ad6c18e9bae4634d319828b8 100644 (file)
@@ -10,6 +10,9 @@ signal playerRestart
 @onready var _skin = $skin
 
 
 @onready var _skin = $skin
 
 
+@export_category("Appearance")
+@export var color: Color = Color.GOLD
+
 @export_category("Movement") 
 @export var speed = 5.0
 
 @export_category("Movement") 
 @export var speed = 5.0
 
@@ -18,24 +21,29 @@ signal playerRestart
 
 
 @onready var _springArm = $SpringArm3D
 
 
 @onready var _springArm = $SpringArm3D
+@onready var _camera = $SpringArm3D/Camera3D
 
 enum state {ALIVE, DEAD}
 var _state = state.ALIVE
 
 
 enum state {ALIVE, DEAD}
 var _state = state.ALIVE
 
+var _input_map = null
+
+
 func _ready() -> void:
        _springArm.spring_length = distance
 func _ready() -> void:
        _springArm.spring_length = distance
+       _skin.set_color(color)
 
 
 func _input(event: InputEvent) -> void:
        if _state == state.ALIVE:
 
 
 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)
                        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:
                        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)
 
 
                        playerRestart.emit(self)
 
 
@@ -51,3 +59,11 @@ func _explode() -> void:
        _skin.visible = false
        _state = state.DEAD
        playerDestroyed.emit(self)
        _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
index a8253b772e6089897789190d30473b881cb20293..2e6aab3551870005c54f1bc5f45000d0f89c6573 100644 (file)
@@ -26,28 +26,53 @@ wall_origin=""
 
 [input]
 
 
 [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)
 ]
 }
 "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)
 ]
 }
 "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)
 ]
 }
 "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)
 ]
 }
 "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)
 ]
 }
 "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 (file)
index 0000000..96a1564
--- /dev/null
@@ -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())
index c2190bf2fb2b3abbd251c2e04536ca124f8e4469..876dc6a00fb615307fe62f490f6198f5787ae5d1 100644 (file)
@@ -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="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")]
 
 [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)
 
 [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)