Как реализовать чанк (кусок игровоего мира)?
Всем привет, я делаю игру в 2D на Godot 4 и хочу реализовать мир, состоящий из чанков. То есть у меня есть клетка (1х1 квадратный метр) и из клеток состоит чанк (32х32 клетки), а из чанков и состоит игровой мир.
Я сделал реализацию, но думаю, что что-то упускаю и хотел бы увидеть шаблоны, уроки или другой материал, который бы мне помог, ибо информации, что я находил, было мало и была она в основном для 3D.
Кому интересно, моя реализация выглядит так:
using Godot;
namespace GridGame.Scripts;
public class Cell
{
public int ID;
public string Name;
public Vector2I ChunkPosition; // from 0 to 32
public Vector2I GridPosition; // WorldCoords
public CellType Type;
public Cell(int ID, Vector2I GridPosition)
{
SetID(ID);
this.GridPosition = GridPosition;
}
public void SetID(int ID) // Rework for autocomplete information
{
this.ID = ID;
}
}
public enum CellType
{
None,
Air,
Ground
}
using Godot;
namespace GridGame.Scripts;
public class Chunk
{
public const int CHUNK_SIZE = 32; // i.e. 32x32
public Vector2I GridPosition;
public bool Visible = true;
public Cell[,] Cells;
public Chunk(Vector2I GridPosition)
{
this.GridPosition = GridPosition;
}
public void GenerateCells() // Needs to be redesigned to be importable
{
Cells = new Cell[CHUNK_SIZE, CHUNK_SIZE];
// To get GridPosition (check note :D)
int FirstX = CHUNK_SIZE * GridPosition.X;
int FirstY = CHUNK_SIZE * GridPosition.Y;
Vector2I CellGridPos = Vector2I.Zero;
for (int x = 0; x < CHUNK_SIZE; x++)
{
for (int y = 0; y < CHUNK_SIZE; y++)
{
CellGridPos.X = FirstX + x;
CellGridPos.Y = FirstY + y;
Cells[x, y] = new Cell(1, CellGridPos);
}
}
}
}
using Godot;
namespace GridGame.Scripts;
public partial class Grid : TileMap
{
public const int BlackID = 0;
public const int WhiteID = 1;
public Chunk[,] Chunks;
public int ChunksCount = 16;
public FastNoiseLite Noise;
public int Seed = 0;
public override void _Ready()
{
Noise = new FastNoiseLite();
Chunks = new Chunk[ChunksCount, ChunksCount];
for(int x = 0; x < ChunksCount; x++)
{
for (int y = 0; y < ChunksCount; y++)
{
Chunks[x, y] = new Chunk(new Vector2I(x, y));
Chunks[x, y].GenerateCells();
}
}
DrawGrid();
}
public override void _PhysicsProcess(double delta)
{
if (Input.IsActionJustPressed("f1"))
{
Seed += 1;
Noise.Seed = Seed;
DrawGrid();
}
}
public void DrawGrid()
{
for (int x = 0; x < ChunksCount; x++)
{
for (int y = 0; y < ChunksCount; y++)
{
if (Chunks[x, y].Visible)
{
DrawChunk(x, y);
}
}
}
}
public void DrawChunk(int x, int y)
{
for (int x2 = 0; x2 < Chunk.CHUNK_SIZE; x2++)
{
for (int y2 = 0; y2 < Chunk.CHUNK_SIZE; y2++)
{
int CellID = Chunks[x, y].Cells[x2, y2].ID;
Vector2I CellPosition = Chunks[x, y].Cells[x2, y2].GridPosition;
if (Noise.GetNoise2D(CellPosition.X, CellPosition.Y) >= 0)
{
SetCell(0, CellPosition, WhiteID, new Vector2I(0, 0));
}
else
{
SetCell(0, CellPosition, BlackID, new Vector2I(0, 0));
}
}
}
}
public void EraseChunk(int x, int y)
{
for (int x2 = 0; x2 < Chunk.CHUNK_SIZE; x2++)
{
for (int y2 = 0; y2 < Chunk.CHUNK_SIZE; y2++)
{
Vector2I CellPosition = Chunks[x, y].Cells[x2, y2].GridPosition;
SetCell(0, CellPosition, -1);
}
}
}
}