--- /dev/null
+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)
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:
-[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)
[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"]
@onready var _skin = $skin
+@export_category("Appearance")
+@export var color: Color = Color.GOLD
+
@export_category("Movement")
@export var speed = 5.0
@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)
_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
[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)
+]
+}
--- /dev/null
+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())
-[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)