Exemple #1
0
        public bool ReceiveSignal(uint currentTic, Signal signal)
        {
            // If we don't already have an archived signal, store it.
            if (LastSignal == null)
            {
                LastSignal = signal;
                SignaledState = SignalState.ReceivedDeciding;
                return true;
            }

            return false;
        }
Exemple #2
0
        public void DoLogic(uint currentTic)
        {
            // place beacon
            if (MouseClicked)
            {
                // remove old vehicle
                if (EmergencyVehicle != null)
                {
                    Vehicles.RemoveAll(x => x.ID == 0);
                    EmergencyVehicle = null;
                }

                // get position
                int mouseX;
                int mouseY;
                Util.GetVirtualMouseCoordinates(out mouseX, out mouseY);

                // make a non-moving emergency beacon (vehicle)
                EmergencyVehicle = new Vehicle(0, new Vector2D(mouseX, mouseY), Vector2D.ZeroVector);

                // create the signal, and set the signal on the vehicle
                Signal signal = new Signal(0, 0, 1, EmergencyVehicle.Position, 128, (int)currentTic, (int)(currentTic + (Program.TicsPerSecond * 30)));
                EmergencyVehicle.ReceiveSignal(currentTic, signal);

                Vehicles.Add(EmergencyVehicle);

                MouseClicked = false;
            }

            // spawn vehicles
            if (_lastSpawnTic == 0 || currentTic - _lastSpawnTic >= (Program.TicsPerSecond * 1))
            {
                _lastSpawnTic = currentTic;
                foreach (var lane in TrafficLanes)
                {
                    if (lane.Direction == TrafficLane.LaneDirection.TopToBottom)
                    {
                        Vehicles.Add(new Vehicle(new Vector2D(lane.Origin.x, lane.Origin.y), Vector2D.UnitVectorY * 2));
                    }
                    else if (lane.Direction == TrafficLane.LaneDirection.BottomToTop)
                    {
                        Vehicles.Add(new Vehicle(new Vector2D(lane.Origin.x, lane.Origin.y), Vector2D.UnitVectorY * -2));
                    }
                    else if (lane.Direction == TrafficLane.LaneDirection.LeftToRight)
                    {
                        Vehicles.Add(new Vehicle(new Vector2D(lane.Origin.x, lane.Origin.y), Vector2D.UnitVectorX * 2));
                    }
                    else if (lane.Direction == TrafficLane.LaneDirection.RightToLeft)
                    {
                        Vehicles.Add(new Vehicle(new Vector2D(lane.Origin.x, lane.Origin.y), Vector2D.UnitVectorX * -2));
                    }
                }
            }

            // update vehicle logic
            foreach (Vehicle vehicle in Vehicles)
            {
                List<Vehicle> otherVehicles = new List<Vehicle>(Vehicles);
                otherVehicles.RemoveAll(x => x.ID == vehicle.ID);
                vehicle.DoLogic(currentTic, new List<SDL.SDL_Rect>(Squares), otherVehicles);
            }

            // hack, remove non-visible vehicles
            for (int index = 0; index < Vehicles.Count; index++)
            {
                Vehicle currentVehicle = Vehicles[index];
                if (currentVehicle.Position.x < 0 || currentVehicle.Position.x >= Program.RenderLogicalWidth
                    || currentVehicle.Position.y < 0 || currentVehicle.Position.y >= Program.RenderLogicalHeight)
                {
                    Vehicles.RemoveAt(index);
                }
            }
        }