Minor improvement of the NavigationTest scene.
parent
0ee11e358c
commit
d963c90912
|
@ -243,6 +243,7 @@ public class HexGrid : Resource
|
|||
FindPathCheckedCells++;
|
||||
HexCell currentHex = new HexCell(frontier.Dequeue());
|
||||
Vector2 currentAxial = currentHex.AxialCoords;
|
||||
|
||||
if (currentHex == goalHex)
|
||||
{
|
||||
break;
|
||||
|
@ -282,6 +283,7 @@ public class HexGrid : Resource
|
|||
|
||||
if (!cameFrom.ContainsKey(goalHex.AxialCoords))
|
||||
{
|
||||
GD.Print("Failed to find path from " + startHex + " to " + goalHex);
|
||||
return new List<HexCell>();
|
||||
}
|
||||
|
||||
|
|
|
@ -344,7 +344,6 @@ public class Game : Spatial
|
|||
_worldTextureRect.Texture = newWorldTexture;
|
||||
_tileMaterial.SetShaderParam("MapAlbedoTexture", newWorldTexture);
|
||||
_tileMaterial.SetShaderParam("TextureSize", (int)_tileWorld.ColormapImage.GetSize().x);
|
||||
GD.Print("Texture size: " + (int)_tileWorld.ColormapImage.GetSize().x);
|
||||
|
||||
ImageTexture newHeightTexture = new ImageTexture();
|
||||
newHeightTexture.CreateFromImage(_tileWorld.HeightmapImage,
|
||||
|
|
|
@ -43,6 +43,7 @@ public class TileWorld : Spatial
|
|||
public float HeightScale = 2.0f;
|
||||
public Image HeightmapImage;
|
||||
public Image ColormapImage;
|
||||
public Image NavigationmapImage;
|
||||
public int Seed = 0;
|
||||
public Spatial Entities;
|
||||
public HexGrid HexGrid;
|
||||
|
@ -124,15 +125,12 @@ public class TileWorld : Spatial
|
|||
HeightmapImage.FillRect(new Rect2(0, 0, size, size), Colors.ForestGreen);
|
||||
_heightmapOffscreenTextureRect.SetSize(sizeVector);
|
||||
_heightmapOffscreenViewport.Size = sizeVector;
|
||||
|
||||
NavigationmapImage = new Image();
|
||||
NavigationmapImage.Create(size, size, false, Image.Format.Rgb8);
|
||||
NavigationmapImage.FillRect(new Rect2(0, 0, size, size), new Color(1, 1, 1));
|
||||
}
|
||||
|
||||
public void PrintTextureSizes()
|
||||
{
|
||||
GD.Print("Color Viewport: " + _worldOffscreenViewport.Size);
|
||||
GD.Print("Color TextureRect: " + _worldOffscreenTextureRect.Texture.GetSize());
|
||||
GD.Print("Heightmap Viewport: " + _heightmapOffscreenViewport.Size);
|
||||
GD.Print("Heightmap TextureRect: " + _heightmapOffscreenTextureRect.Texture.GetSize());
|
||||
}
|
||||
|
||||
public void Generate(int size)
|
||||
{
|
||||
|
@ -314,6 +312,14 @@ public class TileWorld : Spatial
|
|||
return (color.r == 0 && color.g == 0 && color.b > 0.01);
|
||||
}
|
||||
|
||||
public void MarkCellUnwalkable(HexCell cell)
|
||||
{
|
||||
HexGrid.AddObstacle(cell);
|
||||
NavigationmapImage.Lock();
|
||||
NavigationmapImage.SetPixelv(OffsetToTextureCoord(cell.OffsetCoords), Colors.Red);
|
||||
NavigationmapImage.Unlock();
|
||||
}
|
||||
|
||||
private void PopulateEnvironment()
|
||||
{
|
||||
Random environmentRandom = new Random(Seed);
|
||||
|
@ -336,7 +342,7 @@ public class TileWorld : Spatial
|
|||
if (rockAsset != null)
|
||||
{
|
||||
_environmentNode.AddChild(rockAsset);
|
||||
HexGrid.AddObstacle(cell);
|
||||
MarkCellUnwalkable(cell);
|
||||
}
|
||||
}
|
||||
else if (IsColorEqualApprox(colorValue, GrassColor))
|
||||
|
@ -351,7 +357,7 @@ public class TileWorld : Spatial
|
|||
if (treeAsset != null)
|
||||
{
|
||||
Entities.AddChild(treeAsset);
|
||||
HexGrid.AddObstacle(cell);
|
||||
MarkCellUnwalkable(cell);
|
||||
}
|
||||
else if (environmentRandom.NextDouble() < 0.01)
|
||||
{
|
||||
|
@ -361,12 +367,12 @@ public class TileWorld : Spatial
|
|||
assetTransform.origin.y += 1.2f;
|
||||
chestAsset.Transform = assetTransform;
|
||||
Entities.AddChild(chestAsset);
|
||||
HexGrid.AddObstacle(cell);
|
||||
MarkCellUnwalkable(cell);
|
||||
}
|
||||
}
|
||||
else if (IsColorWater(colorValue))
|
||||
{
|
||||
HexGrid.AddObstacle(cell);
|
||||
MarkCellUnwalkable(cell);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -473,8 +479,6 @@ public class TileWorld : Spatial
|
|||
ColormapImage.Lock();
|
||||
ColormapImage.SetPixel((int)textureCoord.x, (int)textureCoord.y, color);
|
||||
ColormapImage.Unlock();
|
||||
|
||||
OnMapGenerationComplete();
|
||||
}
|
||||
|
||||
public Vector2 WorldToOffsetCoords(Vector3 worldCoord)
|
||||
|
|
|
@ -16,27 +16,34 @@ public class EditorUI : Control
|
|||
private Button _grassButton;
|
||||
private Button _sandButton;
|
||||
private Button _waterButton;
|
||||
private Button _obstacleButton;
|
||||
private Button _navigateButton;
|
||||
private ShaderMaterial _tileMaterial;
|
||||
|
||||
private CheckBox _gameGeometryCheckBox;
|
||||
private CheckBox _physicsGeometryCheckBox;
|
||||
private CheckBox _navigationGeometryCheckBox;
|
||||
|
||||
private TileWorld _tileWorld;
|
||||
private StreamContainer _streamContainer;
|
||||
|
||||
private enum TileType
|
||||
public enum InputMode
|
||||
{
|
||||
None,
|
||||
Grass,
|
||||
Sand,
|
||||
Water
|
||||
Water,
|
||||
Obstacle,
|
||||
Navigate
|
||||
}
|
||||
private TileType _currentTileType = TileType.None;
|
||||
public InputMode CurrentInputMode = InputMode.None;
|
||||
|
||||
// Called when the node enters the scene tree for the first time.
|
||||
public override void _Ready()
|
||||
{
|
||||
_tileWorld = (TileWorld) GetNode(World);
|
||||
_streamContainer = (StreamContainer)GetNode(StreamContainer);
|
||||
_tileMaterial = GD.Load<ShaderMaterial>("materials/HexTileTextureLookup.tres");
|
||||
|
||||
// signals
|
||||
_resetButton = (Button) FindNode("ResetButton");
|
||||
|
@ -51,11 +58,20 @@ public class EditorUI : Control
|
|||
_waterButton = (Button) FindNode("WaterButton");
|
||||
_waterButton.Connect("pressed", this, nameof(OnWaterButton));
|
||||
|
||||
_obstacleButton = (Button) FindNode("ObstacleButton");
|
||||
_obstacleButton.Connect("pressed", this, nameof(OnObstacleButton));
|
||||
|
||||
_navigateButton = (Button) FindNode("NavigateButton");
|
||||
_navigateButton.Connect("pressed", this, nameof(OnNavigateButton));
|
||||
|
||||
_gameGeometryCheckBox = (CheckBox)FindNode("GameGeometryCheckBox");
|
||||
_gameGeometryCheckBox.Connect("toggled", this, nameof(OnGameGeometryCheckBoxToggled));
|
||||
|
||||
_physicsGeometryCheckBox = (CheckBox)FindNode("PhysicsGeometryCheckBox");
|
||||
_physicsGeometryCheckBox.Connect("toggled", this, nameof(OnPhysicsGeometryCheckBoxToggled));
|
||||
|
||||
_navigationGeometryCheckBox = (CheckBox)FindNode("NavigationGeometryCheckBox");
|
||||
_navigationGeometryCheckBox.Connect("toggled", this, nameof(OnNavigationGeometryCheckBoxToggled));
|
||||
}
|
||||
|
||||
|
||||
|
@ -63,25 +79,38 @@ public class EditorUI : Control
|
|||
{
|
||||
GD.Print("Resetting Map");
|
||||
_tileWorld.Seed = _tileWorld.Seed + 1;
|
||||
_tileWorld.Generate(12);
|
||||
_tileWorld.Generate(24);
|
||||
}
|
||||
|
||||
public void OnGrassButton()
|
||||
{
|
||||
_currentTileType = TileType.Grass;
|
||||
CurrentInputMode = InputMode.Grass;
|
||||
}
|
||||
|
||||
public void OnSandButton()
|
||||
{
|
||||
_currentTileType = TileType.Sand;
|
||||
CurrentInputMode = InputMode.Sand;
|
||||
|
||||
}
|
||||
|
||||
public void OnWaterButton()
|
||||
{
|
||||
_currentTileType = TileType.Water;
|
||||
CurrentInputMode = InputMode.Water;
|
||||
}
|
||||
|
||||
|
||||
public void OnObstacleButton()
|
||||
{
|
||||
CurrentInputMode = InputMode.Obstacle;
|
||||
}
|
||||
|
||||
|
||||
public void OnNavigateButton()
|
||||
{
|
||||
CurrentInputMode = InputMode.Navigate;
|
||||
}
|
||||
|
||||
|
||||
public void OnGameGeometryCheckBoxToggled(bool pressed)
|
||||
{
|
||||
Array gameGeometries = GetTree().GetNodesInGroup("GameGeometry");
|
||||
|
@ -107,16 +136,48 @@ public class EditorUI : Control
|
|||
}
|
||||
}
|
||||
|
||||
public void OnTileClicked(Vector2 offsetCoord)
|
||||
|
||||
public void OnNavigationGeometryCheckBoxToggled(bool pressed)
|
||||
{
|
||||
switch (_currentTileType)
|
||||
UpdateTileMaterial();
|
||||
}
|
||||
|
||||
public void UpdateTileMaterial()
|
||||
{
|
||||
if (_navigationGeometryCheckBox.Pressed)
|
||||
{
|
||||
case TileType.Grass:_tileWorld.SetTileColorAtOffset(currentTileOffset, Colors.Green);
|
||||
break;
|
||||
case TileType.Water:_tileWorld.SetTileColorAtOffset(currentTileOffset, Colors.Blue);
|
||||
break;
|
||||
case TileType.Sand:_tileWorld.SetTileColorAtOffset(currentTileOffset, Colors.Yellow);
|
||||
break;
|
||||
ImageTexture newWorldTexture = new ImageTexture();
|
||||
newWorldTexture.CreateFromImage(_tileWorld.NavigationmapImage,
|
||||
(uint)(Texture.FlagsEnum.Mipmaps | Texture.FlagsEnum.Repeat));
|
||||
_tileMaterial.SetShaderParam("MapAlbedoTexture", newWorldTexture);
|
||||
_tileMaterial.SetShaderParam("TextureSize", (int)_tileWorld.NavigationmapImage.GetSize().x);
|
||||
}
|
||||
else
|
||||
{
|
||||
ImageTexture newWorldTexture = new ImageTexture();
|
||||
newWorldTexture.CreateFromImage(_tileWorld.ColormapImage,
|
||||
(uint)(Texture.FlagsEnum.Mipmaps | Texture.FlagsEnum.Repeat));
|
||||
_tileMaterial.SetShaderParam("MapAlbedoTexture", newWorldTexture);
|
||||
_tileMaterial.SetShaderParam("TextureSize", (int)_tileWorld.ColormapImage.GetSize().x);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void OnTileClicked(Vector2 offsetCoord)
|
||||
{
|
||||
switch (CurrentInputMode)
|
||||
{
|
||||
case InputMode.Grass:_tileWorld.SetTileColorAtOffset(currentTileOffset, Colors.Green);
|
||||
break;
|
||||
case InputMode.Water:_tileWorld.SetTileColorAtOffset(currentTileOffset, Colors.Blue);
|
||||
break;
|
||||
case InputMode.Sand:_tileWorld.SetTileColorAtOffset(currentTileOffset, Colors.Yellow);
|
||||
break;
|
||||
case InputMode.Obstacle:
|
||||
_tileWorld.MarkCellUnwalkable(HexCell.FromOffsetCoords(offsetCoord));
|
||||
break;
|
||||
}
|
||||
|
||||
UpdateTileMaterial();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,8 +58,8 @@ public class NavigationTests : Spatial
|
|||
foreach (Spatial entity in entities)
|
||||
{
|
||||
Vector2 entityPlaneCoords = new Vector2(entity.GlobalTranslation.x, entity.GlobalTranslation.z);
|
||||
HexCell entityCell = _hexGrid.GetHexAt(entityPlaneCoords);
|
||||
_tileWorld.HexGrid.AddObstacle(entityCell);
|
||||
HexCell entityCell = _tileWorld.HexGrid.GetHexAt(entityPlaneCoords);
|
||||
_tileWorld.MarkCellUnwalkable(entityCell);
|
||||
Vector2 cellPlaneCoords = _hexGrid.GetHexCenterFromOffset(entityCell.OffsetCoords);
|
||||
Vector3 entityGlobalTranslation = entity.GlobalTranslation;
|
||||
entityGlobalTranslation.x = cellPlaneCoords.x;
|
||||
|
@ -85,6 +85,8 @@ public class NavigationTests : Spatial
|
|||
(uint)(Texture.FlagsEnum.Mipmaps | Texture.FlagsEnum.Repeat));
|
||||
_tileMaterial.SetShaderParam("MapAlbedoTexture", newWorldTexture);
|
||||
_tileMaterial.SetShaderParam("TextureSize", (int)_tileWorld.ColormapImage.GetSize().x);
|
||||
|
||||
CorrectEntityGridPositions();
|
||||
}
|
||||
|
||||
|
||||
|
@ -125,6 +127,11 @@ public class NavigationTests : Spatial
|
|||
if (_editorUi != null)
|
||||
{
|
||||
_editorUi.OnTileClicked(tile.OffsetCoords);
|
||||
|
||||
if (_editorUi.CurrentInputMode == EditorUI.InputMode.Navigate)
|
||||
{
|
||||
_playerNavigationComponent.FindPath(_player, _player.GlobalTranslation, tile.GlobalTranslation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
[sub_resource type="ButtonGroup" id=4]
|
||||
resource_local_to_scene = false
|
||||
resource_name = "TileTypeButtonGroup"
|
||||
resource_name = "InputTypeButtonGroup"
|
||||
|
||||
[node name="EditorUI" type="Control"]
|
||||
anchor_right = 1.0
|
||||
|
@ -56,6 +56,22 @@ toggle_mode = true
|
|||
group = SubResource( 4 )
|
||||
text = "Sand"
|
||||
|
||||
[node name="ObstacleButton" type="Button" parent="HBoxContainer"]
|
||||
margin_left = 244.0
|
||||
margin_right = 313.0
|
||||
margin_bottom = 25.0
|
||||
toggle_mode = true
|
||||
group = SubResource( 4 )
|
||||
text = "Obstacle"
|
||||
|
||||
[node name="NavigateButton" type="Button" parent="HBoxContainer"]
|
||||
margin_left = 317.0
|
||||
margin_right = 384.0
|
||||
margin_bottom = 25.0
|
||||
toggle_mode = true
|
||||
group = SubResource( 4 )
|
||||
text = "Navigate"
|
||||
|
||||
[node name="ViewFlagsContainer" type="HBoxContainer" parent="."]
|
||||
anchor_top = 1.0
|
||||
anchor_bottom = 1.0
|
||||
|
@ -79,3 +95,9 @@ margin_left = 104.0
|
|||
margin_right = 180.0
|
||||
margin_bottom = 40.0
|
||||
text = "Physics"
|
||||
|
||||
[node name="NavigationGeometryCheckBox" type="CheckBox" parent="ViewFlagsContainer"]
|
||||
margin_left = 184.0
|
||||
margin_right = 279.0
|
||||
margin_bottom = 40.0
|
||||
text = "Navigation"
|
||||
|
|
Loading…
Reference in New Issue