using Godot; using System; public class Player : Entity { // public members public Vector3 TargetPosition = Vector3.Zero; // private members private MovableComponent _movable; private Spatial _geometry; private WorldInfoComponent _worldInfo; private Vector2 _offsetCoord = Vector2.Zero; private GroundMotionComponent _groundMotion; private NavigationComponent _navigationComponent; // Called when the node enters the scene tree for the first time. public override void _Ready() { _groundMotion = new GroundMotionComponent(); _navigationComponent = new NavigationComponent(); _movable = (MovableComponent)FindNode("Movable", false); if (_movable != null) { _movable.Connect("OrientationUpdated", this, nameof(OnOrientationUpdated)); } _geometry = (Spatial)FindNode("Geometry", false); _worldInfo = (WorldInfoComponent)FindNode("WorldInfo", false); } public override void _PhysicsProcess(float delta) { base._PhysicsProcess(delta); // update navigation target here // update physics target Vector3 targetPosition = _worldInfo.TileWorld.GetTileWorldCenterFromOffset(_navigationComponent.currentGoalOffset); // compute physics movement _groundMotion.PhysicsProcess(delta, this, targetPosition, _worldInfo.TileWorld); } public override void _Process(float delta) { if ((_navigationComponent.currentGoalWorld - TargetPosition).LengthSquared() > 0.01) { _navigationComponent.Plan(GlobalTransform.origin, TargetPosition, _worldInfo.TileWorld); } } public void OnPositionUpdated(Vector3 newPosition) { if (_worldInfo != null) { Vector2 new_offset_coord = _worldInfo.TileWorld.WorldToOffsetCoords(newPosition); float tile_height = _worldInfo.TileWorld.GetHeightAtOffset(new_offset_coord); if (_offsetCoord != new_offset_coord) { GD.Print("New offset coord " + new_offset_coord); _offsetCoord = new_offset_coord; } if (_movable != null) { if (_movable.currentPosition.y < tile_height) { _movable.currentPosition.y = tile_height; _movable.currentVelocity.y = 0; } } } Transform transform = Transform; transform.origin = newPosition; Transform = transform; } private void OnOrientationUpdated(float newOrientation) { _geometry.Transform = new Transform(new Quat(Vector3.Up, newOrientation), Vector3.Zero); } }