added camera

This commit is contained in:
MasterGordon 2022-10-31 18:32:55 +01:00
parent 74245c8409
commit 7213239038
10 changed files with 96 additions and 21 deletions

View File

@ -16,14 +16,14 @@ class Backend : IBackend
while (pendingPackets.Count > 0) while (pendingPackets.Count > 0)
{ {
var packet = pendingPackets.Dequeue(); var packet = pendingPackets.Dequeue();
this.ProcessPacket(packet); this.publisher.Publish(packet);
} }
this.sendGameState();
} }
public void ProcessPacket(ValueType packet) public void ProcessPacket(ValueType packet)
{ {
this.publisher.Publish(packet); pendingPackets.Enqueue(packet);
this.sendGameState();
} }
public void Init() public void Init()

View File

@ -30,7 +30,7 @@ class Publisher
continue; continue;
} }
var attr = (Interaction)attrs2[0]; var attr = (Interaction)attrs2[0];
if (attr.Kind != this.kind && attr.Kind != InteractorKind.Hybrid) if (attr.Kind == InteractorKind.Server && this.kind == InteractorKind.Client)
{ {
continue; continue;
} }
@ -67,8 +67,12 @@ class Publisher
public void Publish(ValueType packet) public void Publish(ValueType packet)
{ {
var type = PacketUtils.GetType(packet); var type = PacketUtils.GetType(packet);
if (type != "tick")
Console.WriteLine("Publishing packet: " + type);
if (subscribers.ContainsKey(type)) if (subscribers.ContainsKey(type))
{ {
if (type != "tick")
Console.WriteLine("Found " + subscribers[type].Count + " subscribers");
foreach (var del in subscribers[type]) foreach (var del in subscribers[type])
{ {
del.DynamicInvoke(packet); del.DynamicInvoke(packet);

View File

@ -36,3 +36,14 @@ readonly struct TickPacket
this.tick = tick; this.tick = tick;
} }
} }
readonly struct SelfMovedPacket
{
public readonly string type = "selfMoved";
public readonly Vector2 target;
public SelfMovedPacket(Vector2 target)
{
this.target = target;
}
}

View File

@ -7,10 +7,10 @@ class Connect
public static void ConnectServer(ConnectPacket packet) public static void ConnectServer(ConnectPacket packet)
{ {
var ctx = Context.Get(); var ctx = Context.Get();
var player = ctx.GameState.PlayerPositions.Find(p => p.name == packet.playerName); var player = ctx.GameState.Players.Find(p => p.name == packet.playerName);
if (player == null) if (player == null)
{ {
ctx.GameState.PlayerPositions.Add( ctx.GameState.Players.Add(
new Player new Player
{ {
name = packet.playerName, name = packet.playerName,

View File

@ -1,24 +1,41 @@
using System.Numerics;
[Interactor] [Interactor]
class Move class Move
{ {
[Interaction(InteractorKind.Hybrid, "move")] [Interaction(InteractorKind.Client, "move")]
public static void MoveHybrid(MovePacket packet) public static void MoveClient(MovePacket packet)
{ {
var ctx = Context.Get(); var ctx = Context.Get();
var player = ctx.GameState.PlayerPositions.Find(p => p.name == packet.playerName); var player = ctx.GameState.Players.Find(p => p.name == packet.playerName);
if (player != null) if (player != null)
{ {
player.movement = packet.movement * 4; player.movement = packet.movement * 4;
} }
} }
[Interaction(InteractorKind.Hybrid, "tick")] [Interaction(InteractorKind.Client, "tick")]
public static void TickHybrid(TickPacket packet) public static void TickClient(TickPacket packet)
{ {
var ctx = Context.Get(); var ctx = Context.Get();
ctx.GameState.PlayerPositions.ForEach(player => foreach (var player in ctx.GameState.Players)
{ {
if (player.movement == Vector2.Zero)
{
continue;
}
player.position += player.movement; player.position += player.movement;
}); if (player.guid == ctx.FrontendGameState.PlayerGuid)
{
ctx.Backend.ProcessPacket(new SelfMovedPacket(player.position));
}
}
}
[Interaction(InteractorKind.Client, "selfMoved")]
public static void SelfMovedClient(SelfMovedPacket packet)
{
var ctx = Context.Get();
ctx.FrontendGameState.Camera.CenterOn(packet.target);
} }
} }

View File

@ -0,0 +1,21 @@
using System.Numerics;
class Camera
{
public Vector2 position;
public Camera()
{
position = Vector2.Zero;
}
public void CenterOn(Vector2 target)
{
Console.WriteLine("Centering camera on " + target);
var ctx = Context.Get();
var scale = ctx.GameState.Settings.GameScale;
var windowWidth = ctx.FrontendGameState.WindowWidth;
var windowHeight = ctx.FrontendGameState.WindowHeight;
position = target - (new Vector2(windowWidth / 2, windowHeight / 2)) / scale;
}
}

View File

@ -28,6 +28,13 @@ class Tile
{ {
var renderer = Context.Get().Renderer; var renderer = Context.Get().Renderer;
var scale = Context.Get().GameState.Settings.GameScale; var scale = Context.Get().GameState.Settings.GameScale;
renderer.DrawTexture(this.Texture, x * scale, y * scale, 16 * scale, 16 * scale); var camera = Context.Get().FrontendGameState.Camera;
renderer.DrawTexture(
this.Texture,
(x - (int)camera.position.X) * scale,
(y - (int)camera.position.Y) * scale,
16 * scale,
16 * scale
);
} }
} }

View File

@ -2,7 +2,6 @@ enum InteractorKind
{ {
Client, Client,
Server, Server,
Hybrid
} }
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]

View File

@ -8,12 +8,16 @@ class Frontend : IFrontend
public void Init() public void Init()
{ {
var ctx = Context.Get();
this.playerName = Context.Get().IsHost ? "Host" : "Client"; this.playerName = Context.Get().IsHost ? "Host" : "Client";
var guid = Guid.NewGuid(); var guid = Guid.NewGuid();
Context.Get().FrontendGameState.PlayerGuid = guid; ctx.FrontendGameState.PlayerGuid = guid;
var connectPacket = new ConnectPacket(playerName, guid); var connectPacket = new ConnectPacket(playerName, guid);
Context.Get().Backend.ProcessPacket(connectPacket); ctx.Backend.ProcessPacket(connectPacket);
Context.Get().TileRegistry.RegisterTile(); ctx.TileRegistry.RegisterTile();
var windowSize = ctx.Window.GetSize();
ctx.FrontendGameState.WindowWidth = windowSize.width;
ctx.FrontendGameState.WindowHeight = windowSize.height;
} }
public void Process() public void Process()
@ -32,6 +36,10 @@ class Frontend : IFrontend
ctx.FrontendGameState.WindowWidth = e.window.data1; ctx.FrontendGameState.WindowWidth = e.window.data1;
ctx.FrontendGameState.WindowHeight = e.window.data2; ctx.FrontendGameState.WindowHeight = e.window.data2;
Console.WriteLine($"Window resized to {e.window.data1}x{e.window.data2}"); Console.WriteLine($"Window resized to {e.window.data1}x{e.window.data2}");
var player = ctx.GameState.Players.Find(
p => p.guid == ctx.FrontendGameState.PlayerGuid
);
ctx.FrontendGameState.Camera.CenterOn(player.position);
} }
} }
if (e.type == SDL_EventType.SDL_KEYDOWN && e.key.repeat == 0) if (e.type == SDL_EventType.SDL_KEYDOWN && e.key.repeat == 0)
@ -115,14 +123,21 @@ class Frontend : IFrontend
} }
ctx.Renderer.Clear(); ctx.Renderer.Clear();
var scale = ctx.GameState.Settings.GameScale;
var camera = Context.Get().FrontendGameState.Camera;
new WorldRenderer().Render(); new WorldRenderer().Render();
ctx.GameState.PlayerPositions.ForEach(player => ctx.GameState.Players.ForEach(player =>
{ {
if (player.name == playerName) if (player.name == playerName)
ctx.Renderer.SetColor(0, 0, 255, 255); ctx.Renderer.SetColor(0, 0, 255, 255);
else else
ctx.Renderer.SetColor(255, 0, 0, 255); ctx.Renderer.SetColor(255, 0, 0, 255);
ctx.Renderer.DrawRect(player.position.X, player.position.Y, 10, 10); ctx.Renderer.DrawRect(
(player.position.X - (int)camera.position.X) * scale,
(player.position.Y - (int)camera.position.Y) * scale,
10,
10
);
}); });
ctx.Renderer.Present(); ctx.Renderer.Present();
} }

View File

@ -15,6 +15,7 @@ class FrontendGameState
public int WindowWidth; public int WindowWidth;
public int WindowHeight; public int WindowHeight;
public Guid PlayerGuid; public Guid PlayerGuid;
public Camera Camera = new Camera();
} }
class Settings class Settings
@ -25,7 +26,7 @@ class Settings
class GameState class GameState
{ {
public List<Player> PlayerPositions { 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 Settings Settings { get; set; } = new Settings(); public Settings Settings { get; set; } = new Settings();
} }