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 /client/scripts | |
parent | 316750a2d5326d5786265a6b936732560cba8f38 (diff) | |
download | hurrycurry-194f387b1cc69e632d5a704b1fb2d4df61ac6785.tar hurrycurry-194f387b1cc69e632d5a704b1fb2d4df61ac6785.tar.bz2 hurrycurry-194f387b1cc69e632d5a704b1fb2d4df61ac6785.tar.zst |
add player
Diffstat (limited to 'client/scripts')
-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 |
7 files changed, 152 insertions, 12 deletions
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) |