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(); }
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); }