???
Математика на уровне МГУ

Показано с 1 по 6 из 6

Тема: "Радар" своими руками :)

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    "Радар" своими руками :)

    Как заставить работать родной радар, я не разобрался, так что попробовал реализовать свой.

    Вот таким вот "коротенько, минут на сорок" (С), образом можно реализовать собственный "радар".

    Код:
    using System;
    using maddox.game;
    using maddox.game.world;
    using System.Collections.Generic;
    using maddox.GP;
    
    public class Mission : maddox.game.AMission
    {	    
    	private const double RADAR_X = 170291.06; // положение радара по X;
            private const double RADAR_Y = 188786.78; // положение радара по Y;        
    	private const double RADAR_Z = -60; // положение радара по Z;
    
            private const double RADIUS = 20000; // радиус радара, метры;
            private const int CHECK_PERIOD = 10; // частота обновления радара, секунды;
            private const int ARMY = 2; // чьи самолеты отслеживать (1 - красные, 2 - синие);
    
            private Point3d radarPoint; // местоположение радара в понятном игре виде;
    		private bool radarDestroyed = false; // признак уничтожения радара;
    
            private void serverMessage(string msg)
            {
                Player pl = GamePlay.gpPlayer();
                Player[] players = { pl };
                object[] args = { msg };
                GamePlay.gpLogServer(players, msg, args);
            }
    
            public override void OnBattleStarted()
            {
                base.OnBattleStarted();
                radarPoint = new Point3d(RADAR_X, RADAR_Y, RADAR_Z); 
            }
    
            public override void OnTickGame()
            {
                base.OnTickGame();
                if (!radarDestroyed)
                {
                    if (Time.tickCounter() % (CHECK_PERIOD * 30) == 0)
                    {
                        lockTargets();
                    }
                }
            }
    
    	public override void OnTrigger(int missionNumber, string shortName, bool active)
            {
                base.OnTrigger(missionNumber, shortName, active);
                if ("radarDestroyedTrigger".Equals(shortName) && active)
                {
                    radarDestroyed = true;
                    GamePlay.gpGetTrigger("radarDestroyedTrigger").Enable = false;
    		serverMessage("Радар: скоропостижно скончался...");
                }
            }
    
            private void lockTargets()
            {
                bool hasTargets = false;
                foreach (AiAirGroup airGroup in GamePlay.gpAirGroups(ARMY))
                {
                    Dictionary<AiAirGroup, int> groupsCounter = new Dictionary<AiAirGroup, int>();
                    foreach (AiActor groupMember in airGroup.GetItems())
                    {
                        if (groupMember is AiAircraft)
                        {
                            hasTargets = true;
                            if (RADIUS > groupMember.Pos().distance(ref radarPoint))
                            {
                                string msg =
                                    String.Format("Радар: Самолет в квадрате {0}", GamePlay.gpSectorName(groupMember.Pos().x, groupMember.Pos().y));
                                serverMessage(msg);
                            }
                        }
                    }
                }
                if (!hasTargets)
                {
                    serverMessage("Радар: цели не обнаружены");
                }
    	    serverMessage("Радар: пииик-пик!");
            }
    }
    Это только "базовая реализация". Само собой, можно усложнять/совершенствовать.. Например вспомнив стереометрию, можно реализовать областью прослушивания не сферу, как выше, а например конус, и крутить его по сторонам...; ввести ограничения по высоте... Можно определять типы самолетов; сравнив координаты целей между двумя проходами, можно посчитать направление и скорость, поднять на перехват истребители или.. или... или.. Имея точную карту высот, реализовать мертвые зоны за возвышенностями и т.д. Варьировать точность определения количества самолетов и их типов от расстояния до "радара"... Выводить сообщения игрокам о целях выборочно, команде или всем сразу... Или вообще сделать радар передвижным. В общем дофига всего.

    Реализованная миссия в аттаче.

    Стоит радар, летят две группы хенкелей. раз в 10 секунд "радар" "сканирует" местность радиусом в 20 км.. Как только в радиус заходят синие самолеты, их координаты светятся в окне сообщений. Красные самолеты игнорируются. Первая группа хенкелей отрабатывает по радару. Если он уничтожается, сообщения прекращаются.
    Вложения Вложения

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •