Hola, Encontré un importante detalle en el procedimiento de alejar del balón los jugadores en los saques. El problema es que en esta nueva versión, mientras un jugador del equipo a la defensa esté cerca del balón, este equipo no ejecuta ningún movimiento; es el framework quién aleja estos jugadores del balón. Pero el equipo que debe realizar el saque si puede mover todos sus jugadores, lo que le da una gran ventaja al equipo que saca, ya que puede ubicar sus jugadores libres totalmente de marca porque los contrarios permanecen inmóviles.
La solución sería permitir que los jugadores a la defensa también puedan moverse. Esta es la propuesta que hago: private void corregirDistanciaSaque() { Position [] posJugadoresSaca = (sacaLocal) ? posLocal : posVisita; Tactic tacticaSaca = (sacaLocal) ? tacticaLocal : tacticaVisita; GameSituations spSaca = (sacaLocal) ? spLocal : spVisita;
for (Command cmd : comandosSaca) { if (cmd.getCommandType().equals(Command.CommandType.MOVE_TO)) posJugadoresSaca[cmd.getPlayerIndex()] = irA(tacticaSaca, cmd.getPlayerIndex(), posJugadoresSaca[cmd.getPlayerIndex()], ((CommandMoveTo) cmd).getMoveTo(), ((CommandMoveTo) cmd).getSprint()); }
for (Command cmd : comandosNoSaca) { if (cmd.getCommandType().equals(Command.CommandType.MOVE_TO)) { int indJugador = cmd.getPlayerIndex(); if (posJugadoresNoSaca[indJugador].distance(posBalonNoSaca) > Constants.DISTANCIA_SAQUE) { if(((CommandMoveTo) cmd).getMoveTo().distance(posBalonNoSaca) > Constants.DISTANCIA_SAQUE) posJugadoresNoSaca[indJugador] = irA(tacticaNoSaca, indJugador, posJugadoresNoSaca[indJugador], ((CommandMoveTo) cmd).getMoveTo(), ((CommandMoveTo) cmd).getSprint()); } } }
for (Integer jugIndex : distanciaSaqueInsuficiente) { double ang = posBalonNoSaca.angle(posJugadoresNoSaca[jugIndex]); Position p = new Position(posBalonNoSaca.getX() + Math.cos(ang) * (Constants.DISTANCIA_SAQUE + 1), posBalonNoSaca.getY() + Math.sin(ang) * (Constants.DISTANCIA_SAQUE + 1)); if (!p.isInsideGameField(0)) { ang += Math.PI; p = new Position(posBalonNoSaca.getX() + Math.cos(ang) * (Constants.DISTANCIA_SAQUE + 1), posBalonNoSaca.getY() + Math.sin(ang) * (Constants.DISTANCIA_SAQUE + 1)).setInsideGameField(); } posJugadoresNoSaca[jugIndex] = irA(tacticaNoSaca, jugIndex, posJugadoresNoSaca[jugIndex], p, false); } }
Creo que aunque ya se liberó la versión del framework para esta edición esta es una modificación importante que debería hacerse. Ya he probado esta modificación y me ha funcionado bien, pero habría que probarla un poco más en caso de que se vaya a adoptar.
Hola,
Encontré un importante detalle en el procedimiento de alejar del balón los jugadores en los saques. El problema es que en esta nueva versión, mientras un jugador del equipo a la defensa esté cerca del balón, este equipo no ejecuta ningún movimiento; es el framework quién aleja estos jugadores del balón. Pero el equipo que debe realizar el saque si puede mover todos sus jugadores, lo que le da una gran ventaja al equipo que saca, ya que puede ubicar sus jugadores libres totalmente de marca porque los contrarios permanecen inmóviles.
La solución sería permitir que los jugadores a la defensa también puedan moverse. Esta es la propuesta que hago:
private void corregirDistanciaSaque() {
Position [] posJugadoresSaca = (sacaLocal) ? posLocal : posVisita;
Tactic tacticaSaca = (sacaLocal) ? tacticaLocal : tacticaVisita;
GameSituations spSaca = (sacaLocal) ? spLocal : spVisita;
Position [] posJugadoresNoSaca = (sacaLocal) ? posVisita : posLocal;
Tactic tacticaNoSaca = (sacaLocal) ? tacticaVisita : tacticaLocal;
GameSituations spNoSaca = (sacaLocal) ? spVisita : spLocal;
Position posBalonNoSaca = (sacaLocal) ? balon.getInvertedPosition() : balon;
List<Command> comandosSaca = tacticaSaca.execute(spSaca);
List<Command> comandosNoSaca = tacticaNoSaca.execute(spNoSaca);
limpiarComandos(comandosSaca, sacaLocal);
limpiarComandos(comandosNoSaca, !sacaLocal);
for (Command cmd : comandosSaca) {
if (cmd.getCommandType().equals(Command.CommandType.MOVE_TO))
posJugadoresSaca[cmd.getPlayerIndex()] = irA(tacticaSaca, cmd.getPlayerIndex(), posJugadoresSaca[cmd.getPlayerIndex()], ((CommandMoveTo) cmd).getMoveTo(), ((CommandMoveTo) cmd).getSprint());
}
for (Command cmd : comandosNoSaca) {
if (cmd.getCommandType().equals(Command.CommandType.MOVE_TO)) {
int indJugador = cmd.getPlayerIndex();
if (posJugadoresNoSaca[indJugador].distance(posBalonNoSaca) > Constants.DISTANCIA_SAQUE) {
if(((CommandMoveTo) cmd).getMoveTo().distance(posBalonNoSaca) > Constants.DISTANCIA_SAQUE)
posJugadoresNoSaca[indJugador] = irA(tacticaNoSaca, indJugador, posJugadoresNoSaca[indJugador], ((CommandMoveTo) cmd).getMoveTo(), ((CommandMoveTo) cmd).getSprint());
}
}
}
for (Integer jugIndex : distanciaSaqueInsuficiente) {
double ang = posBalonNoSaca.angle(posJugadoresNoSaca[jugIndex]);
Position p = new Position(posBalonNoSaca.getX() + Math.cos(ang) * (Constants.DISTANCIA_SAQUE + 1), posBalonNoSaca.getY() + Math.sin(ang) * (Constants.DISTANCIA_SAQUE + 1));
if (!p.isInsideGameField(0)) {
ang += Math.PI;
p = new Position(posBalonNoSaca.getX() + Math.cos(ang) * (Constants.DISTANCIA_SAQUE + 1), posBalonNoSaca.getY() + Math.sin(ang) * (Constants.DISTANCIA_SAQUE + 1)).setInsideGameField();
}
posJugadoresNoSaca[jugIndex] = irA(tacticaNoSaca, jugIndex, posJugadoresNoSaca[jugIndex], p, false);
}
}
Creo que aunque ya se liberó la versión del framework para esta edición esta es una modificación importante que debería hacerse. Ya he probado esta modificación y me ha funcionado bien, pero habría que probarla un poco más en caso de que se vaya a adoptar.
Saludos.