예제 #1
0
        /// <summary>
        /// General method to obtain a drawing object for an entity, looks if a
        /// object exists for that entity, if not one is created. Therefore, it is checked if
        /// method for object creation has been speciefied for the type of entity
        /// and calls the corresponding method, otherwise throughs an exception.
        /// </summary>
        /// <param name="entity">Entity for which drawing object is required</param>
        /// <returns>Drawing object for entity</returns>
        public DrawingObject DrawingObjectPerEntity(Entity entity)
        {
            // if entity drawing object hasn't been created
            // the corresponding method is looked up
            if (!_drawingObjectPerEntity.ContainsKey(entity))
            {
                // in case no method to create a drawing object for the entity is provided an
                // exception is thrown
                if (!EntityVisualizationObjectCreatingMethodsPerType.ContainsKey(entity.GetType()))
                {
                    throw new InvalidOperationException(String.Format("Creation of Drawing Object for Entity {0} is not provided", entity.ToString()));
                }

                // create the drawing object
                DrawingObject newDrawingObject = EntityVisualizationObjectCreatingMethodsPerType[entity.GetType()](entity);

                // add drawing obecjt to system, has to be set to visual manually by user
                DrawingSystem.AddObject(newDrawingObject);

                // drawing object is stored in the dictionary
                _drawingObjectPerEntity.Add(entity, newDrawingObject);
            } // end if

            // the right key is now in the dictionary
            return(_drawingObjectPerEntity[entity]);
        } // end of DrawingObjectPerEntity
        protected Dictionary <int, AbstractEntity> menuItemList = new Dictionary <int, AbstractEntity>(); // For when selecting item to pick up etc...

        public AbstractRoguelike(int maxLogEntries)
        {
            this.ecs     = new BasicEcs(this);
            this.mapData = new MapData();
            this.gameLog = new GameLog(maxLogEntries);

            new CloseCombatSystem(this.ecs);
            new MovementSystem(this.ecs, this.mapData);

            this.CreateData();

            this.view          = new DefaultRLView(this);
            this.drawingSystem = new DrawingSystem(this.view, this);

            this.checkVisibilitySystem = new CheckMapVisibilitySystem(this.ecs, this.mapData);
            new ShootOnSightSystem(this.ecs, this.checkVisibilitySystem, this.ecs.entities);

            this.checkVisibilitySystem.process(this.playersUnits);
            this.damageSystem    = new DamageSystem(this.ecs, this.gameLog);
            this.explosionSystem = new ExplosionSystem(this.ecs, this.checkVisibilitySystem, this.damageSystem, this.mapData, this.ecs.entities);
            new TimerCountdownSystem(this.ecs, this.explosionSystem);
            this.pickupItemSystem = new PickupDropSystem();
            this.effectsSystem    = new EffectsSystem(this.ecs);
            new ThrowingSystem(this.ecs, this.mapData, this.gameLog);
            new ShootingSystem(this.ecs, this.gameLog);

            // Draw screen
            this.drawingSystem.Process(this.effectsSystem.effects);
        }
예제 #3
0
 public void AddSystem(ISystem system)
 {
     this.systems.Add(system);
     if (system is DrawingSystem)
     {
         this.drawingSystem = system as DrawingSystem;
     }
 }
예제 #4
0
        } // end of DrawingObjectPerEntity

        #endregion

        #region RemoveDrawingObjectPerEntity

        /// <summary>
        /// Removes the drawing object for an entity
        /// </summary>
        /// <param name="entity">Entity for which an object should be removed</param>
        public void RemoveDrawingObjectPerEntity(Entity entity)
        {
            if (_drawingObjectPerEntity.ContainsKey(entity))
            {
                DrawingSystem.RemoveObject(_drawingObjectPerEntity[entity]);
            }

            _drawingObjectPerEntity.Remove(entity);
        } // end of RemoveDrawingObjectPerEntity
