added remote backend

This commit is contained in:
MasterGordon 2022-10-26 14:57:00 +02:00
parent d4c697c5b9
commit ceeeb070e9
6 changed files with 64 additions and 11 deletions

View File

@ -2,8 +2,8 @@
{ {
static void Main(string[] args) static void Main(string[] args)
{ {
// bool isHost = args.Contains("--host"); bool isHost = args.Contains("--host");
bool isHost = true; // bool isHost = true;
var game = new MultiPlayerGame(isHost); var game = new MultiPlayerGame(isHost);
game.Run(); game.Run();
} }

View File

@ -29,8 +29,8 @@ class MultiPlayerGame : Game
window window
); );
} }
ctx.Frontend.Init();
ctx.Backend.Init(); ctx.Backend.Init();
ctx.Frontend.Init();
} }
protected override void draw() protected override void draw()

View File

@ -5,13 +5,18 @@ using WatsonTcp;
class Backend : IBackend class Backend : IBackend
{ {
private WatsonTcpServer server;
private int nextId = 0;
public void Process(double dt) public void Process(double dt)
{ {
nextId++;
var ctx = Context.Get(); var ctx = Context.Get();
ctx.GameState.PlayerPositions.ForEach(player => ctx.GameState.PlayerPositions.ForEach(player =>
{ {
player.position += player.movement; player.position += player.movement;
}); });
this.sendGameState();
} }
public void ProcessPacket(ValueType packet) public void ProcessPacket(ValueType packet)
@ -26,6 +31,7 @@ class Backend : IBackend
} }
if (packet is ConnectPacket connectPacket) if (packet is ConnectPacket connectPacket)
{ {
Console.WriteLine($"Player {connectPacket.playerName} connected");
gameState.PlayerPositions.Add(new Player gameState.PlayerPositions.Add(new Player
{ {
name = connectPacket.playerName, name = connectPacket.playerName,
@ -33,6 +39,7 @@ class Backend : IBackend
movement = new Vector2(0, 0) movement = new Vector2(0, 0)
}); });
} }
this.sendGameState();
} }
public void Init() public void Init()
@ -42,7 +49,7 @@ class Backend : IBackend
public void Run() public void Run()
{ {
var server = new WatsonTcpServer("127.0.0.1", 42069); server = new WatsonTcpServer("127.0.0.1", 42069);
server.Events.ClientConnected += this.clientConnected; server.Events.ClientConnected += this.clientConnected;
server.Events.ClientDisconnected += this.clientDisconnected; server.Events.ClientDisconnected += this.clientDisconnected;
server.Events.MessageReceived += this.messageReceived; server.Events.MessageReceived += this.messageReceived;
@ -67,7 +74,26 @@ class Backend : IBackend
private void messageReceived(object? sender, MessageReceivedEventArgs args) private void messageReceived(object? sender, MessageReceivedEventArgs args)
{ {
var message = Encoding.UTF8.GetString(args.Data); Console.WriteLine("Message Received: " + args.IpPort);
Console.WriteLine("Message received: " + args.IpPort + " " + message); var packet = Converter.ParsePacket(args.Data);
Console.WriteLine("Received packet: " + packet);
if (packet != null)
{
this.ProcessPacket(packet);
}
}
private void sendGameState()
{
if (server == null) return;
var clients = server.ListClients();
if (clients.Count() == 0) return;
var gameState = Context.Get().GameState;
var json = JsonConvert.SerializeObject(gameState);
var bytes = Encoding.UTF8.GetBytes(json);
foreach (var client in clients)
{
server.Send(client, bytes);
}
} }
} }

View File

@ -1,5 +1,11 @@
using WatsonTcp;
using Newtonsoft.Json;
using System.Text;
class RemoteBackend : IBackend class RemoteBackend : IBackend
{ {
private WatsonTcpClient client;
public void Process(double dt) public void Process(double dt)
{ {
@ -7,11 +13,24 @@ class RemoteBackend : IBackend
public void ProcessPacket(ValueType packet) public void ProcessPacket(ValueType packet)
{ {
throw new NotImplementedException(); var json = JsonConvert.SerializeObject(packet);
var bytes = Encoding.UTF8.GetBytes(json);
client.Send(bytes);
} }
public void Init() public void Init()
{ {
client = new WatsonTcpClient("127.0.0.1", 42069);
client.Events.MessageReceived += (sender, args) =>
{
var ctx = Context.Get();
var message = Encoding.UTF8.GetString(args.Data);
var packet = JsonConvert.DeserializeObject<GameState>(message);
if (packet != null)
{
ctx.GameState = packet;
}
};
client.Connect();
} }
} }

View File

@ -3,9 +3,12 @@ using static SDL2.SDL;
class Frontend : IFrontend class Frontend : IFrontend
{ {
private string playerName = "Player";
public void Init() public void Init()
{ {
var conntectPacket = new ConnectPacket("Gordon"); this.playerName = Context.Get().IsHost ? "Host" : "Client";
var conntectPacket = new ConnectPacket(playerName);
Context.Get().Backend.ProcessPacket(conntectPacket); Context.Get().Backend.ProcessPacket(conntectPacket);
} }
@ -66,7 +69,7 @@ class Frontend : IFrontend
var movement = ctx.FrontendGameState.movementInput; var movement = ctx.FrontendGameState.movementInput;
if (movement.Length() > 0) if (movement.Length() > 0)
movement = Vector2.Normalize(movement); movement = Vector2.Normalize(movement);
ctx.Backend.ProcessPacket(new MovePacket("Gordon", movement)); ctx.Backend.ProcessPacket(new MovePacket(playerName, movement));
} }
if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_ESCAPE) if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_ESCAPE)
{ {
@ -75,9 +78,12 @@ class Frontend : IFrontend
} }
ctx.Renderer.Clear(); ctx.Renderer.Clear();
ctx.Renderer.SetColor(255, 0, 0, 255);
ctx.GameState.PlayerPositions.ForEach(player => ctx.GameState.PlayerPositions.ForEach(player =>
{ {
if (player.name == playerName)
ctx.Renderer.SetColor(0, 0, 255, 255);
else
ctx.Renderer.SetColor(255, 0, 0, 255);
ctx.Renderer.DrawRect(player.position.X, player.position.Y, 10, 10); ctx.Renderer.DrawRect(player.position.X, player.position.Y, 10, 10);
}); });
ctx.Renderer.Present(); ctx.Renderer.Present();

View File

@ -19,9 +19,11 @@ class Converter
throw new System.Exception("Packet has no type"); throw new System.Exception("Packet has no type");
} }
var packetType = type.Value<string>(); var packetType = type.Value<string>();
Console.WriteLine("Packet type: " + packetType);
return packetType switch return packetType switch
{ {
"move" => parsedRaw.ToObject<MovePacket>(), "move" => parsedRaw.ToObject<MovePacket>(),
"connect" => parsedRaw.ToObject<ConnectPacket>(),
_ => throw new System.Exception("Unknown packet type") _ => throw new System.Exception("Unknown packet type")
}; };
} }