added world gen + renderers
This commit is contained in:
parent
6ca5216ead
commit
2fd35f061e
Binary file not shown.
|
After Width: | Height: | Size: 298 B |
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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")]
|
||||
|
|
|
|||
|
|
@ -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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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)));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue