Beispiel #1
0
  /**
   * C++ callback function.
   *
   * <p>Notifies the event listener that a game update occurred.
   */
  private void gameUpdate() {
    try {
      // update game state
      gameFrame = getFrame();
      if (!isReplay()) {
        self.update(getPlayerUpdate(self.getID()));
        self.updateResearch(getResearchStatus(self.getID()), getUpgradeStatus(self.getID()));
      } else {
        for (Integer playerID : players.keySet()) {
          players.get(playerID).update(getPlayerUpdate(playerID));
          players
              .get(playerID)
              .updateResearch(getResearchStatus(playerID), getUpgradeStatus(playerID));
        }
      }
      // update units
      int[] unitData = getAllUnitsData();
      int[] bulletData = getAllBulletsData();
      HashSet<Integer> deadUnits = new HashSet<Integer>(units.keySet());
      ArrayList<Unit> playerList = new ArrayList<Unit>();
      ArrayList<Unit> alliedList = new ArrayList<Unit>();
      ArrayList<Unit> enemyList = new ArrayList<Unit>();
      ArrayList<Unit> neutralList = new ArrayList<Unit>();

      for (int index = 0; index < bulletData.length; index += Bullet.numAttributes) {
        int id = bulletData[index];
        Bullet bullet = bullets.get(id);
        if (bullet == null) {
          bullet = new Bullet(id);
          bullets.put(id, bullet);
        }
        bullet.update(bulletData, index);
      }

      for (int index = 0; index < unitData.length; index += Unit.numAttributes) {
        int id = unitData[index];

        // bugfix - unit list was emptying itself every second frame
        deadUnits.remove(id);

        Unit unit = units.get(id);
        if (unit == null) {
          unit = new Unit(id);
          units.put(id, unit);
        }

        unit.update(unitData, index);

        if (self != null) {
          if (unit.getPlayerID() == self.getID()) {
            playerList.add(unit);
          } else if (allyIDs.contains(unit.getPlayerID())) {
            alliedList.add(unit);
          } else if (enemyIDs.contains(unit.getPlayerID())) {
            enemyList.add(unit);
          } else {
            neutralList.add(unit);
          }
        } else if (allyIDs.contains(unit.getPlayerID())) {
          alliedList.add(unit);
        } else if (enemyIDs.contains(unit.getPlayerID())) {
          enemyList.add(unit);
        } else {
          neutralList.add(unit);
        }
      }

      // update the unit lists
      playerUnits = playerList;
      alliedUnits = alliedList;
      enemyUnits = enemyList;
      neutralUnits = neutralList;
      for (Integer unitID : deadUnits) {
        units.get(unitID).setDestroyed();
        units.remove(unitID);
      }

      listener.gameUpdate();
    } catch (Error e) {
      e.printStackTrace();
    }
  }