GodotComponentTest/scenes/HexTile3D.cs

148 lines
4.3 KiB
C#

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<MeshInstance>("Mesh");
_staticBody = GetNode<StaticBody>("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<SpatialMaterial>("res://materials/UndefinedTile.tres");
_sandMaterial = GD.Load<SpatialMaterial>("res://materials/SandTile.tres");
_grassMaterial = GD.Load<SpatialMaterial>("res://materials/GrassTile.tres");
_deepGrassMaterial = GD.Load<SpatialMaterial>("res://materials/DeepGrassTile.tres");
Mesh = GetNode<MeshInstance>("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)
// {
//
// }
}