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; }
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); } } }