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