예제 #5
0
 public Engine(IEntityManager entityManager, WorldSystem worldSystem, MovementSystem movementSystem,
               DrawingSystem drawingSystem, VisionSystem visionSystem, TimeTrackingSystem timeTrackingSystem)
 {
     this.entityManager      = entityManager;
     this.worldSystem        = worldSystem;
     this.movementSystem     = movementSystem;
     this.drawingSystem      = drawingSystem;
     this.visionSystem       = visionSystem;
     this.timeTrackingSystem = timeTrackingSystem;
 }
예제 #6
0
        //and so on
        //static PhysicsSystem physicsSystem;
        //static ScoreSystem scoreSystem;

        internal static void Init()
        {
            entitiesManager = new EntitiesManager();

            drawingSystem = new DrawingSystem(entitiesManager);
            movingSystem  = new MovingSystem(entitiesManager);
            //and so on


            CreateDemoEntities();
        }
        } // end of GetServedStart

        #endregion

        #region DrawHoldingEntity

        /// <summary>
        /// Visualized a dynamic holding entity (in this example a queue) by adding clients in the rectangle,
        /// no overflow handling (will draw infinitely)
        /// </summary>
        /// <param name="holdingEntity"></param>
        public void DrawHoldingEntity(IDynamicHoldingEntity holdingEntity)
        {
            DrawDynamicHoldingEntity drawFoHold = (DrawDynamicHoldingEntity)DrawingObjectPerEntity((Entity)holdingEntity);

            if (drawFoHold.MaxNumberPerson < holdingEntity.HoldedEntities.Count)
            {
                drawFoHold.DrawPersonCount.StringToDraw = holdingEntity.HoldedEntities.Count.ToString();

                if (!DrawingSystem.DrawingObjects.Contains(drawFoHold.DrawPersonCount))
                {
                    DrawingSystem.AddObject(drawFoHold.DrawPersonCount);
                }

                foreach (DrawingObject drawObject in holdingEntity.HoldedEntities.Select(p => DrawingObjectPerEntity(p)))
                {
                    drawObject.SetPosition(drawFoHold.DrawPersonCount.CurrentPosition - new Vector(-30, 0));
                } // end foreach
            }
            else
            {
                if (DrawingSystem.DrawingObjects.Contains(drawFoHold.DrawPersonCount))
                {
                    DrawingSystem.RemoveObject(drawFoHold.DrawPersonCount);
                }

                int    entitiesDrawn = 0;
                double entityW       = drawFoHold.SlotWidth;
                double entityH       = drawFoHold.SlotHeight;

                for (int i = 0; i < drawFoHold.NumberPersonVertical; i++)
                {
                    for (int j = 0; j < drawFoHold.NumberPersonHorizontal; j++)
                    {
                        if (entitiesDrawn == holdingEntity.HoldedEntities.Count)
                        {
                            return;
                        }

                        DrawingObject drawEntity = DrawingObjectPerEntity(holdingEntity.HoldedEntities[entitiesDrawn]);

                        drawEntity.SetPosition(drawFoHold.CurrentPosition + new Vector(j * entityW + drawFoHold.SlotWidth / 2, i * entityH));

                        entitiesDrawn++;
                    } // end for
                }     // end for
            }         // end if
        }             // end of DrawHoldingEntity
