added items
This commit is contained in:
parent
b947d2faa1
commit
6d3e12597a
|
|
@ -8,10 +8,10 @@ public class TextureFactory
|
||||||
private readonly Renderer renderer;
|
private readonly Renderer renderer;
|
||||||
private readonly Dictionary<string, IntPtr> textureCache = new();
|
private readonly Dictionary<string, IntPtr> textureCache = new();
|
||||||
|
|
||||||
public TextureFactory()
|
public TextureFactory(ResourceLoader resourceLoader, Renderer renderer)
|
||||||
{
|
{
|
||||||
this.resourceLoader = Context.Get().ResourceLoader;
|
this.resourceLoader = resourceLoader;
|
||||||
this.renderer = Context.Get().Renderer;
|
this.renderer = renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IntPtr CreateTexture(string[] path)
|
public IntPtr CreateTexture(string[] path)
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ public class Backend : IBackend
|
||||||
public void Process(double dt)
|
public void Process(double dt)
|
||||||
{
|
{
|
||||||
this.ProcessPacket(new TickPacket(this.tick++));
|
this.ProcessPacket(new TickPacket(this.tick++));
|
||||||
|
Context.Get().GameState.Tick = this.tick;
|
||||||
while (this.pendingPackets.Count > 0)
|
while (this.pendingPackets.Count > 0)
|
||||||
{
|
{
|
||||||
var packet = this.pendingPackets.Dequeue();
|
var packet = this.pendingPackets.Dequeue();
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ public class Frontend : IFrontend
|
||||||
var connectPacket = new ConnectPacket(ctx.FrontendGameState.PlayerName, guid);
|
var connectPacket = new ConnectPacket(ctx.FrontendGameState.PlayerName, guid);
|
||||||
ctx.Backend.ProcessPacket(connectPacket);
|
ctx.Backend.ProcessPacket(connectPacket);
|
||||||
ctx.TileRegistry.RegisterTile();
|
ctx.TileRegistry.RegisterTile();
|
||||||
|
ctx.ItemRegistry.RegisterItems();
|
||||||
var (width, height) = ctx.Window.GetSize();
|
var (width, height) = ctx.Window.GetSize();
|
||||||
ctx.FrontendGameState.WindowWidth = width;
|
ctx.FrontendGameState.WindowWidth = width;
|
||||||
ctx.FrontendGameState.WindowHeight = height;
|
ctx.FrontendGameState.WindowHeight = height;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
using Mine2d.engine;
|
using Mine2d.engine;
|
||||||
using Mine2d.engine.networking;
|
using Mine2d.engine.networking;
|
||||||
|
using Mine2d.game.core.items;
|
||||||
using Mine2d.game.core.tiles;
|
using Mine2d.game.core.tiles;
|
||||||
using Mine2d.game.state;
|
using Mine2d.game.state;
|
||||||
|
|
||||||
|
|
@ -15,7 +16,9 @@ public class Context
|
||||||
public Window Window { get; set; }
|
public Window Window { get; set; }
|
||||||
public Renderer Renderer { get; set; }
|
public Renderer Renderer { get; set; }
|
||||||
public TileRegistry TileRegistry { get; set; }
|
public TileRegistry TileRegistry { get; set; }
|
||||||
|
public ItemRegistry ItemRegistry { get; set; }
|
||||||
public ResourceLoader ResourceLoader { get; set; }
|
public ResourceLoader ResourceLoader { get; set; }
|
||||||
|
public TextureFactory TextureFactory { get; set; }
|
||||||
public static Context Instance { get; set; }
|
public static Context Instance { get; set; }
|
||||||
|
|
||||||
public Context(
|
public Context(
|
||||||
|
|
@ -35,8 +38,10 @@ public class Context
|
||||||
this.FrontendGameState = frontendGameState;
|
this.FrontendGameState = frontendGameState;
|
||||||
this.Renderer = renderer;
|
this.Renderer = renderer;
|
||||||
this.Window = window;
|
this.Window = window;
|
||||||
this.TileRegistry = new TileRegistry();
|
|
||||||
this.ResourceLoader = new ResourceLoader();
|
this.ResourceLoader = new ResourceLoader();
|
||||||
|
this.TextureFactory = new TextureFactory(this.ResourceLoader, this.Renderer);
|
||||||
|
this.TileRegistry = new TileRegistry();
|
||||||
|
this.ItemRegistry = new ItemRegistry();
|
||||||
Instance = this;
|
Instance = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ public class Breaking
|
||||||
chunk.SetTileAt(player.Mining, tile with { Hits = tile.Hits + 1 });
|
chunk.SetTileAt(player.Mining, tile with { Hits = tile.Hits + 1 });
|
||||||
if (tile.Hits >= hardness)
|
if (tile.Hits >= hardness)
|
||||||
{
|
{
|
||||||
|
ctx.Backend.ProcessPacket(new BlockBrokenPacket(player.Id, player.Mining, tile));
|
||||||
chunk.SetTileAt(player.Mining, STile.From(0));
|
chunk.SetTileAt(player.Mining, STile.From(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,6 +5,7 @@ public class Chunk
|
||||||
public STile[,] Tiles { get; set; } = new STile[Constants.ChunkSize, Constants.ChunkSize];
|
public STile[,] Tiles { get; set; } = new STile[Constants.ChunkSize, Constants.ChunkSize];
|
||||||
public int X { get; set; }
|
public int X { get; set; }
|
||||||
public int Y { get; set; }
|
public int Y { get; set; }
|
||||||
|
public List<Entity> Entities { get; set; } = new();
|
||||||
|
|
||||||
public Chunk(int x, int y)
|
public Chunk(int x, int y)
|
||||||
{
|
{
|
||||||
|
|
@ -76,4 +77,9 @@ public class Chunk
|
||||||
return pos - new Vector2(this.X * Constants.ChunkSize * Constants.TileSize,
|
return pos - new Vector2(this.X * Constants.ChunkSize * Constants.TileSize,
|
||||||
this.Y * Constants.ChunkSize * Constants.TileSize);
|
this.Y * Constants.ChunkSize * Constants.TileSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AddEntity(Entity entity)
|
||||||
|
{
|
||||||
|
this.Entities.Add(entity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
namespace Mine2d.game.core.data;
|
||||||
|
|
||||||
|
public class Entity
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; } = Guid.NewGuid();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
namespace Mine2d.game.core.data;
|
||||||
|
|
||||||
|
public enum ItemId
|
||||||
|
{
|
||||||
|
Air = 0,
|
||||||
|
Stone = 1,
|
||||||
|
}
|
||||||
|
|
@ -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; }
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,7 +4,7 @@ namespace Mine2d.game.core.tiles;
|
||||||
|
|
||||||
public class OreTile : Tile
|
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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,11 +34,6 @@ public class Tile
|
||||||
this.texture = texture;
|
this.texture = texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
~Tile()
|
|
||||||
{
|
|
||||||
SDL_DestroyTexture(this.texture);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Render(int x, int y, STile tile)
|
public void Render(int x, int y, STile tile)
|
||||||
{
|
{
|
||||||
var renderer = Context.Get().Renderer;
|
var renderer = Context.Get().Renderer;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -12,6 +12,7 @@ public class GameRenderer : IRenderer
|
||||||
this.renderers.Add(new WorldRenderer());
|
this.renderers.Add(new WorldRenderer());
|
||||||
this.renderers.Add(new PlayerRenderer());
|
this.renderers.Add(new PlayerRenderer());
|
||||||
this.renderers.Add(new WorldCursorRenderer());
|
this.renderers.Add(new WorldCursorRenderer());
|
||||||
|
this.renderers.Add(new ItemRenderer());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Render()
|
public void Render()
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -28,4 +28,5 @@ public class GameState
|
||||||
{
|
{
|
||||||
public List<Player> Players { get; set; } = new List<Player>();
|
public List<Player> Players { get; set; } = new List<Player>();
|
||||||
public World World { get; set; }
|
public World World { get; set; }
|
||||||
|
public uint Tick { get; set; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue