/**********************************************************************************/ // инициализация // /**********************************************************************************/ 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!"); } }
/**********************************************************************************/ // конструктор // /**********************************************************************************/ 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)); } }