Пример #1
0
  function SynchronizeShips(data) {
    // Обновляем данные: (Очищать массив нельзя - корабль сильно мельтешит!)
    var serverShipsCount = data.ships.length;
    var clientShipsCount = SHIP.Ships.length;
    var indexes = [];

    // Если с сервера пришел пустой массив, очищаем клиентский массив (и таблицу статистики)
    if (data.ships.length === 0) {
      for (var i = 0; i < clientShipsCount; i++) {
        GAME.Statistics.DeleteStatRow(SHIP.Ships[i]);
      }
      SHIP.Ships = [];
      SHIP.MyShip.State = "Inactive";
    }
    else {
      for (i = 0; i < serverShipsCount; i++) {

        // *** Смещение карты (если это наш корабль) ***
        if (data.ships[i].ID === SHIP.MyShip.ID) {

          // Старые координаты ЦЕНТРА корабля
          var x = SHIP.MyShip.X + SHIP.ShipSize / 2 - GAME.SpaceShiftX;
          var y = SHIP.MyShip.Y + SHIP.ShipSize / 2 - GAME.SpaceShiftY;
          // Смещение за последний шаг
          var dX = Math.abs(data.ships[i].X - SHIP.MyShip.X);
          var dY = Math.abs(data.ships[i].Y - SHIP.MyShip.Y);

          if (dX !== 0 || dY !== 0) {
            // "Зона вхождения" (аналогия с наведением мыши)
            var zoneX = SHIP.ShipSize * 10;  // цифра 10 - произвольная, чтобы получить "зону вхождения" побольше
            var zoneY = SHIP.ShipSize * 10;
            // Сдвигаем карту (если корабль на краю канвы, но не на краю космоса)
            GAME.ShiftSpace(x, y, dX, dY, zoneX, zoneY);
            SPACE.Sun.GetCenter();

            // Обновляем координаты корабля
            SHIP.MyShip.X = data.ships[i].X; // X, Y - для центрирования карты по кораблю
            SHIP.MyShip.Y = data.ships[i].Y;
          }

          if (data.ships[i].State === "Active" && SHIP.MyShip.State.indexOf("Explode") !== -1) {
            GAME.CenterSpaceToShip();
            SPACE.Sun.GetCenter();
          }
          SHIP.MyShip.State = data.ships[i].State;

          // observable
          SHIP.MyShip.SkillPoints(data.ships[i].SkillPoints);

          // Skill points
          function tryChangeSkill(skill) {
            var current = skill + "Current";
            var limit = skill + "Limit";
            var checkCurrent = (SHIP.MyShip[current]() !== data.ships[i][current]);
            var checkLimit = (SHIP.MyShip[limit]() !== data.ships[i][limit]);
            if (checkCurrent) {
              SHIP.MyShip[current](data.ships[i][current]);
            }
            if (checkLimit) {
              SHIP.MyShip[limit](data.ships[i][limit]);
            }
          }

          function tryChangeSkills() {
            tryChangeSkill("HP");
            tryChangeSkill("MP");
            tryChangeSkill("Armor");
            tryChangeSkill("Speed");
            tryChangeSkill("AngleSpeed");
          }

          tryChangeSkills();

        }

        var isShipFound = false;

        // Цикл только по исходному списку (добавленные в ходе проверки корабли не учитываются - они добавляются в конец массива)
        for (var j = 0; j < clientShipsCount; j++) {

          if (SHIP.Ships[j].ID !== data.ships[i].ID) {     // сравниваем массивы - локальный (Javascript) и пришедший (JSON)
            continue;                                   // если не одинаковые имена - берем следующий
          }

          indexes.push(j);    // запомнили индекс найденного элемента
          isShipFound = true;

          // если корабль встретился в массиве JS - обновляем данные (только те, которые изменились)
          if (SHIP.Ships[j].Name === "") {
            SHIP.Ships[j].Name = data.ships[i].Name;
          }

          if (SHIP.Ships[j].State === "Inactive") {
            GAME.Statistics.AddStatRow(SHIP.Ships[j]);
          }
          SHIP.Ships[j].State = data.ships[i].State;
          SHIP.Ships[j].Stealth = data.ships[i].Stealth;

          SHIP.Ships[j].MaxHP = data.ships[i].HPCurrent * SHIP.HPMult;
          SHIP.Ships[j].HP = data.ships[i].HP;
          SHIP.Ships[j].MaxMP = data.ships[i].MPCurrent * SHIP.MPMult;
          SHIP.Ships[j].MP = data.ships[i].MP;
          SHIP.Ships[j].X = data.ships[i].X;
          SHIP.Ships[j].Y = data.ships[i].Y;
          SHIP.Ships[j].Speed = data.ships[i].Speed;
          SHIP.Ships[j].SpeedCurrent = data.ships[i].SpeedCurrent;
          SHIP.Ships[j].Angle = data.ships[i].Angle;
          SHIP.Ships[j].Image = data.ships[i].Image;
          SHIP.Ships[j].Kill = data.ships[i].Kill;
          SHIP.Ships[j].Death = data.ships[i].Death;
          RefreshBombs(SHIP.Ships[j], data.ships[i].Bombs);   // обнуляем и заполняем массив данными с сервера
          GAME.Statistics.RefreshStatRow(SHIP.Ships[j]);

          break;
        }

        if (!isShipFound) {                     // если корабля не было в массиве JS, то добавляем его в в массив
          data.ships[i].Image = parseInt(data.ships[i].Image);
          var otherShip = new Ship(data.ships[i]);

          RefreshBombs(otherShip, data.ships[i].Bombs);
          GAME.Statistics.AddStatRow(otherShip);
          SHIP.Ships.push(otherShip);
        }
      }
    }
  }
Пример #2
0
 my.DeleteShip = function (id) {
   ship = UTILS.GetElement(SHIP.Ships, "ID", id);
   ship.State = "Inactive";
   GAME.Statistics.DeleteStatRow(ship);
 };