using Godot; public class HexTile3D : Spatial { public enum TileType { Undefined, Sand, Grass, DeepGrass } static public TileType[] ValidTileTypes = { TileType.Sand, TileType.Grass, TileType.DeepGrass }; // scene nodes private MeshInstance _mesh; private StaticBody _staticBody; // signals [Signal] delegate void TileClicked(HexTile3D tile3d); // other member variables private SpatialMaterial _undefinedMaterial; private SpatialMaterial _sandMaterial; private SpatialMaterial _grassMaterial; private SpatialMaterial _deepGrassMaterial; private SpatialMaterial _previousMaterial; private HexGrid _hexGrid; public HexCell Cell = new HexCell(); public bool IsMouseOver = false; public Vector2 OffsetCoords { get { return Cell.OffsetCoords; } set { Cell.OffsetCoords = value; Transform tile3dTransform = Transform; Vector2 cellPlaneCoords = _hexGrid.GetHexCenter(Cell); tile3dTransform.origin.x = cellPlaneCoords.x; tile3dTransform.origin.z = cellPlaneCoords.y; Transform = tile3dTransform; } } private TileType _type; public TileType Type { get { return _type; } set { _type = value; switch (_type) { case TileType.Undefined: _mesh.SetSurfaceMaterial(0, _undefinedMaterial); break; case TileType.Sand: _mesh.SetSurfaceMaterial(0, _sandMaterial); break; case TileType.Grass: _mesh.SetSurfaceMaterial(0, _grassMaterial); break; case TileType.DeepGrass: _mesh.SetSurfaceMaterial(0, _deepGrassMaterial); break; default: GD.Print("Invalid tile type: " + value.ToString()); break; } } } HexTile3D() { _hexGrid = new HexGrid(); } // Called when the node enters the scene tree for the first time. public override void _Ready() { _mesh = GetNode("Mesh"); _staticBody = GetNode("StaticBody"); _staticBody.Connect("input_event", this, nameof(OnAreaInputEvent)); _staticBody.Connect("mouse_entered", this, nameof(OnAreaMouseEntered)); _staticBody.Connect("mouse_exited", this, nameof(OnAreaMouseExited)); _undefinedMaterial = GD.Load("res://materials/UndefinedTile.tres"); _sandMaterial = GD.Load("res://materials/SandTile.tres"); _grassMaterial = GD.Load("res://materials/GrassTile.tres"); _deepGrassMaterial = GD.Load("res://materials/DeepGrassTile.tres"); this.Type = TileType.Undefined; } public void OnAreaInputEvent(Node camera, InputEvent inputEvent, Vector3 position, Vector3 normal, int shapeIndex) { if (IsMouseOver && inputEvent is InputEventMouseButton) { InputEventMouseButton mouseButtonEvent = (InputEventMouseButton)inputEvent; if (mouseButtonEvent.ButtonIndex == 1 && mouseButtonEvent.Pressed) { EmitSignal("TileClicked", this); } } } public void OnAreaMouseEntered() { IsMouseOver = true; _previousMaterial = (SpatialMaterial)_mesh.MaterialOverride; SpatialMaterial clonedMaterial = (SpatialMaterial)_mesh.GetSurfaceMaterial(0).Duplicate(); clonedMaterial.AlbedoColor = new Color(1, 0, 0); _mesh.MaterialOverride = clonedMaterial; } public void OnAreaMouseExited() { IsMouseOver = false; _mesh.MaterialOverride = _previousMaterial; } // // Called every frame. 'delta' is the elapsed time since the previous frame. // public override void _Process(float delta) // { // // } }