Added tile based movement

This commit is contained in:
Patrick 2025-04-15 18:50:18 +02:00
parent e58d6ea0be
commit 1f5149e634
7 changed files with 167 additions and 18 deletions

View File

@ -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;
}
}

View File

@ -0,0 +1 @@
uid://n8kpn7lhard2

View File

@ -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"]

65
Scripts/Floor.cs Normal file
View File

@ -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<Vector2I> 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;
}
}

1
Scripts/Floor.cs.uid Normal file
View File

@ -0,0 +1 @@
uid://rmyjvxdhcw4r

View File

@ -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<NavigationAgent2D>("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));
}
}

View File

@ -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