using Godot; public partial class GameBoard : Node2D { private PuzzleTile[,] _grid = new PuzzleTile[5, 4]; private PuzzleTile _activeTile; // FIX 1: Use GD.Load and explicitly cast it to (PackedScene) private PackedScene _tileScene = (PackedScene)GD.Load("res://PuzzleTile.tscn"); public override void _Ready() { // FIX 2: Explicitly cast the returned Node to (PuzzleTile) _activeTile = (PuzzleTile)GetNode("PuzzleTile"); _activeTile.GridX = 0; _activeTile.GridY = 0; _grid[0, 0] = _activeTile; SpawnObstacle(4, 0); } private void SpawnObstacle(int x, int y) { // FIX 3: Explicitly cast the instantiated object to (PuzzleTile) PuzzleTile obstacle = (PuzzleTile)_tileScene.Instantiate(); AddChild(obstacle); obstacle.GridX = x; obstacle.GridY = y; obstacle.Position = new Vector2(x * 128, y * 128); obstacle.Modulate = new Color(1, 0, 0); _grid[x, y] = obstacle; } public override void _Process(double delta) { if (_activeTile == null || _activeTile.IsMoving) return; Vector2 direction = Vector2.Zero; if (Input.IsActionJustPressed("ui_right")) direction.X = 1; else if (Input.IsActionJustPressed("ui_left")) direction.X = -1; else if (Input.IsActionJustPressed("ui_down")) direction.Y = 1; else if (Input.IsActionJustPressed("ui_up")) direction.Y = -1; if (direction != Vector2.Zero) { CalculateSlide(_activeTile, (int)direction.X, (int)direction.Y); } } private void CalculateSlide(PuzzleTile tile, int dirX, int dirY) { int testX = tile.GridX; int testY = tile.GridY; while (true) { int nextX = testX + dirX; int nextY = testY + dirY; if (nextX < 0 || nextX >= 5 || nextY < 0 || nextY >= 4) break; if (_grid[nextX, nextY] != null) break; testX = nextX; testY = nextY; } if (testX == tile.GridX && testY == tile.GridY) return; _grid[tile.GridX, tile.GridY] = null; _grid[testX, testY] = tile; tile.SlideTo(testX, testY); } }