Exemple #1
0
    /**********************************************************************************/
    // инициализация
    //
    /**********************************************************************************/
    new public void Start()
    {
        base.Start();

        // скорость гранаты зависит от параметров дистанции полёта и коэффициента гравитации

        // нулевая скорость
        float V0 = Mathf.Sqrt(FlyDistance * Gravity);

        // полётное время (T = ( 2 * V0 * sin45) / g)
        float TFly = (V0 * Mathf.Sqrt(2.0f)) / Gravity;

        // горизонтальная скорость (не меняется в течении полёта)
        float Vx = V0 / 1.4142f;

        m_horisontalSpeed = Vx;

        // начальная вертикальная скорость равна начальной горизонтальной
        float Vy0 = Vx;


        // рассчитываем количество шагов для нашего хеширования
        m_timeStep = TFly / m_numOfSpeedHeshes;

        // производим рассчёт добавочной высоты для каждой из наших хеш точек
        float YSummDebug = 0.0f;
        float lastHeight = 0.0f;

        for (int tStep = 0; tStep < m_numOfSpeedHeshes + 1; tStep++)
        {
            float cTime = tStep * m_timeStep;
            float Y     = Vy0 * cTime - (Gravity * Mathf.Pow(cTime, 2.0f)) / 2;
            m_additionalHeight.Add(Y);


            // считаем разницу высот
            float Ydiff = Y - lastHeight;
            m_heightDiff.Add(Ydiff);
            YSummDebug += Ydiff;

            lastHeight = Y;

            float Vy = Vy0 - Gravity * cTime;
            m_speedYHashDown.Add(Vx - Vy);
            m_speedYHashUp.Add(Vx + Vy);
        }


        // запоминаем объекты игроков
        GameManager.GAME_MODE mode = GameManager.GetInstance().GameMode;
        if (mode == GameManager.GAME_MODE.SINGLE)
        {
            m_players.Add(GameManager.GetInstance().GetPlayer());
        }
        else if (mode == GameManager.GAME_MODE.DUEL)
        {
            m_players.Add(GameManager.GetInstance().GetPlayers(PLAYER.PL1));
            m_players.Add(GameManager.GetInstance().GetPlayers(PLAYER.PL2));
        }
    }
    /**********************************************************************************************/
    // функция старта
    // используем для начального контроля за элементами интерфейса
    //
    /**********************************************************************************************/
    // Use this for initialization
    void Start()
    {
        if (WinText == null || MessagePanel == null)
        {
            Debug.Log("ERROR! WinText is NULL!!!");
            return;
        }

        WinText.text = "";
        MessagePanel.SetActive(false);

        GameManager gmanager = GameManager.GetInstance();

        GameManager.GAME_MODE mode = gmanager.GameMode;
        if (mode == GameManager.GAME_MODE.SINGLE)
        {
            // во время одиночной игры отключаем одну из 2х панелей здоровья и аналогично поступаем с панелью перезарядки
            if (gmanager.GetPlayer().playerId == PLAYER.PL1)
            {
                HealthPanelPl2.SetActive(false);
                WeaponPanelPl2.SetActive(false);

                HealthPanelPl1.SetActive(true);
                WeaponPanelPl1.SetActive(true);
            }
            else //if(gmanager.GetPlayer().playerId == PLAYER.PL2)
            {
                HealthPanelPl1.SetActive(false);
                WeaponPanelPl1.SetActive(false);

                HealthPanelPl2.SetActive(true);
                WeaponPanelPl2.SetActive(true);
            }
        }
    }
    /**********************************************************************************/
    // функция выбирает подходящее для игроков место
    // NOTE!!! эта функция использует результат работы PathFinder-а, а значит должна вызываться только после
    // окончания его работы
    //
    /**********************************************************************************/
    void PlacePlayersObjectsInMap()
    {
        // для начала определяемся с игровым модом
        // от этого будет зависить место расположения игроков

        GameManager.GAME_MODE mode = GameManager.GetInstance().GameMode;
        int xMapSizeInBlocks       = MapSizeX / SizeOfBlocks;
        int yMapSizeInBlocks       = MapSizeY / SizeOfBlocks;

        // если у нас дуэль - выбираем два блока
        if (mode == GameManager.GAME_MODE.DUEL)
        {
            // выбираем первый блок
            int x = Random.Range(0, xMapSizeInBlocks);
            int y = Random.Range(0, yMapSizeInBlocks);

            Point blockFor1Player = new Point(x, y);
            Point blockFor2Player = new Point(blockFor1Player);

            // подбираем вторую точку
            while (blockFor2Player.IsSamePoint(blockFor1Player))
            {
                blockFor2Player.x = Random.Range(0, xMapSizeInBlocks);
                blockFor2Player.y = Random.Range(0, yMapSizeInBlocks);
            }

            // после этого помещаем их в конкретный блок
            PlaceObjectInBlock(blockFor1Player.x, blockFor1Player.y, Player1Object);
            PlaceObjectInBlock(blockFor2Player.x, blockFor2Player.y, Player2Object);
        }
        // если одиночная игра - ставим оба объекта в одно место
        // так как один из них будет отключён - проблем с этим не должно возникнуть
        else if (mode == GameManager.GAME_MODE.SINGLE)
        {
            // выбираем блок в центре
            int x = xMapSizeInBlocks / 2 - 1;
            int y = xMapSizeInBlocks / 2 - 1;

            // помещаем обоих игроков в один блок
            PlaceObjectInBlock(x, y, Player1Object);
            PlaceObjectInBlock(x, y, Player2Object);
        }
        else
        {
            Debug.LogError("Wrong game mode!");
        }
    }
Exemple #4
0
    /**********************************************************************************/
    // конструктор
    //
    /**********************************************************************************/
    public LineRadar(Unit unitWithRadar)
        : base((PLAYER)unitWithRadar.Owner)
    {
        m_unitWithRadar         = unitWithRadar;
        m_targetCheckTimerLimit = 1.0f;     // для стрелковых радаров частота поиска должна быть значительно выше, чем для StalkerRadar

        // подготавливаем вспомогательные компоненты
        for (int i = 0; i < (int)Base.DIREC.NUM_OF_DIRECTIONS; i++)
        {
            m_cachePoints[i] = new List <Point>();
        }

        GameManager.GAME_MODE mode = GameManager.GetInstance().GameMode;
        if (mode == GameManager.GAME_MODE.SINGLE)
        {
            m_players.Add(GameManager.GetInstance().GetPlayer());
        }
        else if (mode == GameManager.GAME_MODE.DUEL)
        {
            m_players.Add(GameManager.GetInstance().GetPlayers(PLAYER.PL1));
            m_players.Add(GameManager.GetInstance().GetPlayers(PLAYER.PL2));
        }
    }