added items

This commit is contained in:
MasterGordon 2022-12-06 13:51:34 +01:00
parent b947d2faa1
commit 6d3e12597a
18 changed files with 191 additions and 10 deletions

View File

@ -8,10 +8,10 @@ public class TextureFactory
private readonly Renderer renderer;
private readonly Dictionary<string, IntPtr> textureCache = new();
public TextureFactory()
public TextureFactory(ResourceLoader resourceLoader, Renderer renderer)
{
this.resourceLoader = Context.Get().ResourceLoader;
this.renderer = Context.Get().Renderer;
this.resourceLoader = resourceLoader;
this.renderer = renderer;
}
public IntPtr CreateTexture(string[] path)

View File

@ -18,6 +18,7 @@ public class Backend : IBackend
public void Process(double dt)
{
this.ProcessPacket(new TickPacket(this.tick++));
Context.Get().GameState.Tick = this.tick;
while (this.pendingPackets.Count > 0)
{
var packet = this.pendingPackets.Dequeue();

View File

@ -17,6 +17,7 @@ public class Frontend : IFrontend
var connectPacket = new ConnectPacket(ctx.FrontendGameState.PlayerName, guid);
ctx.Backend.ProcessPacket(connectPacket);
ctx.TileRegistry.RegisterTile();
ctx.ItemRegistry.RegisterItems();
var (width, height) = ctx.Window.GetSize();
ctx.FrontendGameState.WindowWidth = width;
ctx.FrontendGameState.WindowHeight = height;

View File

@ -1,5 +1,6 @@
using Mine2d.engine;
using Mine2d.engine.networking;
using Mine2d.game.core.items;
using Mine2d.game.core.tiles;
using Mine2d.game.state;
@ -15,7 +16,9 @@ public class Context
public Window Window { get; set; }
public Renderer Renderer { get; set; }
public TileRegistry TileRegistry { get; set; }
public ItemRegistry ItemRegistry { get; set; }
public ResourceLoader ResourceLoader { get; set; }
public TextureFactory TextureFactory { get; set; }
public static Context Instance { get; set; }
public Context(
@ -35,8 +38,10 @@ public class Context
this.FrontendGameState = frontendGameState;
this.Renderer = renderer;
this.Window = window;
this.TileRegistry = new TileRegistry();
this.ResourceLoader = new ResourceLoader();
this.TextureFactory = new TextureFactory(this.ResourceLoader, this.Renderer);
this.TileRegistry = new TileRegistry();
this.ItemRegistry = new ItemRegistry();
Instance = this;
}

View File

@ -43,6 +43,7 @@ public class Breaking
chunk.SetTileAt(player.Mining, tile with { Hits = tile.Hits + 1 });
if (tile.Hits >= hardness)
{
ctx.Backend.ProcessPacket(new BlockBrokenPacket(player.Id, player.Mining, tile));
chunk.SetTileAt(player.Mining, STile.From(0));
}
}

View File

@ -0,0 +1,34 @@
using Mine2d.engine.system.annotations;
using Mine2d.game.core.data.entities;
namespace Mine2d.game.backend.interactor;
[Interactor]
public class ItemPhysics
{
[Interaction(InteractorKind.Hybrid, "tick")]
public static void TickHybrid()
{
var gameState = Context.Get().GameState;
var world = gameState.World;
foreach (var chunk in world.Chunks)
{
var entities = chunk.Value.Entities;
foreach (var entity in entities)
{
if (entity is ItemEntity itemEntity)
{
itemEntity.Velocity += new Vector2(0, 0.1f);
var nextPos = itemEntity.Position + itemEntity.Velocity;
if (world.HasChunkAt(nextPos) && world.GetChunkAt(nextPos).HasTileAt(nextPos))
{
itemEntity.Velocity = new Vector2(0, 0);
continue;
}
itemEntity.Position = nextPos;
}
}
}
}
}

View File

@ -5,6 +5,7 @@ public class Chunk
public STile[,] Tiles { get; set; } = new STile[Constants.ChunkSize, Constants.ChunkSize];
public int X { get; set; }
public int Y { get; set; }
public List<Entity> Entities { get; set; } = new();
public Chunk(int x, int y)
{
@ -76,4 +77,9 @@ public class Chunk
return pos - new Vector2(this.X * Constants.ChunkSize * Constants.TileSize,
this.Y * Constants.ChunkSize * Constants.TileSize);
}
public void AddEntity(Entity entity)
{
this.Entities.Add(entity);
}
}

View File

@ -0,0 +1,6 @@
namespace Mine2d.game.core.data;
public class Entity
{
public Guid Id { get; set; } = Guid.NewGuid();
}

View File

@ -0,0 +1,7 @@
namespace Mine2d.game.core.data;
public enum ItemId
{
Air = 0,
Stone = 1,
}

View File

@ -0,0 +1,8 @@
namespace Mine2d.game.core.data.entities;
public class ItemEntity : Entity
{
public Vector2 Position { get; set; }
public Vector2 Velocity { get; set; }
public ItemId ItemId { get; set; }
}

View File

@ -0,0 +1,28 @@
using Mine2d.game.core.data;
namespace Mine2d.game.core.items;
public class Item
{
public ItemId Id { get; set; }
public string Name { get; set; }
private readonly IntPtr texture;
public Item(ItemId id, string name, string[] textureName)
{
this.Id = id;
this.Name = name;
var texture = Context.Get().TextureFactory.CreateTexture(textureName);
this.texture = texture;
}
public void Render(Vector2 position)
{
var ctx = Context.Get();
var renderer = ctx.Renderer;
var scale = ctx.FrontendGameState.Settings.GameScale;
var targetPos = (position - ctx.FrontendGameState.Camera.Position) * scale -
new Vector2(6 * scale);
renderer.DrawTexture(this.texture, (int)targetPos.X, (int)targetPos.Y, 8 * scale, 8 * scale);
}
}

View File

@ -0,0 +1,23 @@
using Mine2d.game.core.data;
namespace Mine2d.game.core.items;
public class ItemRegistry
{
private readonly Dictionary<ItemId, Item> items = new();
public void RegisterItems()
{
this.Register(ItemId.Stone, new Item(ItemId.Stone, "Stone", new[] { "stone" }));
}
public void Register(ItemId id, Item item)
{
this.items.Add(id, item);
}
public Item GetItem(ItemId id)
{
return this.items[id];
}
}

View File

@ -4,7 +4,7 @@ namespace Mine2d.game.core.tiles;
public class OreTile : Tile
{
public OreTile(string name, string[] texturePath, int hardness) : base(name, new TextureFactory().CreateTexture(texturePath), hardness)
public OreTile(string name, string[] texturePath, int hardness) : base(name, Context.Get().TextureFactory.CreateTexture(texturePath), hardness)
{
}
}

View File

@ -34,11 +34,6 @@ public class Tile
this.texture = texture;
}
~Tile()
{
SDL_DestroyTexture(this.texture);
}
public void Render(int x, int y, STile tile)
{
var renderer = Context.Get().Renderer;

View File

@ -0,0 +1,27 @@
using Mine2d.engine.system;
using Mine2d.engine.system.annotations;
using Mine2d.game.core;
using Mine2d.game.core.data;
using Mine2d.game.core.data.entities;
namespace Mine2d.game.frontend.events;
public class DebugInput
{
[EventListener(EventType.KeyDown)]
public static void OnKeyDown(SDL_Event e)
{
if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_K)
{
var gameState = Context.Get().GameState;
var player = PlayerEntity.GetSelf();
var chunk = gameState.World.GetChunkAt(player.Position);
var item = new ItemEntity
{
Position = player.Position,
ItemId = ItemId.Stone
};
chunk.AddEntity(item);
}
}
}

View File

@ -12,6 +12,7 @@ public class GameRenderer : IRenderer
this.renderers.Add(new WorldRenderer());
this.renderers.Add(new PlayerRenderer());
this.renderers.Add(new WorldCursorRenderer());
this.renderers.Add(new ItemRenderer());
}
public void Render()

View File

@ -0,0 +1,37 @@
using Mine2d.engine;
using Mine2d.game.core.data;
using Mine2d.game.core.data.entities;
namespace Mine2d.game.frontend.renderer;
public class ItemRenderer : IRenderer
{
public void Render()
{
var gameState = Context.Get().GameState;
var world = gameState.World;
foreach (var chunk in world.Chunks)
{
renderChunk(chunk.Value);
}
}
private static void renderChunk(Chunk chunk)
{
var entities = chunk.Entities;
foreach (var entity in entities)
{
if (entity is ItemEntity itemEntity)
{
renderItem(itemEntity);
}
}
}
private static void renderItem(ItemEntity itemEntity)
{
var item = itemEntity.ItemId;
var position = itemEntity.Position;
Context.Get().ItemRegistry.GetItem(item).Render(position);
}
}

View File

@ -28,4 +28,5 @@ public class GameState
{
public List<Player> Players { get; set; } = new List<Player>();
public World World { get; set; }
public uint Tick { get; set; }
}