/// <summary> /// Places the ship. /// выбрать режим установки корабля на поле /// </summary> /// <param name="itype">Itype.</param> public void PlaceShip(int itype) { BattleshipsPlacing placing = uiPlacing.GetComponent <BattleshipsPlacing>(); //если какой то корабль был выбран, убирается с поля if (mPlaceShip != null) { mSelectionLength = 0; mShips.Remove(mPlaceShip); Destroy(mPlaceShip); placing.RefreshButtonsTexts(); } // заполняются параметры - какой корабль нужно поставить // и создается объект на поле Ship.Type type = (Ship.Type)itype; GameObject ship; switch (type) { case Ship.Type.Destroyer: ship = (GameObject)Instantiate(DestroyerPrefab, new Vector3(0, 0, 0), Quaternion.identity); break; case Ship.Type.Cruiser: ship = (GameObject)Instantiate(CruiserPrefab, new Vector3(0, 0, 0), Quaternion.identity); break; case Ship.Type.Battleship: ship = (GameObject)Instantiate(BattleshipPrefab, new Vector3(0, 0, 0), Quaternion.identity); break; case Ship.Type.AircraftCarrier: ship = (GameObject)Instantiate(AircraftCarrierPrefab, new Vector3(0, 0, 0), Quaternion.identity); break; default: return; } ship.AddComponent <Ship>(); Ship subship = ship.GetComponent <Ship>(); subship.Init(mFieldStart, new Vector2(mFieldWidth, mFieldHeight), type, true, -1, -1); mSelectionLength = subship.GetShipLength(); mSelectionHorizontal = true; mPlaceShip = ship; mShips.Add(ship); placing.RefreshButtonsTexts(); RefreshRedPlanes(); RefreshBusyCells(); }
/// <summary> /// Update this instance. /// Update is called once per fram /// плавное перемещение камеры в точку где должна находится камера /// если игра только началась, тогда если текущий игрок - сервер /// идет проверка, подключился ли игрок, если еще нет, тогда /// отображается надпись "Ожидание игрока" /// показываем окно для расстановки кораблей /// если все корабли расставленны, тогда появляется кнопка - "Начать игру" /// </summary> // Update is called once per frame void Update() { // плавное перемещение камеры в точку где должна находится камера Quaternion target = Quaternion.Euler( mRotations[(int)mCurrentPosition]); if (transform.rotation != target) { transform.rotation = Quaternion.Slerp( transform.rotation, target, Time.deltaTime * mSmooth); } if (transform.position != mPositions[(int)mCurrentPosition]) { transform.position = Vector3.Lerp( transform.position, mPositions[(int)mCurrentPosition], Time.deltaTime * mSmooth); } if (!isPlayersReady && !mAllShipsPlaced) { // если игра только началась, тогда если текущий игрок - сервер // идет проверка, подключился ли игрок, если еще нет, тогда // отображается надпись "Ожидание игрока" CanvasWaitingForPlayer.SetActive(true); } else { CanvasWaitingForPlayer.SetActive(false); // показываем окно для расстановки кораблей if (!mStartedCanvasLoaded && Time.time - mStartTime > 1.0f) { CanvasPlaceBattleships.SetActive(true); mStartedCanvasLoaded = true; } if (mCanvasPlacingLoaded) { GameOrder gameOrder = GameOrder.GetComponent <GameOrder>(); if (!gameOrder.isGameBegun) { FieldOperations field_operations = PlayerField.GetComponent <FieldOperations>(); if (field_operations.isAllShipsArePlaced) { //если все корабли расставленны, тогда появляется кнопка - "Начать игру" if (mAllShipsPlaced) { if (Time.time - mAllShipsPlacedTime > 1.0f) { CanvasBeginGame.SetActive(true); CanvasPlacing.SetActive(false); } } else { mAllShipsPlacedTime = Time.time; mAllShipsPlaced = true; } } else { CanvasBeginGame.SetActive(false); CanvasPlacing.SetActive(true); BattleshipsPlacing placing = CanvasPlacing.GetComponent <BattleshipsPlacing>(); placing.RefreshButtonsTexts(); field_operations.RefreshRedPlanes(); mAllShipsPlaced = false; } } else { CanvasBeginGame.SetActive(false); CanvasPlacing.SetActive(false); CanvasPlaceBattleships.SetActive(false); } } } }
/// <summary> /// Update this instance. /// Update is called once per frame /// если стоит режим выбора ячеек /// при нажатии средней кнопки мыши - поворот корабля /// просчет попадания в клетку /// если расстановка кораблей - проверка, можно ли поставить корабль /// перемещение корабля /// при нажатии первой кнопки мыши - корабль помещается на поле /// скрывается корабль /// если идет бой, проверка, можно ли выбрать данную клетку для удара /// при нажатии первой кнопки мыши - производится удар /// если не выбран кораблья чтоб поставить на поле и нажата вторая кнопка мыши проверяется выбран ли какой то корабль на поле если корабль выбран, то он удаляется /// </summary> // Update is called once per frame void Update() { foreach (var obj in mLastSelected) { obj.GetComponent <MeshRenderer>().enabled = false; } ValidateFireList(); //если стоит режим выбора ячеек if (mSelectionLength > 0) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; int cell_x = -1; int cell_y = -1; // при нажатии средней кнопки мыши - поворот корабля if (Input.GetMouseButtonDown(2)) { mSelectionHorizontal = !mSelectionHorizontal; } // просчет попадания в клетку if (Physics.Raycast(ray, out hit)) { int num = 0; foreach (var obj in mPlaneObjects) { if (obj == hit.collider.gameObject) { cell_x = num % FieldsHorCount; cell_y = num / FieldsVerCount; if (mSelectionLength % 2 == 0) { if (mSelectionHorizontal && hit.textureCoord.x < 0.5) { cell_x--; } else if (!mSelectionHorizontal && hit.textureCoord.y < 0.5) { cell_y--; } } if (mSelectionLength > 2) { if (mSelectionHorizontal) { cell_x--; } else { cell_y--; } } } num++; } if (mGame.State == GameOrder.GameState.Placing) { //если расстановка кораблей - проверка, можно ли поставить корабль Ship ship = mPlaceShip.GetComponent <Ship>(); if (VerifyCell(cell_x, cell_y)) { //перемещение корабля ship.Move(mSelectionHorizontal, cell_x, cell_y); //при нажатии первой кнопки мыши - корабль помещается на поле if (Input.GetMouseButtonDown(0)) { mSelectionLength = 0; mPlaceShip = null; } } else { //скрывается корабль ship.Move(mSelectionHorizontal, -1, -1); } } else if (mGame.State == GameOrder.GameState.PlayerTurn || mGame.State == GameOrder.GameState.EnemyTurn) { //если идет бой, проверка, можно ли выбрать данную клетку для удара if (cell_x >= 0 && cell_x < FieldsHorCount && cell_y >= 0 && cell_y < FieldsVerCount) { if (!mAttackedCells[cell_x, cell_y]) { //клетка помечается как выбранная GameObject plane = mPlaneObjects[cell_x + cell_y * FieldsHorCount]; plane.GetComponent <MeshRenderer>().enabled = true; mLastSelected.Add(plane); //при нажатии первой кнопки мыши - производится удар if (Input.GetMouseButtonDown(0)) { if (mAimSelectHandler != null) { mAimSelectHandler(cell_x, cell_y); } mSelectionLength = 0; mPlaceShip = null; } } } } } else { //если мышь не находится над клеткой - тогда кораблья скрывается if (mGame.State == GameOrder.GameState.Placing) { Ship ship = mPlaceShip.GetComponent <Ship>(); ship.Move(mSelectionHorizontal, -1, -1); } } //если выбран корабль для помещения на поле, то нажатие второй кнопки мыши //убирает корабль if (mGame.State == GameOrder.GameState.Placing) { if (Input.GetMouseButtonDown(1)) { mSelectionLength = 0; mShips.Remove(mPlaceShip); Destroy(mPlaceShip); BattleshipsPlacing placing = uiPlacing.GetComponent <BattleshipsPlacing>(); placing.RefreshButtonsTexts(); } } RefreshRedPlanes(); RefreshBusyCells(); } else if (Input.GetMouseButtonDown(1)) { // если не выбран кораблья чтоб поставить на поле и нажата вторая кнопка мыши // проверяется выбран ли какой то корабль на поле // если корабль выбран, то он удаляется if (mGame.State == GameOrder.GameState.Placing) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { int num = 0; foreach (var obj in mPlaneObjects) { if (obj == hit.collider.gameObject) { int cell_x = num % FieldsHorCount; int cell_y = num / FieldsVerCount; foreach (var ship in mShips) { Ship subship = ship.GetComponent <Ship>(); if (subship.HasCell(cell_x, cell_y)) { mShips.Remove(ship); Destroy(ship); break; } } BattleshipsPlacing placing = uiPlacing.GetComponent <BattleshipsPlacing>(); if (uiPlacing.activeSelf) { placing.RefreshButtonsTexts(); RefreshRedPlanes(); RefreshBusyCells(); } break; } num++; } } } } }