diff options
author | nokoe <nokoe@mailbox.org> | 2024-06-21 11:57:33 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-23 19:26:07 +0200 |
commit | 194f387b1cc69e632d5a704b1fb2d4df61ac6785 (patch) | |
tree | 3b996f0cda91de1d9efdad5cd9f96fd3969ee497 | |
parent | 316750a2d5326d5786265a6b936732560cba8f38 (diff) | |
download | hurrycurry-194f387b1cc69e632d5a704b1fb2d4df61ac6785.tar hurrycurry-194f387b1cc69e632d5a704b1fb2d4df61ac6785.tar.bz2 hurrycurry-194f387b1cc69e632d5a704b1fb2d4df61ac6785.tar.zst |
add player
-rw-r--r-- | client/project.godot | 43 | ||||
-rw-r--r-- | client/scenes/game.tscn | 7 | ||||
-rw-r--r-- | client/scenes/player.tscn | 12 | ||||
-rw-r--r-- | client/scripts/map.gd | 3 | ||||
-rw-r--r-- | client/scripts/multiplayer.gd | 4 | ||||
-rw-r--r-- | client/scripts/player.gd | 89 | ||||
-rw-r--r-- | client/scripts/tiles/counter.gd | 10 | ||||
-rw-r--r-- | client/scripts/tiles/door.gd | 2 | ||||
-rw-r--r-- | client/scripts/tiles/floor.gd | 1 | ||||
-rw-r--r-- | client/scripts/tiles/wall_tile.gd | 55 |
10 files changed, 213 insertions, 13 deletions
diff --git a/client/project.godot b/client/project.godot new file mode 100644 index 00000000..a473d236 --- /dev/null +++ b/client/project.godot @@ -0,0 +1,43 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="undercooked" +run/main_scene="res://scenes/socket_test.tscn" +config/features=PackedStringArray("4.2", "Forward Plus") +config/icon="res://icon.svg" + +[autoload] + +Multiplayer="*res://scripts/multiplayer.gd" + +[input] + +forward={ +"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":87,"key_label":0,"unicode":119,"echo":false,"script":null) +] +} +backwards={ +"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,"echo":false,"script":null) +] +} +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":65,"key_label":0,"unicode":97,"echo":false,"script":null) +] +} +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":68,"key_label":0,"unicode":100,"echo":false,"script":null) +] +} diff --git a/client/scenes/game.tscn b/client/scenes/game.tscn index 1ac84396..e0a195f1 100644 --- a/client/scenes/game.tscn +++ b/client/scenes/game.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=5 format=3 uid="uid://clsylbmw7jc0s"] +[gd_scene load_steps=6 format=3 uid="uid://clsylbmw7jc0s"] [ext_resource type="PackedScene" uid="uid://bnqujofthaa4h" path="res://scenes/map.tscn" id="1_qt88a"] +[ext_resource type="PackedScene" uid="uid://d30bj2cp1m7gd" path="res://scenes/player.tscn" id="2_cdwnc"] [sub_resource type="PhysicalSkyMaterial" id="PhysicalSkyMaterial_ko0bu"] @@ -28,3 +29,7 @@ shadow_enabled = true [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_h880f") + +[node name="Player" parent="." node_paths=PackedStringArray("map") instance=ExtResource("2_cdwnc")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 2) +map = NodePath("../Map") diff --git a/client/scenes/player.tscn b/client/scenes/player.tscn new file mode 100644 index 00000000..f746e0ec --- /dev/null +++ b/client/scenes/player.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=3 format=3 uid="uid://d30bj2cp1m7gd"] + +[ext_resource type="Script" path="res://scripts/player.gd" id="1_yh3ku"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_4w71x"] + +[node name="Player" type="Node3D"] +script = ExtResource("1_yh3ku") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0.5, 0) +mesh = SubResource("CapsuleMesh_4w71x") diff --git a/client/scripts/map.gd b/client/scripts/map.gd index a88c8cdc..8229bb0d 100644 --- a/client/scripts/map.gd +++ b/client/scripts/map.gd @@ -38,7 +38,8 @@ func update(pos, tile_name, neighbors): instance = Wall.new() "door": instance = Door.new() - _: + var t: + push_error("tile tile %s unknown" % t) instance = Floor.new() var node_name = str(pos) diff --git a/client/scripts/multiplayer.gd b/client/scripts/multiplayer.gd index 7b62907d..d7dd9d1b 100644 --- a/client/scripts/multiplayer.gd +++ b/client/scripts/multiplayer.gd @@ -38,10 +38,10 @@ func _process(_delta): func handle_packet(bytes: PackedByteArray): var decoded = decode_packet(bytes) - + if decoded == null: return - + var packet_type: String = decoded["type"] match packet_type: "init": diff --git a/client/scripts/player.gd b/client/scripts/player.gd new file mode 100644 index 00000000..8296ebad --- /dev/null +++ b/client/scripts/player.gd @@ -0,0 +1,89 @@ +extends Node3D + +const PLAYER_SIZE: float = 0.4 + +@export var map: Node3D + +var facing = Vector2(1, 0) +var velocity = Vector2(0, 0) + +func _physics_process(delta): + var input = Vector2(Input.get_axis("left", "right"), Input.get_axis("forward", "backwards")).normalized() + + if input.length() > 0.1: + facing = lerp_vector2_exp(facing, input, delta * 10.) + + self.rotation.y = facing.angle() + + velocity.x += input.x * delta * 0.5 + velocity.y += input.y * delta * 0.5 + + position = Vector3(position.x + velocity.x, 0, position.z + velocity.y) + + # collide + collide(delta) + + velocity = lerp_vector2_exp(velocity, Vector2(0, 0), delta * 5.) + +func collide(_delta: float): + for i in map.get_children(): + if is_instance_of(i, FullTile): + var tile: FullTile = i + var d = aabb_circle_distance( + tile.position.x, + tile.position.z, + tile.position.x + 1, + tile.position.z + 1, + position.x, + position.z + ) + + if d > PLAYER_SIZE: + continue + + var h = 0.01 + var d_sample_x = aabb_circle_distance( + tile.position.x, + tile.position.z, + tile.position.x + 1, + tile.position.z + 1, + position.x + h, + position.z + ) + var d_sample_y = aabb_circle_distance( + tile.position.x, + tile.position.z, + tile.position.x + 1, + tile.position.z + 1, + position.x, + position.z + h + ) + var grad_x = (d_sample_x - d) / h + var grad_y = (d_sample_y - d) / h + + position.x += (PLAYER_SIZE - d) * grad_x + position.z += (PLAYER_SIZE - d) * grad_y + + var vdotn = (grad_x * velocity.x) + (grad_y * velocity.y) + + velocity.x -= grad_x * vdotn + velocity.y -= grad_y * vdotn + # TODO: Player collisions + +func lerp_vector2_exp(current: Vector2, target: Vector2, delta: float) -> Vector2: + return Vector2( + target.x + (current.x - target.x) * exp( - delta), + target.y + (current.y - target.y) * exp( - delta) + ) + +func aabb_circle_distance( + min_x: float, + min_y: float, + max_x: float, + max_y: float, + px: float, + py: float +) -> float: + var dx = px - max(min_x, min(max_x, px)) + var dy = py - max(min_y, min(max_y, py)) + return sqrt(dx * dx + dy * dy) diff --git a/client/scripts/tiles/counter.gd b/client/scripts/tiles/counter.gd index d8b41804..83872315 100644 --- a/client/scripts/tiles/counter.gd +++ b/client/scripts/tiles/counter.gd @@ -30,7 +30,7 @@ func setup(rename: String, neighbors: Array): var series: int = 0 var last_series: int = 0 var adj: Array = [] - + for i in range(4): if edges[i] == "floor": last_series += 1 @@ -39,14 +39,14 @@ func setup(rename: String, neighbors: Array): series = last_series else: last_series = 0 - + var count = 4 - adj.size() # we can neither find out whether it is an inner corner nor an outer corner - # backsplash + # backsplash if series == 1&&count == 3: facing = adj[0] % 4 - + if edges[(adj[0] + 2) % 4] == "wall": kind = CounterKind.STRAIGHT_BACKSPLASH else: @@ -54,7 +54,7 @@ func setup(rename: String, neighbors: Array): elif series == 2&&count == 2: facing = (adj[0] + 1) % 4 kind = CounterKind.OUTER_CORNER - + turn_facing(facing) func is_counter(tile_name_t) -> bool: diff --git a/client/scripts/tiles/door.gd b/client/scripts/tiles/door.gd index a300977f..0861b09a 100644 --- a/client/scripts/tiles/door.gd +++ b/client/scripts/tiles/door.gd @@ -3,7 +3,7 @@ extends Floor func setup(rename: String, neighbors: Array): super.setup(rename, neighbors) - + var facing = 0 for i in range(4): if tile_name(neighbors[i]) == "door": diff --git a/client/scripts/tiles/floor.gd b/client/scripts/tiles/floor.gd index a8a396c4..70a71c5a 100644 --- a/client/scripts/tiles/floor.gd +++ b/client/scripts/tiles/floor.gd @@ -13,6 +13,7 @@ enum Facing { func setup(rename: String, _neighbors: Array): add_child(load("res://models/prefabs/map/floor_kitchen_small.tscn").instantiate()) base.name = "Base" + base.position += Vector3(0.5, 0, 0.5) add_child(base) self.name = rename diff --git a/client/scripts/tiles/wall_tile.gd b/client/scripts/tiles/wall_tile.gd index d107d73e..f10cc53f 100644 --- a/client/scripts/tiles/wall_tile.gd +++ b/client/scripts/tiles/wall_tile.gd @@ -1,10 +1,59 @@ class_name WallTile extends FullTile +const WALLS: Array = [ + "wall", + "window", + "door" +] + +enum WallKind { + STRAIGHT, + OUTER_CORNER, + T, + CROSS, +} + +var kind: WallKind = WallKind.STRAIGHT +var facing: int = 0 + func setup(rename: String, neighbors: Array): super.setup(rename, neighbors) - var facing = 0 + + var edges = neighbors.duplicate() + + var series: int = 0 + var last_series: int = 0 + var adj: Array = [] + + for i in range(4): + var i_name = tile_name(edges[i]) + if is_wall(i_name): + edges[i] = "wall" + else: + edges[i] = tile_name(edges[i]) + for i in range(4): - if neighbors[i] != null&&tile_name(neighbors[i]) != "wall": - facing = i + if edges[i] != "wall": + last_series += 1 + adj.append(i) + if last_series > series: + series = last_series + else: + last_series = 0 + + var count = 4 - adj.size() + + if series == 1&&count == 2: + facing = adj[0] + kind = WallKind.STRAIGHT + elif series == 2&&count == 2: + facing = adj[0] + kind = WallKind.OUTER_CORNER + elif series == 1&&count == 3: + facing = adj[0] + kind = WallKind.T + elif series == 0&&count == 4: + facing = adj[0] + kind = WallKind.CROSS turn_facing(facing) |