diff --git a/Nodes/RemotePathFollow2D.cs b/Nodes/RemotePathFollow2D.cs new file mode 100644 index 0000000..203e273 --- /dev/null +++ b/Nodes/RemotePathFollow2D.cs @@ -0,0 +1,53 @@ +using Godot; + +public partial class RemotePathFollow2D : Path2D +{ + [Export] public Node2D Target { get; set; } = null; + [Export] public double Speed { get; set; } = 1; + + public bool Started => _started; + public bool Finished => _pathFollowNode.ProgressRatio >= 1; + + private PathFollow2D _pathFollowNode = new PathFollow2D(); + + private bool _started = true; + private Vector2 _startingPosition; + + public RemotePathFollow2D() { } + public RemotePathFollow2D(Node2D target) => Target = target; + public RemotePathFollow2D(float speed) => Speed = speed; + public RemotePathFollow2D(Node2D target, float speed) => (Target, Speed) = (target, speed); + + public override void _Ready() + { + base._Ready(); + + _pathFollowNode.Loop = false; + _pathFollowNode.CubicInterp = false; + + AddChild(_pathFollowNode); + } + + public override void _Process(double delta) + { + base._Process(delta); + } + + public override void _PhysicsProcess(double delta) + { + base._Process(delta); + + if (Started) + { + _pathFollowNode.Progress += (float)(Speed * delta); + Target.Position = _startingPosition + _pathFollowNode.Position; + } + + } + + public void Start() + { + _startingPosition = Target.Position; + _started = true; + } +} diff --git a/Nodes/RemotePathFollow2D.cs.uid b/Nodes/RemotePathFollow2D.cs.uid new file mode 100644 index 0000000..5f23c44 --- /dev/null +++ b/Nodes/RemotePathFollow2D.cs.uid @@ -0,0 +1 @@ +uid://n8kpn7lhard2 diff --git a/Scenes/basemap.tscn b/Scenes/basemap.tscn index 5601039..1586c27 100644 --- a/Scenes/basemap.tscn +++ b/Scenes/basemap.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=9 format=4 uid="uid://clilwruw7ln4w"] +[gd_scene load_steps=10 format=4 uid="uid://clilwruw7ln4w"] [ext_resource type="Texture2D" uid="uid://cbioy3k1erth7" path="res://Assets/Tilemaps/Tilemap/tilemap.png" id="1_8871w"] [ext_resource type="Script" uid="uid://dtco6yt3nhgrp" path="res://Scripts/Mob.cs" id="2_tsg1g"] +[ext_resource type="Script" uid="uid://rmyjvxdhcw4r" path="res://Scripts/Floor.cs" id="2_vd8ro"] [ext_resource type="Texture2D" uid="uid://blpkbnd2ginn0" path="res://Assets/Tilemaps/Tiles/tile_0084.png" id="3_vd8ro"] [ext_resource type="Texture2D" uid="uid://bdhcy1gn7fnhp" path="res://Assets/Tilemaps/Tiles/tile_0121.png" id="4_lcu17"] @@ -153,42 +154,43 @@ size = Vector2(16, 16) [node name="Node2D" type="Node2D"] scale = Vector2(4, 4) -[node name="TileMap" type="TileMap" parent="."] -tile_set = SubResource("TileSet_fqbyx") -format = 2 - -[node name="Floor" type="TileMapLayer" parent="TileMap"] +[node name="Floor" type="TileMapLayer" parent="." node_paths=PackedStringArray("MovementTarget")] use_parent_material = true tile_map_data = PackedByteArray("AAAHAAQAAAAAAAAAAAAIAAQAAAACAAQAAAAJAAQAAAAAAAAAAAAKAAQAAAACAAQAAAALAAQAAAAAAAAAAAAMAAQAAAADAAQAAAAHAAUAAAAAAAQAAAAIAAUAAAAAAAAAAAAJAAUAAAAAAAQAAAAKAAUAAAAAAAAAAAALAAUAAAAAAAQAAAAMAAUAAAAAAAAAAAANAAQAAAAAAAAAAAAOAAQAAAAAAAQAAAAPAAQAAAAAAAAAAAAQAAQAAAAEAAQAAAANAAUAAAAAAAQAAAAOAAUAAAAAAAIAAAAPAAUAAAAAAAQAAAAQAAUAAAAAAAAAAAAQAAYAAAAAAAQAAAAQAAcAAAAAAAAAAAAQAAgAAAAAAAQAAAAQAAkAAAAAAAAAAAAQAAoAAAAAAAQAAAAQAAsAAAAAAAIAAAAQAAwAAAAAAAQAAAAQAA0AAAAAAAAAAAAPAA0AAAAGAAMAAAAOAA0AAAAAAAAAAAANAA0AAAAAAAQAAAAMAA0AAAAAAAAAAAALAA0AAAAAAAQAAAAKAA0AAAAAAAEAAAAJAA0AAAAAAAQAAAAIAA0AAAAAAAAAAAAHAA0AAAAAAAQAAAAHAAwAAAAAAAAAAAAHAAsAAAAAAAQAAAAHAAoAAAAAAAAAAAAHAAkAAAAAAAQAAAAHAAgAAAAAAAAAAAAHAAcAAAAFAAQAAAAHAAYAAAAAAAAAAAAIAAYAAAAAAAQAAAAJAAYAAAAAAAEAAAAKAAYAAAAAAAQAAAALAAYAAAAAAAAAAAAMAAYAAAAAAAQAAAANAAYAAAAAAAAAAAAOAAYAAAAAAAQAAAAPAAYAAAAAAAAAAAAPAAcAAAAAAAQAAAAPAAgAAAAAAAAAAAAPAAkAAAAAAAQAAAAPAAoAAAAAAAAAAAAPAAsAAAAAAAQAAAAPAAwAAAAAAAAAAAAOAAwAAAAAAAQAAAANAAwAAAAAAAAAAAAMAAwAAAAAAAQAAAALAAwAAAAAAAAAAAAKAAwAAAABAAQAAAAJAAwAAAAAAAAAAAAIAAwAAAAAAAQAAAAIAAsAAAAAAAAAAAAIAAoAAAABAAQAAAAIAAkAAAAAAAAAAAAIAAgAAAAAAAQAAAAIAAcAAAAAAAAAAAAJAAcAAAAAAAQAAAAKAAcAAAAAAAAAAAALAAcAAAAAAAQAAAAMAAcAAAAAAAAAAAANAAcAAAABAAQAAAAOAAcAAAAAAAAAAAAOAAgAAAAAAAQAAAAOAAkAAAAAAAAAAAAOAAoAAAABAAQAAAAOAAsAAAAAAAAAAAANAAsAAAABAAQAAAAMAAsAAAAAAAAAAAALAAsAAAAAAAQAAAAKAAsAAAAAAAAAAAAJAAsAAAAAAAQAAAAJAAoAAAAAAAAAAAAJAAkAAAABAAQAAAAKAAkAAAAAAAAAAAALAAkAAAAAAAQAAAAMAAkAAAAAAAAAAAANAAkAAAAAAAQAAAANAAoAAAAAAAIAAAAMAAoAAAAAAAQAAAALAAoAAAAAAAAAAAAKAAoAAAAAAAQAAAAJAAgAAAAAAAAAAAAKAAgAAAAAAAQAAAALAAgAAAAAAAAAAAAMAAgAAAAAAAQAAAANAAgAAAAAAAAAAAA=") tile_set = SubResource("TileSet_fqbyx") +script = ExtResource("2_vd8ro") +MovementTarget = NodePath("Mob") +MovementSpeed = 20.0 -[node name="Mob" type="CharacterBody2D" parent="."] -position = Vector2(168, 104) +[node name="Mob" type="CharacterBody2D" parent="Floor"] +position = Vector2(167.75, 103.75) script = ExtResource("2_tsg1g") -[node name="Sprite2D" type="Sprite2D" parent="Mob"] +[node name="Sprite2D" type="Sprite2D" parent="Floor/Mob"] texture = ExtResource("3_vd8ro") metadata/_edit_lock_ = true -[node name="CollisionShape2D" type="CollisionShape2D" parent="Mob"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="Floor/Mob"] shape = SubResource("RectangleShape2D_fqbyx") metadata/_edit_lock_ = true -[node name="Navigation" type="Node2D" parent="Mob"] +[node name="Navigation" type="Node2D" parent="Floor/Mob"] -[node name="NavigationAgent2D" type="NavigationAgent2D" parent="Mob/Navigation"] +[node name="NavigationAgent2D" type="NavigationAgent2D" parent="Floor/Mob/Navigation"] -[node name="Timer" type="Timer" parent="Mob/Navigation"] +[node name="Timer" type="Timer" parent="Floor/Mob/Navigation"] wait_time = 0.1 autostart = true -[node name="TargetMob" type="CharacterBody2D" parent="."] +[node name="TargetMob" type="CharacterBody2D" parent="Floor"] position = Vector2(232, 184) -[node name="Sprite2D" type="Sprite2D" parent="TargetMob"] +[node name="Sprite2D" type="Sprite2D" parent="Floor/TargetMob"] texture = ExtResource("4_lcu17") metadata/_edit_lock_ = true -[node name="CollisionShape2D" type="CollisionShape2D" parent="TargetMob"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="Floor/TargetMob"] shape = SubResource("RectangleShape2D_vuqrp") metadata/_edit_lock_ = true + +[connection signal="RequestMovement" from="Floor/Mob" to="Floor" method="_on_mob_request_movement"] diff --git a/Scripts/Floor.cs b/Scripts/Floor.cs new file mode 100644 index 0000000..71800b2 --- /dev/null +++ b/Scripts/Floor.cs @@ -0,0 +1,65 @@ +using Godot; +using Godot.Collections; + +public partial class Floor : TileMapLayer +{ + [Export] public Mob MovementTarget { get; set; } + [Export] public float MovementSpeed { get; set; } + + private RemotePathFollow2D _movementPathNode = null; + + private AStarGrid2D _directionFinder; + + public override void _Ready() + { + base._Ready(); + + MovementTarget.RequestMovement += _HandleMoveRequest; + + _directionFinder = new AStarGrid2D(); + _directionFinder.Region = GetUsedRect(); + _directionFinder.Update(); + + Array path = _directionFinder.GetIdPath(GetUsedRect().Position, GetUsedRect().Position + new Vector2I(5, 3)); + Line2D line = new Line2D(); + line.ZIndex = 5; + foreach (Vector2I point in path) + { + line.AddPoint(MapToLocal(point)); + } + //AddChild(line); + } + + public override void _Process(double delta) + { + base._Process(delta); + + if (_movementPathNode is { Finished: true }) + { + _movementPathNode.QueueFree(); + _movementPathNode = null; + } + } + + private void _HandleMoveRequest(Vector2I direction) + { + + if (direction == Vector2I.Zero || _movementPathNode != null) + { + return; + } + _movementPathNode = new RemotePathFollow2D(MovementTarget, MovementSpeed); + _movementPathNode.Curve = _curveToPoint(MapToLocal(direction) - MapToLocal(Vector2I.Zero)); + _movementPathNode.Start(); + + AddChild(_movementPathNode); + } + + private Curve2D _curveToPoint(Vector2 point) + { + Curve2D curve = new Curve2D(); + curve.AddPoint(Vector2.Zero); + curve.AddPoint(point); + return curve; + } +} diff --git a/Scripts/Floor.cs.uid b/Scripts/Floor.cs.uid new file mode 100644 index 0000000..0b44001 --- /dev/null +++ b/Scripts/Floor.cs.uid @@ -0,0 +1 @@ +uid://rmyjvxdhcw4r diff --git a/Scripts/Mob.cs b/Scripts/Mob.cs index e4eb7a4..f71a288 100644 --- a/Scripts/Mob.cs +++ b/Scripts/Mob.cs @@ -1,14 +1,17 @@ using Godot; -using System; public partial class Mob : CharacterBody2D { + [Signal] + public delegate void RequestMovementEventHandler(Vector2I direction); + [Export] public CharacterBody2D target = null; public int speed = 100; public NavigationAgent2D navAgent; + public override void _Ready() { navAgent = GetNode("Navigation/NavigationAgent2D"); @@ -16,6 +19,7 @@ public partial class Mob : CharacterBody2D public override void _Process(double delta) { - this.MoveLocalX(0.5f); + Vector2 direction = Input.GetVector("left","right", "up", "down"); + EmitSignalRequestMovement(new Vector2I((int)direction.X, (int)direction.Y)); } } diff --git a/project.godot b/project.godot index e8b8ea5..13d84ac 100644 --- a/project.godot +++ b/project.godot @@ -24,6 +24,29 @@ window/size/viewport_height=1080 project/assembly_name="AutoChessProject" +[input] + +left={ +"deadzone": 0.2, +"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) +] +} +right={ +"deadzone": 0.2, +"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) +] +} +up={ +"deadzone": 0.2, +"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) +] +} +down={ +"deadzone": 0.2, +"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) +] +} + [rendering] textures/canvas_textures/default_texture_filter=0