using System.Diagnostics; 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); [Signal] delegate void TileHovered(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 MeshInstance Mesh; 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"); Mesh = GetNode("Mesh"); Debug.Assert(Mesh != null); 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; EmitSignal("TileHovered", this); // 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) // { // // } }