72 lines
2.8 KiB
C#
72 lines
2.8 KiB
C#
using System;
|
|
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
using MrGameEng.Core;
|
|
|
|
namespace LittleSim.Web;
|
|
|
|
/// <summary>
|
|
/// Веб-хост LittleSim поверх KNI (BlazorGL/WebGL) — браузерный аналог
|
|
/// MrGameEng.Host.GameHost: владеет EngineContext ядра, гонит GameClock и фазы сцены.
|
|
/// Цикл тикается из requestAnimationFrame (см. Pages/Index.razor.cs). Когда графика
|
|
/// движка научится собираться под KNI, этот класс переедет в MrGameEng.Host.Web.
|
|
/// </summary>
|
|
public class LittleSimWebGame : Game
|
|
{
|
|
/// <summary>Контекст ядра движка, общий со сценами и системами.</summary>
|
|
public EngineContext Context { get; } = new EngineContext();
|
|
|
|
private GraphicsDeviceManager _graphics;
|
|
private SpriteBatch _spriteBatch = null!;
|
|
private Texture2D _pixel = null!;
|
|
private WorldViewScene _scene = null!;
|
|
|
|
/// <summary>Игра-наблюдатель: мира не создаёт, ждёт <see cref="Connect"/> из UI.</summary>
|
|
public LittleSimWebGame()
|
|
{
|
|
_graphics = new GraphicsDeviceManager(this);
|
|
Content.RootDirectory = "Content";
|
|
}
|
|
|
|
/// <summary>Состояние соединения со сценой-наблюдателем — читает оверлей подключения.</summary>
|
|
public ConnectionStatus Status => _scene?.Status ?? ConnectionStatus.Idle;
|
|
|
|
/// <summary>Число реплицированных жителей — для статуса в оверлее.</summary>
|
|
public int EntityCount => _scene?.EntityCount ?? 0;
|
|
|
|
/// <summary>Подключиться к серверу <paramref name="server"/> (вызывается из Blazor-оверлея).</summary>
|
|
public void Connect(Uri server) => _scene?.Connect(server);
|
|
|
|
/// <inheritdoc />
|
|
protected override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
_scene = new WorldViewScene(() => _spriteBatch, () => _pixel);
|
|
Context.Scenes.Switch(_scene);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override void LoadContent()
|
|
{
|
|
_spriteBatch = new SpriteBatch(GraphicsDevice);
|
|
_pixel = new Texture2D(GraphicsDevice, 1, 1);
|
|
_pixel.SetData(new[] { Color.White });
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override void Update(GameTime gameTime)
|
|
{
|
|
Context.Clock.Advance((float)gameTime.ElapsedGameTime.TotalSeconds);
|
|
Context.Scenes.Update(Context.Clock);
|
|
base.Update(gameTime);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override void Draw(GameTime gameTime)
|
|
{
|
|
GraphicsDevice.Clear(new Color(12, 16, 24));
|
|
Context.Scenes.Draw(Context.Clock);
|
|
base.Draw(gameTime);
|
|
}
|
|
}
|