added world gen + renderers

This commit is contained in:
MasterGordon 2022-11-16 14:45:03 +01:00
parent 6ca5216ead
commit 2fd35f061e
12 changed files with 237 additions and 37 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 B

View File

@ -1,3 +1,5 @@
using mine2d.core.data;
namespace mine2d.backend.data;
public interface IPacket
@ -66,3 +68,31 @@ public readonly struct BreakPacket : IPacket
this.Target = target;
}
}
public readonly struct PlayerMovedPacket : IPacket
{
public readonly string Type => "playerMoved";
public readonly Guid PlayerId { get; }
public readonly Vector2 Target { get; }
public PlayerMovedPacket(Guid playerId, Vector2 target)
{
this.PlayerId = playerId;
this.Target = target;
}
}
public readonly struct BlockBrokenPacket : IPacket
{
public readonly string Type => "blockBroken";
public readonly Guid PlayerId { get; }
public readonly Vector2 Target { get; }
public readonly STile Tile { get; }
public BlockBrokenPacket(Guid playerId, Vector2 target, STile tile)
{
this.PlayerId = playerId;
this.Target = target;
this.Tile = tile;
}
}

View File

@ -19,7 +19,7 @@ public class Connect
{
Name = packet.PlayerName,
Id = packet.PlayerGuid,
Position = new Vector2(20, 16 * 16),
Position = new Vector2(32 * 16 * 1000 + 16 * 14.5f, 32 * 16 * 10 + 16 * 14.5f),
Movement = new Vector2(0, 0)
}
);

View File

@ -22,8 +22,20 @@ public class Move
public static void TickHybrid()
{
var ctx = Context.Get();
var fromPositions = new Dictionary<Guid, Vector2>();
foreach (var player in ctx.GameState.Players)
{
fromPositions.Add(player.Id, player.Position);
}
ctx.GameState.Players.ForEach(PlayerEntity.Move);
ctx.GameState.Players.ForEach(PlayerEntity.Collide);
foreach (var player in ctx.GameState.Players)
{
if (player.Position != fromPositions[player.Id])
{
ctx.Backend.ProcessPacket(new PlayerMovedPacket(player.Id, player.Position));
}
}
}
[Interaction(InteractorKind.Client, "tick")]

View File

@ -0,0 +1,38 @@
using mine2d;
using mine2d.backend.data;
using mine2d.core.data;
using mine2d.core.tiles;
using mine2d.core.world;
using mine2d.engine.system.annotations;
namespace Mine2d.backend.interactor;
[Interactor]
public class WorldGeneration
{
private static Vector2[] directions = new Vector2[]
{
new Vector2(0, 1),
new Vector2(1, 0),
new Vector2(0, -1),
new Vector2(-1, 0)
};
[Interaction(InteractorKind.Server, "playerMoved")]
public static void PlayerMovedServer(PlayerMovedPacket packet)
{
var ctx = Context.Get();
var world = ctx.GameState.World;
foreach (var direction in directions)
{
var generationTarget = packet.Target + direction * 16 * 32;
var hasChunkGenerated = world.HasChunkAt(generationTarget);
if (!hasChunkGenerated)
{
var chunkPos = World.ToChunkPos(generationTarget);
world.AddChunk(ChunkGenerator.CreateFilledChunk((int)chunkPos.X, (int)chunkPos.Y, STile.From(Tiles.Stone)));
}
}
}
}

View File

@ -11,7 +11,7 @@ public class Bootstrapper
var ctx = Context.Get();
ctx.GameState.World = new World();
ctx.GameState.World.AddChunk(ChunkGenerator.CreateFilledChunk(0, 1, STile.From(Tiles.Stone)));
ctx.GameState.World.AddChunk(ChunkGenerator.CreateFilledChunk(1, 1, STile.From(Tiles.Stone)));
ctx.GameState.World.AddChunk(ChunkGenerator.CreateSpawnChunk(1000, 10));
ctx.GameState.World.AddChunk(ChunkGenerator.CreateFilledChunk(1, 0, STile.From(Tiles.Stone)));
}
}

View File

@ -1,4 +1,5 @@
using mine2d.core.data;
using mine2d.core.tiles;
namespace mine2d.core.world;
@ -16,4 +17,27 @@ public class ChunkGenerator
}
return chunk;
}
public static Chunk CreateSpawnChunk(int x, int y)
{
var chunk = new Chunk(x, y);
for (var i = 0; i < Constants.ChunkSize; i++)
{
for (var j = 0; j < Constants.ChunkSize; j++)
{
chunk.SetTile(i, j, STile.From(Tiles.Stone));
}
}
chunk.SetTile(16, 16, STile.From(0));
chunk.SetTile(15, 16, STile.From(0));
chunk.SetTile(16, 15, STile.From(0));
chunk.SetTile(15, 15, STile.From(0));
chunk.SetTile(17, 15, STile.From(0));
chunk.SetTile(14, 15, STile.From(0));
chunk.SetTile(17, 16, STile.From(0));
chunk.SetTile(14, 16, STile.From(0));
chunk.SetTile(16, 14, STile.From(0));
chunk.SetTile(15, 14, STile.From(0));
return chunk;
}
}

View File

@ -0,0 +1,43 @@
public static class Neighbor
{
public static IEnumerable<Vector2> Get4Neighbors(this Vector2 pos)
{
return new[]
{
new Vector2(pos.X - 1, pos.Y),
new Vector2(pos.X + 1, pos.Y),
new Vector2(pos.X, pos.Y - 1),
new Vector2(pos.X, pos.Y + 1)
};
}
public static IEnumerable<Vector2> Get8Neighbors(this Vector2 pos)
{
return new[]
{
new Vector2(pos.X - 1, pos.Y - 1),
new Vector2(pos.X + 1, pos.Y - 1),
new Vector2(pos.X - 1, pos.Y + 1),
new Vector2(pos.X + 1, pos.Y + 1)
};
}
public static IEnumerable<Vector2> Get20Neighbors(this Vector2 pos)
{
return new[]
{
new Vector2(pos.X - 2, pos.Y),
new Vector2(pos.X + 2, pos.Y),
new Vector2(pos.X, pos.Y - 2),
new Vector2(pos.X, pos.Y + 2),
new Vector2(pos.X - 2, pos.Y +1),
new Vector2(pos.X + 2, pos.Y +1),
new Vector2(pos.X - 2, pos.Y -1),
new Vector2(pos.X + 2, pos.Y -1),
new Vector2(pos.X - 1, pos.Y +2),
new Vector2(pos.X + 1, pos.Y +2),
new Vector2(pos.X - 1, pos.Y -2),
new Vector2(pos.X + 1, pos.Y -2),
};
}
}

View File

@ -1,12 +1,14 @@
using mine2d.backend.data;
using mine2d.core;
using mine2d.frontend.renderer;
using Mine2d.frontend;
using Mine2d.frontend.renderer;
namespace mine2d.frontend;
public class Frontend : IFrontend
{
private IRenderer gameRenderer;
public void Init()
{
var ctx = Context.Get();
@ -19,6 +21,7 @@ public class Frontend : IFrontend
var (width, height) = ctx.Window.GetSize();
ctx.FrontendGameState.WindowWidth = width;
ctx.FrontendGameState.WindowHeight = height;
this.gameRenderer = new GameRenderer();
}
public void Process()
@ -27,40 +30,7 @@ public class Frontend : IFrontend
EventService.PollEvents();
ctx.Renderer.Clear();
var scale = ctx.FrontendGameState.Settings.GameScale;
var camera = Context.Get().FrontendGameState.Camera;
new WorldRenderer().Render();
ctx.GameState.Players.ForEach(player =>
{
if (player.Name == ctx.FrontendGameState.PlayerName)
{
ctx.Renderer.SetColor(0, 0, 255);
}
else
{
ctx.Renderer.SetColor(255, 0, 0);
}
ctx.Renderer.DrawRect(
(player.Position.X - (int)camera.Position.X) * scale,
(player.Position.Y - (int)camera.Position.Y) * scale - 32 * scale,
16 * scale,
32 * scale
);
});
var absoluteMousePos = ctx.FrontendGameState.MousePosition / ctx.FrontendGameState.Settings.GameScale + camera.Position;
if (ctx.GameState.World.HasTileAt((int)absoluteMousePos.X, (int)absoluteMousePos.Y))
{
var a = Constants.TileSize;
var tilePos = new Vector2(absoluteMousePos.X - absoluteMousePos.X % a, absoluteMousePos.Y - absoluteMousePos.Y % a);
ctx.Renderer.SetColor(255, 255, 255);
ctx.Renderer.DrawOutline(
(int)tilePos.X * scale - (int)camera.Position.X * scale,
(int)tilePos.Y * scale - (int)camera.Position.Y * scale,
16 * scale,
16 * scale
);
}
this.gameRenderer.Render();
ctx.Renderer.Present();
}

View File

@ -0,0 +1,23 @@
using mine2d.frontend.renderer;
namespace Mine2d.frontend.renderer;
public class GameRenderer : IRenderer
{
private readonly List<IRenderer> renderers = new();
public GameRenderer()
{
this.renderers.Add(new WorldRenderer());
this.renderers.Add(new PlayerRenderer());
this.renderers.Add(new WorldCursorRenderer());
}
public void Render()
{
foreach (var renderer in this.renderers)
{
renderer.Render();
}
}
}

View File

@ -0,0 +1,32 @@
using mine2d;
using mine2d.frontend.renderer;
namespace Mine2d.frontend.renderer;
public class PlayerRenderer : IRenderer
{
public void Render()
{
var ctx = Context.Get();
var camera = ctx.FrontendGameState.Camera;
var scale = ctx.FrontendGameState.Settings.GameScale;
foreach (var player in ctx.GameState.Players)
{
if (player.Name == ctx.FrontendGameState.PlayerName)
{
ctx.Renderer.SetColor(0, 0, 255);
}
else
{
ctx.Renderer.SetColor(255, 0, 0);
}
ctx.Renderer.DrawRect(
(player.Position.X - (int)camera.Position.X) * scale,
(player.Position.Y - (int)camera.Position.Y) * scale - 32 * scale,
16 * scale,
32 * scale
);
}
}
}

View File

@ -0,0 +1,28 @@
using mine2d;
using mine2d.core;
using mine2d.frontend.renderer;
namespace Mine2d.frontend.renderer;
public class WorldCursorRenderer : IRenderer
{
public void Render()
{
var ctx = Context.Get();
var scale = ctx.FrontendGameState.Settings.GameScale;
var camera = ctx.FrontendGameState.Camera;
var absoluteMousePos = ctx.FrontendGameState.MousePosition / ctx.FrontendGameState.Settings.GameScale + camera.Position;
if (ctx.GameState.World.HasTileAt((int)absoluteMousePos.X, (int)absoluteMousePos.Y))
{
var ts = Constants.TileSize;
var tilePos = new Vector2(absoluteMousePos.X - absoluteMousePos.X % ts, absoluteMousePos.Y - absoluteMousePos.Y % ts);
ctx.Renderer.SetColor(255, 255, 255);
ctx.Renderer.DrawOutline(
(int)tilePos.X * scale - (int)camera.Position.X * scale,
(int)tilePos.Y * scale - (int)camera.Position.Y * scale,
16 * scale,
16 * scale
);
}
}
}