using Godot; using System; public class Player : KinematicBody { // other members private MovableComponent _movable; private Spatial _geometry; private WorldInfoComponent _worldInfo; private Vector2 _offsetCoord = Vector2.Zero; // Called when the node enters the scene tree for the first time. public override void _Ready() { _movable = (MovableComponent)FindNode("Movable", false); if (_movable != null) { _movable.Connect("PositionUpdated", this, nameof(OnPositionUpdated)); _movable.Connect("OrientationUpdated", this, nameof(OnOrientationUpdated)); } _geometry = (Spatial)FindNode("Geometry", false); _worldInfo = (WorldInfoComponent)FindNode("WorldInfo", false); } public void OnPositionUpdated(Vector3 newPosition) { if (_worldInfo != null) { Vector2 new_offset_coord = _worldInfo.TileWorld.WorldToOffsetCoords(newPosition); if (_offsetCoord != new_offset_coord) { GD.Print("New offset coord " + new_offset_coord); _offsetCoord = new_offset_coord; } if (_movable != null) { _movable.targetPosition.y = _worldInfo.TileWorld.GetHeightAtOffset(new_offset_coord); } } Transform transform = Transform; transform.origin = newPosition; Transform = transform; } private void OnOrientationUpdated(float newOrientation) { _geometry.Transform = new Transform(new Quat(Vector3.Up, newOrientation), Vector3.Zero); } }