145 lines
5.4 KiB
C#
145 lines
5.4 KiB
C#
using System.Numerics;
|
|
using static SDL2.SDL;
|
|
|
|
class Frontend : IFrontend
|
|
{
|
|
private string playerName = "Player";
|
|
private bool fullscreen = false;
|
|
|
|
public void Init()
|
|
{
|
|
var ctx = Context.Get();
|
|
this.playerName = Context.Get().IsHost ? "Host" : "Client";
|
|
var guid = Guid.NewGuid();
|
|
ctx.FrontendGameState.PlayerGuid = guid;
|
|
var connectPacket = new ConnectPacket(playerName, guid);
|
|
ctx.Backend.ProcessPacket(connectPacket);
|
|
ctx.TileRegistry.RegisterTile();
|
|
var windowSize = ctx.Window.GetSize();
|
|
ctx.FrontendGameState.WindowWidth = windowSize.width;
|
|
ctx.FrontendGameState.WindowHeight = windowSize.height;
|
|
}
|
|
|
|
public void Process()
|
|
{
|
|
var ctx = Context.Get();
|
|
while (SDL_PollEvent(out var e) != 0)
|
|
{
|
|
if (e.type == SDL_EventType.SDL_QUIT)
|
|
{
|
|
System.Environment.Exit(0);
|
|
}
|
|
if (e.type == SDL_EventType.SDL_WINDOWEVENT)
|
|
{
|
|
if (e.window.windowEvent == SDL_WindowEventID.SDL_WINDOWEVENT_RESIZED)
|
|
{
|
|
ctx.FrontendGameState.WindowWidth = e.window.data1;
|
|
ctx.FrontendGameState.WindowHeight = 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)
|
|
{
|
|
var movementInput = ctx.FrontendGameState.MovementInput;
|
|
if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_F11)
|
|
{
|
|
if (!fullscreen)
|
|
{
|
|
SDL_SetWindowFullscreen(
|
|
ctx.Window.GetRaw(),
|
|
(uint)SDL_WindowFlags.SDL_WINDOW_FULLSCREEN_DESKTOP
|
|
);
|
|
}
|
|
else
|
|
{
|
|
SDL_SetWindowFullscreen(ctx.Window.GetRaw(), 0);
|
|
}
|
|
fullscreen = !fullscreen;
|
|
}
|
|
if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_A)
|
|
{
|
|
movementInput.X -= 1;
|
|
}
|
|
if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_D)
|
|
{
|
|
movementInput.X += 1;
|
|
}
|
|
if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_W)
|
|
{
|
|
movementInput.Y -= 1;
|
|
}
|
|
if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_S)
|
|
{
|
|
movementInput.Y += 1;
|
|
}
|
|
ctx.FrontendGameState.MovementInput = movementInput;
|
|
}
|
|
if (e.type == SDL_EventType.SDL_KEYUP && e.key.repeat == 0)
|
|
{
|
|
var movementInput = ctx.FrontendGameState.MovementInput;
|
|
if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_A)
|
|
{
|
|
movementInput.X += 1;
|
|
}
|
|
if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_D)
|
|
{
|
|
movementInput.X -= 1;
|
|
}
|
|
if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_W)
|
|
{
|
|
movementInput.Y += 1;
|
|
}
|
|
if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_S)
|
|
{
|
|
movementInput.Y -= 1;
|
|
}
|
|
ctx.FrontendGameState.MovementInput = movementInput;
|
|
}
|
|
if (
|
|
e.key.keysym.scancode
|
|
is SDL_Scancode.SDL_SCANCODE_A
|
|
or SDL_Scancode.SDL_SCANCODE_D
|
|
or SDL_Scancode.SDL_SCANCODE_W
|
|
or SDL_Scancode.SDL_SCANCODE_S
|
|
&& e.key.repeat == 0
|
|
&& e.type is SDL_EventType.SDL_KEYDOWN or SDL_EventType.SDL_KEYUP
|
|
)
|
|
{
|
|
if (e.key.repeat == 1)
|
|
continue;
|
|
var movement = ctx.FrontendGameState.MovementInput;
|
|
if (movement.Length() > 0)
|
|
movement = Vector2.Normalize(movement);
|
|
ctx.Backend.ProcessPacket(new MovePacket(playerName, movement));
|
|
}
|
|
if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_ESCAPE)
|
|
{
|
|
System.Environment.Exit(0);
|
|
}
|
|
}
|
|
|
|
ctx.Renderer.Clear();
|
|
var scale = ctx.GameState.Settings.GameScale;
|
|
var camera = Context.Get().FrontendGameState.Camera;
|
|
new WorldRenderer().Render();
|
|
ctx.GameState.Players.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 - (int)camera.position.X) * scale,
|
|
(player.Position.Y - (int)camera.position.Y) * scale - 10,
|
|
10,
|
|
10
|
|
);
|
|
});
|
|
ctx.Renderer.Present();
|
|
}
|
|
}
|