예제 #1
0
 public void ChangeRenderer(Func <Panel, Action, IGraphicsManagerWrapper> graphicsManagerWrapperFactory)
 {
     lock (_locker)
     {
         _graphicsManager.Dispose();
         _graphicsManager = CreateGraphicsManagerWrapperWithFactory(graphicsManagerWrapperFactory);
         _graphicsManager.StartRendering();
     }
 }
예제 #2
0
        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);
        }