public void ChangeRenderer(Func <Panel, Action, IGraphicsManagerWrapper> graphicsManagerWrapperFactory) { lock (_locker) { _graphicsManager.Dispose(); _graphicsManager = CreateGraphicsManagerWrapperWithFactory(graphicsManagerWrapperFactory); _graphicsManager.StartRendering(); } }
public SimulationRenderHelper(Panel gamePanel, RenderZoneOptions renderZoneOptions, SimulationOptions options) { if (gamePanel == null) { throw new ArgumentNullException(nameof(gamePanel)); } gamePanel.Controls.Clear(); SimulationSession = new SimulationSession(options); _zoneSelectionPanel.Width = 160; _zoneSelectionPanel.Dock = DockStyle.Left; _viewportPanel.Dock = DockStyle.Fill; _viewportPanel.AutoScroll = true; gamePanel.Controls.Add(_viewportPanel); gamePanel.Controls.Add(_zoneSelectionPanel); _zoneSelectionPanel.BringToFront(); _viewportPanel.BringToFront(); if (renderZoneOptions == null) { throw new ArgumentNullException(nameof(renderZoneOptions)); } _canvasPanel = new Panel { BackColor = EmptyZoneConsumption.DefaultColor, Size = _tilesetAccessor.GetAreaSize(SimulationSession.Area), Dock = DockStyle.None }; _viewportPanel.Controls.Add(_canvasPanel); _zoneSelectionPanelBehaviour = new ZoneSelectionPanelCreator( area: SimulationSession.Area, targetPanel: _zoneSelectionPanel ); MouseEventHandler eventHandler = (sender, e) => { var point = _canvasPanel.PointToClient(Cursor.Position); var zone = GetZoneStateFor(point); var zoneConsumption = (e.Button == MouseButtons.Right) ? new EmptyZoneConsumption() : _zoneSelectionPanelBehaviour.CreateNewCurrentZoneConsumption(); var result = SimulationSession.ConsumeZoneAt(zone, zoneConsumption); if (result == null) { throw new InvalidOperationException(); } }; _canvasPanel.MouseDown += eventHandler; _canvasPanel.MouseMove += (sender, e) => { if (e.Button != MouseButtons.None && _zoneSelectionPanelBehaviour.IsCurrentlyNetworkZoning) { eventHandler(sender, e); } }; _zoneRenderInfos = SimulationSession.Area .EnumerateZoneInfos() .ToDictionary(x => x, zoneRenderInfo => new ZoneRenderInfo( zoneInfo: zoneRenderInfo, createRectangle: zonePoint => new Rectangle( x: zonePoint.Point.X * _tilesetAccessor.TileWidthAndSizeInPixels, y: zonePoint.Point.Y * _tilesetAccessor.TileWidthAndSizeInPixels, width: _tilesetAccessor.TileWidthAndSizeInPixels, height: _tilesetAccessor.TileWidthAndSizeInPixels ), tilesetAccessor: _tilesetAccessor, renderZoneOptions: renderZoneOptions )); _graphicsManager = CreateGraphicsManagerWrapperWithFactory(renderZoneOptions.SelectedGraphicsManager.Factory); }