예제 #8
0
    static void Main(string[] args)
    {
        #region Composition Root
        var entityManager         = new EntityManager();
        var drawingComponentTypes =
            new Type[] {
            typeof(VisibleComponent),
            typeof(PhysicalComponent)
        };
        var drawingSystem    = new DrawingSystem(drawingComponentTypes);
        var visibleComponent =
            new PoolDecorator <VisibleComponent>(
                new ComponentPool <VisibleComponent>(), entityManager, drawingSystem);
        var physicalComponent =
            new PoolDecorator <PhysicalComponent>(
                new ComponentPool <PhysicalComponent>(), entityManager, drawingSystem);
        entityManager.AddSystems(drawingSystem);
        entityManager.AddComponentPool(visibleComponent);
        entityManager.AddComponentPool(physicalComponent);
        #endregion

        var entity = new Entity(entityManager.CreateEntity());

        entityManager.AddComponentToEntity(
            entity.EntityId,
            new PhysicalComponent()
        {
            X = 0, Y = 0
        });

        Console.WriteLine($"Added physical component, number of drawn entities: {drawingSystem.SystemEntities.Count}.");

        entityManager.AddComponentToEntity(
            entity.EntityId,
            new VisibleComponent()
        {
            Appearance = Appearance.Monster
        });

        Console.WriteLine($"Added visible component, number of drawn entities: {drawingSystem.SystemEntities.Count}.");

        entityManager.RemoveComponentFromEntity <VisibleComponent>(entity.EntityId);

        Console.WriteLine($"Removed visible component, number of drawn entities: {drawingSystem.SystemEntities.Count}.");

        Console.ReadLine();
    }
        } // end of NumberSlotAssignString

        #endregion

        //--------------------------------------------------------------------------------------------------
        // Methods
        //--------------------------------------------------------------------------------------------------

        #region AdditionalStaticVisualization

        /// <summary>
        /// Calls base class method and additiona visualization for string captions
        /// </summary>
        /// <param name="initializationTime">Time at which static visualization is generated</param>
        /// <param name="simModel">Simulation model for which the visuslization is generated</param>
        /// <param name="parentControlUnit">Control unit that is visualized</param>
        public override void AdditionalStaticVisualization(DateTime initializationTime, SimulationModel simModel, ControlUnit parentControlUnit)
        {
            base.AdditionalStaticVisualization(initializationTime, simModel, parentControlUnit);

            DrawingObjectString personWaitingforSlotString = new DrawingObjectString(Position - new Vector(0, 50), "Patients Waiting for Slot: ", CustomStringAlignment.Left, 24, Colors.Gray);

            _numberSlotWaitString = new DrawingObjectString(Position - new Vector(-500, 50), "0", CustomStringAlignment.Left, 24, Colors.Gray);

            DrawingSystem.AddObject(personWaitingforSlotString);
            DrawingSystem.AddObject(NumberSlotWaitString);

            DrawingObjectString personWaitingforSlotAssignString = new DrawingObjectString(Position - new Vector(0, 100), "Patients Waiting to be assigned to Slot: ", CustomStringAlignment.Left, 24, Colors.Gray);

            _numberSlotAssingString = new DrawingObjectString(Position - new Vector(-500, 100), "0", CustomStringAlignment.Left, 24, Colors.Gray);

            DrawingSystem.AddObject(NumberSlotAssignString);
            DrawingSystem.AddObject(personWaitingforSlotAssignString);
        } // end of AdditionalStaticVisualization
        }             // end of DrawHoldingEntity

        #endregion

        #region AdditionalStaticVisualization

        /// <summary>
        /// Static visualization of model, draws servers and queues
        /// </summary>
        /// <param name="initializationTime">Time static visualization is initialized</param>
        /// <param name="simModel">Simulation model to draw</param>
        /// <param name="parentControlUnit">Control unit to draw</param>
        public override void AdditionalStaticVisualization(DateTime initializationTime, SimulationModel simModel, ControlUnit parentControlUnit)
        {
            ControlUnitQueuingModel queueControl = (ControlUnitQueuingModel)parentControlUnit;

            DrawingSystem.ClearSystem();

            for (int i = 0; i < queueControl.Queues.Count; i++)
            {
                DrawingObject drawForQueue = DrawingObjectPerEntity(queueControl.Queues[i]);
                drawForQueue.SetPosition(new Point(20, i * 80));
            } // end for

            for (int i = 0; i < queueControl.Servers.Count; i++)
            {
                DrawingObject drawForServer = DrawingObjectPerEntity(queueControl.Servers[i]);
                drawForServer.SetPosition(new Point(300, i * 80));
            } // end for
        }     // end of AdditionalStaticVisualization
