Timas » Вт янв 23, 2007 07:29
НаписАть чтоли, что-нибудь движенческое. Вообще, я не программер, а если программер, то только под ДОС (когда-нибудь мир узнает своих героев!). Но вот мое мнение.
Про автоблокировку с подвижными границами РЦ. Штука хорошая, дает кодирование вслед идущим поездам в зависимости от скорости впереди идущих. Можно реализовать, но, скажем, только для MagLev.
Теперь про Михалычей, пути, светофоры. Я не знаком со структурами данных для игры, поэтому все выкладки - это лишь теория, а вам, программеры, творить.
1. Все светофоы делятся на светофоры автодействия и сваетофоры "полуавтоматического действия" (аки в метро). К первым относятся светофоры на перегонах и выходные с развязок, ко вторым - все остальные. Тип светофора определяется при его установке/укладке пути: если за светофором встречается хотя бы одно разветвление, то он - полуавтомат, нормальное положение его - закрытое. Это будет соответствовать положению ПТЭ о нормальном положении сигналов на станциях и перегонах и добавит видимого реализна. Минус - один, при строительстве пути придется перебирать все сигналы: А не стал ли какой-то полуавтоматом? Аналогично при разборке.
2. Многозначность автоблокировки определяется флагами, плюс добавляется одно поле. Если светофор - автомат, то NextSignal у него всего один, он его всегда видит и знает о его показании, в зависимости от этого делает свое на один бльше (пока не max).
3. Полуавтоматы открываются только тогда, когда к ним подходит поезд. Не к ним, разумеется, а на такое расстояние (по числу сигналов), когда открытие какого-то сигнала на максимально разрешающее показание требует открытия этого полуавтомата. При длине БУ в 4-5 клеток и длине поездов в 16 вагонов (вполне достаточно, я больше не использую) - нормально, сигнал откроется за десять клеток. Можно, опять же, как в метро, перед станцией сигналы ставить чаще.
4. Перед открытием сигнала-полуавтомата "автоматика", как и в реале, готовит маршрут (только "замыкает" не стрелки, а конкретные клетки). Концом маршрута является следующий попутный сигнал или тупик (в т.ч. и депо, но я депо для маневров не использую). Как в реале.
5. Выбор маршрута на развязке реализуется любым способом, главное - попасть, куда надо, не в этом суть.
6. Выбор пути приема на станции реализуется по принципу приоритета путей. Пути необходимо делить на главные и приемоотправочные. По главным - только выгрузка, по приемоотправочным - погрузка и/или сдвоенные операции. Приоритет путей или задается вручную (постройками определенного вида), или выбирается по принципу "смворачиваем или прямо?" (прямо - главный, сворачиваем - на п/о путь). Главные пути поездами под погрузку занимаются в последнюю очередь.
6.1. При этом можно реализовать такую штуку: если поезду надо после операций на станции ехать в обратном направлении, то он выбирает маршрут с пересечением встречного главного пути на боковой п/о путь с другой стороны. Тогда, выезжая со станции, он потом создаст меньше помех другим поездам, особо встречным. Но это не главное.
6.2. Выходные светофоры со станционных путей - однонаправленные. Но ставятся они в пределах станционных путей. Такие светофоры не учитываются в поиске маршрута, как враждебные. Хвост поезда может торчать и за этим светофором, на рассчет работы блокировки он не повлияет. Станционные ветофоры расставляются автоматически одновременно со строительством станции на последней (в сторону горловины) клетке, направлением в сторону этой самой горловины.
Теперь о событиях, ибо управляться это все должно событиями. Поскольку основной управляющий объект у нас - сигнал (TSignal), то все завязано на нем.
- Перекрытие любого сигнала - по проследованию первой ПЕ поезда за сигнал.
- Открытие сигнала-автомата - по проследованию его TSignal.Next последней ПЕ поезда (управляется через TSignal.Prev проследуемого сигнала).
- Открытие сигнала-полуавтомата - при запросе на его открытие от его TSignal.Prev, переданного "по цепочке" (длина цепочки зависит от значности АБ).
- Разделка маршрута по стрелкам - по занятию пути первой ПЕ поезда.
Враждебные маршруты, без них - никак. При невозможности удовлетворить запрос на маршрут он (маршрут) "загоняется в стек". Т.е., если уже известен конец маршрута (тот самый Next), тогда сигнал просто банально ждет условий, при которых этот маршрут можно будет установить. Или Next неизвестен (на станции много занятых путей), тогда поиск возможного маршрута производится при каждой итерации. Это немного отожрет времени, но немного. Да, забыл: при накоплении враждебных маршрутов первыми реализуются маршруты "на выход" - в сторону сигналов-автоматов.
Это все при грамотной организации, даст не только одновременныц прием и отправлении по параллельным маршрутам, но и поиск вариантного маршрута по горловине/развязке. Плюс грамотный оборот/реверсирование по станциям (однонапрвленные станции уже особо и не нужны будут).