190 lines
7.6 KiB
C#
190 lines
7.6 KiB
C#
using Godot;
|
|
using System;
|
|
using System.Linq;
|
|
using Dictionary = Godot.Collections.Dictionary;
|
|
using Array = Godot.Collections.Array;
|
|
|
|
public class AdaptiveWorldStream : Spatial
|
|
{
|
|
// ui elements
|
|
private Label _framesPerSecondLabel;
|
|
private Label _tileLabel;
|
|
private Label _tileOffsetLabel;
|
|
private Label _numTilesLabel;
|
|
private Label _mouseWorldLabel;
|
|
private Label _mouseTileLabel;
|
|
private Label _numCoordsAddedLabel;
|
|
private Label _numCoordsRemovedLabel;
|
|
|
|
// scene nodes
|
|
private Spatial _tileHighlight;
|
|
private Spatial _mouseTileHighlight;
|
|
private StreamContainer _streamContainer;
|
|
private Area _streamContainerArea;
|
|
private Spatial _streamContainerActiveTiles;
|
|
private Player _player;
|
|
|
|
// Resources
|
|
private PackedScene _tileHighlightScene;
|
|
|
|
// other members
|
|
private HexGrid _hexGrid;
|
|
private HexCell _lastTile;
|
|
private HexCell _currentTile;
|
|
private Vector2 _currentTileOffset;
|
|
|
|
// Called when the node enters the scene tree for the first time.
|
|
public override void _Ready()
|
|
{
|
|
// UI elements
|
|
_framesPerSecondLabel = GetNode<Label>("Control/HBoxContainer/GridContainer/fps_label");
|
|
_tileLabel = GetNode<Label>("Control/HBoxContainer/GridContainer/tile_label");
|
|
_tileOffsetLabel = GetNode<Label>("Control/HBoxContainer/GridContainer/tile_offset_label");
|
|
_numTilesLabel = GetNode<Label>("Control/HBoxContainer/GridContainer/num_tiles_label");
|
|
_mouseWorldLabel = GetNode<Label>("Control/HBoxContainer/GridContainer/mouse_world_label");
|
|
_mouseTileLabel = GetNode<Label>("Control/HBoxContainer/GridContainer/mouse_tile_label");
|
|
_numCoordsAddedLabel = GetNode<Label>("Control/HBoxContainer/GridContainer/num_coords_added_label");
|
|
_numCoordsRemovedLabel = GetNode<Label>("Control/HBoxContainer/GridContainer/num_coords_removed_label");
|
|
|
|
// scene nodes
|
|
_tileHighlight = GetNode<Spatial>("TileHighlight");
|
|
_mouseTileHighlight = GetNode<Spatial>("MouseTileHighlight");
|
|
_streamContainer = GetNode<StreamContainer>("StreamContainer");
|
|
_streamContainerArea = GetNode<Area>("StreamContainer/Area");
|
|
_streamContainerActiveTiles = GetNode<Spatial>("StreamContainer/ActiveTiles");
|
|
_player = GetNode<Player>("Player");
|
|
|
|
// resources
|
|
_tileHighlightScene = GD.Load<PackedScene>("utils/TileHighlight.tscn");
|
|
|
|
// other members
|
|
_lastTile = new HexCell();
|
|
_currentTile = new HexCell();
|
|
_currentTileOffset = new Vector2();
|
|
_hexGrid = new HexGrid();
|
|
|
|
// connect signals
|
|
_streamContainerArea.Connect("input_event", this, nameof(OnAreaInputEvent));
|
|
_streamContainer.Connect("TileSelected", this, nameof(OnTileSelected));
|
|
|
|
// CreateTileGrid();
|
|
|
|
//playerTransform.origin += new Vector3(0, 0, -1) * delta;
|
|
Transform playerTransform = _player.Transform;
|
|
playerTransform.origin.x = 3;
|
|
_player.Transform = playerTransform;
|
|
}
|
|
|
|
public void CreateTileGrid()
|
|
{
|
|
foreach (int x_index in Enumerable.Range(-3, 6))
|
|
{
|
|
foreach (int y_index in Enumerable.Range(0, 1))
|
|
{
|
|
var tile = (Spatial)_tileHighlightScene.Instance();
|
|
HexCell cell = new HexCell();
|
|
Vector2 planeCoords = _hexGrid.GetHexCenterFromOffset(new Vector2(x_index, y_index));
|
|
Transform tileTransform = Transform.Identity;
|
|
tileTransform.origin.x = planeCoords.x;
|
|
tileTransform.origin.z = planeCoords.y;
|
|
tile.Transform = tileTransform;
|
|
AddChild(tile);
|
|
GD.Print("Added tile at offset coords " + new Vector2(x_index, y_index).ToString() +
|
|
" and world coords " + tileTransform.origin.ToString());
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public void CreateStreamActiveTiles()
|
|
{
|
|
foreach (int coord_x in Enumerable.Range((int)_streamContainer.CurrentOffsetCoordRect.Position.x,
|
|
(int)_streamContainer.CurrentOffsetCoordRect.Size.x))
|
|
{
|
|
foreach (int coord_y in Enumerable.Range((int)_streamContainer.CurrentOffsetCoordRect.Position.y,
|
|
(int)_streamContainer.CurrentOffsetCoordRect.Size.y))
|
|
{
|
|
Spatial hexTile3d = _streamContainer.GetTile3dAt(new Vector2(coord_x, coord_y));
|
|
// HexCell cell = new HexCell();
|
|
// cell.OffsetCoords = new Vector2(coord_x, coord_y);
|
|
// Vector2 cellWorldCenter = _hexGrid.GetHexCenter(cell);
|
|
//
|
|
// Spatial highlightTile = (Spatial)_tileHighlightScene.Instance();
|
|
// Transform highlightTileTransform = Transform.Identity;
|
|
// highlightTileTransform.origin.x = cellWorldCenter.x;
|
|
// highlightTileTransform.origin.z = cellWorldCenter.y;
|
|
// highlightTile.Transform = highlightTileTransform;
|
|
//
|
|
// _streamContainerActiveTiles.AddChild(highlightTile);
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void _Process(float delta)
|
|
{
|
|
_framesPerSecondLabel.Text = Engine.GetFramesPerSecond().ToString();
|
|
_lastTile = _currentTile;
|
|
|
|
Transform playerTransform = _player.Transform;
|
|
Vector3 playerCoord = playerTransform.origin;
|
|
_currentTile = _hexGrid.GetHexAt(new Vector2(playerCoord.x, playerCoord.z));
|
|
|
|
_tileLabel.Text = playerTransform.ToString();
|
|
_tileOffsetLabel.Text = _currentTile.OffsetCoords.ToString();
|
|
|
|
//playerTransform.origin += new Vector3(-0.1f, 0, 1) * delta;
|
|
_player.Transform = playerTransform;
|
|
|
|
Transform tileHighlightTransform = Transform.Identity;
|
|
Vector2 currentTileCenter = _hexGrid.GetHexCenter(_currentTile);
|
|
tileHighlightTransform.origin.x = currentTileCenter.x;
|
|
tileHighlightTransform.origin.z = currentTileCenter.y;
|
|
_tileHighlight.Transform = tileHighlightTransform;
|
|
|
|
if (_currentTile.CubeCoords != _lastTile.CubeCoords)
|
|
{
|
|
_streamContainer.SetCenterTile(_currentTile);
|
|
// CreateStreamActiveTiles();
|
|
|
|
_numTilesLabel.Text = _streamContainerActiveTiles.GetChildCount().ToString();
|
|
_numCoordsAddedLabel.Text = _streamContainer.AddedCoords.Count.ToString();
|
|
_numCoordsRemovedLabel.Text = _streamContainer.RemovedCoords.Count.ToString();
|
|
}
|
|
}
|
|
|
|
public void OnAreaInputEvent(Node camera, InputEvent inputEvent, Vector3 position, Vector3 normal, int shapeIndex)
|
|
{
|
|
HexCell cellAtCursor = _hexGrid.GetHexAt(new Vector2(position.x, position.z));
|
|
Transform highlightTransform = Transform.Identity;
|
|
Vector2 cellPlaneCoords = _hexGrid.GetHexCenter(cellAtCursor);
|
|
cellPlaneCoords = _hexGrid.GetHexCenterFromOffset(cellAtCursor.OffsetCoords);
|
|
highlightTransform.origin.x = cellPlaneCoords.x;
|
|
highlightTransform.origin.z = cellPlaneCoords.y;
|
|
|
|
_mouseWorldLabel.Text = position.ToString();
|
|
_mouseTileLabel.Text = cellAtCursor.OffsetCoords.ToString();
|
|
|
|
_mouseTileHighlight.Transform = highlightTransform;
|
|
|
|
if (inputEvent is InputEventMouseButton)
|
|
{
|
|
_player.Transform = highlightTransform;
|
|
}
|
|
}
|
|
|
|
public void OnTileSelected(HexTile3D tile)
|
|
{
|
|
if (_player == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
MovableComponent movableComponent = _player.GetNode<MovableComponent>("Movable");
|
|
if (movableComponent == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
movableComponent.targetPosition = tile.Transform.origin;
|
|
}
|
|
} |