예제 #11
0
        }         // end of

        #endregion

        #region CreateModel

        public void CreateModel()
        {
            //_simulationModel = new SimulationModelQueuing((DateTime)DatePickerStartDate.SelectedDate,
            //    (DateTime)DatePickerEndDate.SelectedDate,
            //    2,
            //    3,
            //    5,
            //    10);

            DrawingSystem.ClearSystem();


            _simulationModel = new HospitalSimulationModelWithVisualization((DateTime)DatePickerStartDate.SelectedDate,
                                                                            (DateTime)DatePickerEndDate.SelectedDate);

            _simulationEngine = new SimulationEngine();
            SimulationEngine.LoggingEngine   = new BaseLoggingEngine(SimulationModel);
            SimulationEngine.CreateEventLog  = true;
            SimulationEngine.SimulationModel = SimulationModel;
            SimulationModel.Initialize(SimulationEngine);
            SimulationModel.InitializeVisualization(DrawingSystem);
        } // end of CreateModel
예제 #12
0
        //--------------------------------------------------------------------------------------------------
        // Constructor
        //--------------------------------------------------------------------------------------------------

        #region MainWindow

        public MainWindow()
        {
            Loaded += WainWindowOnLoad;

            InitializeComponent();

            #region InitalizeStartEndDate

            DatePickerStartDate.SelectedDate = DateTime.Now;
            DatePickerEndDate.SelectedDate   = DateTime.Now.AddMonths(1);

            #endregion

            #region InitiaizeDrawingSystem

            _drawingSystem = new DrawingOnCoordinateSystem(0, 300);
            DrawingSystem.VerticalAlignment   = VerticalAlignment.Stretch;
            DrawingSystem.HorizontalAlignment = HorizontalAlignment.Stretch;
            DrawingSystem.SetValue(Grid.RowProperty, 1);
            DrawingSystem.SetValue(Grid.ColumnProperty, 1);
            DrawingSystem.SetValue(Grid.ColumnSpanProperty, 2);

            MainGrid.Children.Add(DrawingSystem);

            #endregion

            #region IntiliazeBackgroundWorker

            _backGroundWorkerNonVisualization = new BackgroundWorker();
            _backGroundWorkerNonVisualization.WorkerReportsProgress      = true;
            _backGroundWorkerNonVisualization.WorkerSupportsCancellation = true;
            _backGroundWorkerNonVisualization.DoWork             += new System.ComponentModel.DoWorkEventHandler(BackGroundWorkerNonVisualizationDoWork);
            _backGroundWorkerNonVisualization.ProgressChanged    += new ProgressChangedEventHandler(BackGroundWorkerNonVisualizationProgressChanged);
            _backGroundWorkerNonVisualization.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackGroundWorkerNonVisualizationRunWorkerCompleted);

            #endregion

            ComboBoxTimeBase.SelectedIndex = 0;
            _simulationRunning             = false;
            _simulationInitialized         = false;

            _simulationTimer      = new DispatcherTimer();
            SimulationTimer.Tick += PlaySimulationTick;
            TextBoxSimSpeed.Text  = SimulationSpeed.ToString();

            CreateModel();

            #region InitializeClock

            _simulationDisplayClock = new DrawAnalogClockWithDate(Colors.Black, 0, 0);
            SimulationDisplayClock.VerticalAlignment   = VerticalAlignment.Stretch;
            SimulationDisplayClock.HorizontalAlignment = HorizontalAlignment.Stretch;
            SimulationDisplayClock.SetValue(Grid.RowProperty, 0);
            SimulationDisplayClock.SetValue(Grid.ColumnProperty, 2);

            MainGrid.Children.Add(SimulationDisplayClock);

            Loaded += delegate
            {
                SimulationDisplayClock.Initialize(SimulationModel.StartTime);
            };

            #endregion
        } // end of MainWindow
        } // end of GetServedStart

        #endregion

        #region GetServedEnd

        /// <summary>
        /// Method to change visualiztion at service end, remove client drawing object from drawing system
        /// </summary>
        /// <param name="activity">GetServed activity</param>
        /// <param name="time">Time activity is ended</param>
        public void GetServedEnd(Activity activity, DateTime time)
        {
            DrawingSystem.RemoveObject(DrawingObjectPerEntity(((ActivityGetServed)activity).Client));
        } // end of GetServedStart