private synchronized void processTick(Tick tick) {
    int x, y;

    // Fazer as opera��es primeiro por causa dos observers no swapBuffers()
    // Por os avi�es a marchar
    for (Plane p : backBuffer.values()) p.move();

    // Remover os avi�es que saem do mapa
    boolean succ = false;
    Set<Character> remover = new TreeSet<Character>();

    for (Plane p :
        backBuffer
            .values()) { // A diferen�a entre tirar logo quando ele chega na porta ou tirar depois
                         // de ter passado um epoch na porta
      x = p.getxCoord();
      y = p.getyCoord();

      if (x <= 0 || y <= 0 || y >= board.getHeight() || x >= board.getWidth()) {
        for (Gate g : board.getPorts().values())
          if (g.getxCoord() == x && g.getyCoord() == y && p.getExitAltitude() == p.getAltitude()) {
            this.successfulExits++;
            succ = true;
            break;
          }
        if (succ) succ = false;
        else this.unsuccessfulExits++;
        remover.add(p.getID());
      }
    }
    for (Character id : remover) backBuffer.remove(id);

    // Remover avi�es que colidiram no epoch anterior - est�o marcados com um '+'
    for (Plane p : frontBuffer.values())
      if (p.getSymbol() == '+') {
        backBuffer.remove(p.getID());
        this.unsuccessfulExits++;
      }

    // Testar colis�es
    for (Plane p : backBuffer.values()) {
      x = p.getxCoord();
      y = p.getyCoord();
      for (Plane p2 : backBuffer.values()) {
        int x2 = p2.getxCoord();
        int y2 = p2.getyCoord();
        if (p != p2
            && Math.abs(x - x2) <= 1
            && Math.abs(y - y2) <= 1
            && Math.abs(p.getAltitude() - p2.getAltitude()) <= 1000) {
          p.setSymbol('+');
          p2.setSymbol('+');
        } // N�o fazer 'continue;' pq pode haver 3 ou mais avi�es a colidirem
      }
    }

    // Reset avioes adicionados
    previousAdds = actualAdds;
    actualAdds = new HashMap<Gate, Integer>();

    // Trocar os buffers
    epoch++;
    swapBuffers();
  }
示例#2
-1
  private synchronized void processNewPlane(NewPlane plane) {
    char id = plane.getEntranceGateId();

    // Verificar se h� "vaga" para um novo avi�o
    if (backBuffer.keySet().size() >= 26) // S� podem haver no m�ximo 26 avi�es
    return;

    // Onde est� a porta?
    int x = board.getPorts().get(id).getxCoord();
    int y = board.getPorts().get(id).getyCoord();

    // Verificar se j� n�o foi adicionado um avi�o aquela porta neste epoch
    /*
    	for(Plane p : backBuffer.values())
    	if(p.getxCoord()==x && p.getyCoord()==y)
    		return;
    */
    if (actualAdds.containsKey(board.getPorts().get(id))) return;

    // Verificar se n�o foi adicionado um avi�o naquela porta com aquela altitude no epoch anterior
    /*
    for(Plane p : frontBuffer.values())
    	if(p.getxCoord()==x && p.getyCoord()==y && p.getAltitude()==plane.getHeight())
    		return;
    */
    if (previousAdds.containsKey(board.getPorts().get(id))) return;

    // OK, bora l� adicionar um avi�o ent�o!
    char id2 = plane.getExitGateID();
    char newID;
    for (newID = 'A'; newID <= 'Z'; newID++) if (!backBuffer.containsKey(newID)) break;

    Plane p =
        new Plane(
            newID,
            board.getPorts().get(id2).clone(),
            plane.getHeightGoal(),
            plane.getHeight(),
            plane.getHeight(),
            x,
            y,
            plane.getDirection(),
            newID,
            1);

    actualAdds.put(board.getPorts().get(id).clone(), p.getAltitude());
    backBuffer.put(newID, p);
  }