DESARROLLO


Versiones 0.74, 0.75 y 0.76: (12-02-2013)
Observo que el juego permite meter gol desde saque de banda y eso no puede ser. Así que lo arreglo haciendo que, si un jugador saca de banda e introduce el balón en su propia portería, sea saque de esquina; mientras que si lo logra en la meta contraria, será saque de puerta, tal cuál indican las reglas del fútbol actual.
Veo que la pelota desaparece cuando sale de banda tras tirarla el portero 2 (ya sea mediante saque de puerta con las manos, chilena, tiro normal...). Con la de vueltas que le he dado, resulta que simplemente me faltaba un = en una condición.
Me percato de que los guardamallas se tiran a atrapar el balon cuando se realiza una cesión mediante un pase corto. Resulta que tal como estaban las condiciones el programa se metía por un camino que no debía. Ahora ya no se lanza a por la bola cuando se la pasan en corto.
Me doy cuenta de que, a veces, en el saque largo del cancerbero (con el pie desde el suelo o cogido con las manos), el esférico cambia de trayectoria mientras va por el aire. Lo arreglo y ya no hace extraños.
Si se sale el portero de los límites del campo caminando con el balón, veo que saca su propio equipo. Tras investigar observo que ocurre también con cualquier jugador de campo. Se debía a que si el jugador de un equipo le quitaba la pelota a uno del otro, no se actualizaba el valor de "último jugador que ha tocado el esférico" hasta que no se parase o pasase la pelota. Ahora ya se modifica ese valor nada más coger el cuero, que es lo lógico y normal.
Me percato de que cuando un jugador de un equipo lanza el balón elevado hacia el portero del otro conjunto, éste remata de cabeza en lugar de cogerlo. Ahora parece que va ya bien.
Me fijo en que si el cancerbero atrapa un esférico que va casi raso, éste se queda a esa altura, sin bajar hasta abajo. Ahora le obligo a descender hasta el suelo para evitar futuros problemas.
Hay veces en que al querer realizar un pase, el jugador falla y da una patada al aire. También el guardameta da un pase cortito y coge con las manos su propio pase. Arreglo ambas cosas.
Ajusto los márgenes del campo píxel a píxel ya que la bola estaba visiblemente fuera por el lado izquierdo pero el juego continuaba.
El balón se quedaba en la esquina superior izquierda del campo girando si un jugador lo sacaba fuera andando. Hago que se quede justo donde ha salido, sin girar.
Versiones 0.71, 0.72 y 0.73: (26-01-2013)
Observo que si el balón viene avanzando en diagonal, el portero debe tirarse para el lado contrario al que mira si procede. Esto es que, dependiendo de la posición FINAL de la pelota (en la que se detenga teniendo en cuenta lo que le quede por avanzar), se tirará hacia un lado u otro (o se quedará quieto), a una velocidad u otra. De momento lo he hecho para los dos casos del portero del equipo 1.
Con esto último, tengo que actualizar el despeje, ya que hasta ahora solamente lo trataba si la bola venía recta en vertical. Ahora en diagonal saldrá despejado hacia el lado al que se ha tirado el portero, y si no se tira, según la dirección en la que éste mire.
Añado, declaro, creo, parto y destruyo todas las imágenes del cancerbero del equipo 2.
Habilito completamente las animaciones del portero 2 y las dibujo y ajusto.
Veo que algunas animaciones funcionan mal:
- Arreglo la segada, ya que al segar no quitaba nunca el esférico, y si alguien del equipo contrario se lanzaba a robárselo, tampoco lo conseguía.
- Tampoco se giraba cuando debía sacar de puerta, así que lo corrijo y de paso ajusto el cuero en todas las direcciones en las que lo pisa.
- Dibujo y ajusto por completo la estirada y el balón atrapado en sus manos en todas las direcciones (ya que por ejemplo las direcciones totalmente izquierda y totalmente derecha las comparte con el portero del equipo 1, pero el 1 mira hacia arriba y el 2 debe mirar hacia abajo).
- Ajusto la pelota en "levantado tras estirada" para ambos cancerberos, porque del 1 me faltaban las dos direcciones rectas misteriosamente.
Tras todo esto, observo que el remate de cabeza va mal. La bola se queda continuamente en la cabeza del jugador o portero que intenta rematar y nunca avanza. Después de mucho llorar investigar, veo que el problema era debido a que tenía una condición mal puesta y golpeaba todo el rato el cuero que acababa de rematar de cabeza.
Veo que ocurre lo mismo con las chilenas y el jugador se queda ininterrumpidamente en esta animación y el esférico no avanza, asi que lo solvento también.
Le añado al guardamallas 2 el tratamiento de los disparos en diagonal recalculando si debe tirarse o no y para qué lado, pues es diferente que el procedimiento del meta 1.
Me percato de que el saque de banda teledirigido a la cabeza del compañero, al botar en el suelo cambia la pelota de velocidad. Lo arreglo añadiendo 3 estados nuevos al balón para controlarlo y que avance en la misma velocidad en la que se quedó justo antes de realizar el bote.


El portero 2 se estira y despeja el balón.

Versiones 0.68, 0.69 y 0.70: (14-01-2013)
Añado, parto y destruyo los BITMAPs de la estirada del portero, tanto la estirada horizontal como la diagonal (verticales creo que es tontería). Las dibujo y ajusto.
Configuro que el guardameta se alargue cuando el balón esté a una determinada distancia. El cancerbero se desplazará (esto en el juego original no ocurre) si la pelota está muy lejos, la atrape o no.
Prohíbo que se lance si la bola está cerca, pues si la coge desde su sitio, es estúpido que se tire a por ella. Además, evito que se estire si es un disparo en horizontal, ya que si no avanza en vertical, nunca podrá ser gol, y así lo puede coger andando o estando quieto en el sitio.
Intento que el portero atrape, despeje o rebote el esférico según la posición donde le golpee la pelota. De momento solo en una dirección: diagonal izquierda arriba, ajustando el cuero cuando está entre las manos del portero tras haberlo cogido.
Creo 3 estados de balón nuevos. Uno para cada función.
Hago que al atrapar la pelota se quede entre las manos y el meta se levante (pues la coge arrodillado) sin perderla.
Configuro que al despejar el esférico vaya por el lado hacia el que se ha tirado el portero y en vertical avanza un poco en la misma dirección en la que iba, pudiendo ser gol si el portero está justo debajo de los palos.
Al rechazar la bola sale aleatoriamente para cualquier sitio, decidiendo si sale elevada o no, y según eso, botará en largo y después en corto, o avanzará rasa.
Realizo que si despeja, el guardamallas pueda coger la pelota con las manos si ésta no la tiene nadie y se encuentra quieta en el suelo.
Amplío esto en 3 direcciones más: izquierda, derecha, y diagonal derecha arriba, ajustando el balón cogido en cada caso. Asimismo, adapto los márgenes de cuándo realizará cada acción: despejar, rebotar o atrapar.
Al rebotar de la mitad a la derecha en las direcciones izquierdas (recta, diagonal arriba y diagonal abajo), veo que, en ocasiones, el cuero hace cosas que no debe, o en las direcciones de la derecha, al despejar, acto seguido atrapa el balón... Es porque la pelota se me iba a otra animación por un par de condiciones mal puestas. Ahora parece que ya hace todo lo que debe.


El portero se estira y atrapa el balón.

Versiones 0.65, 0.66 y 0.67: (02-01-2013)
Empiezo con la animación "Portero detiene balón lanzado":
Pongo las imágenes del cancerbero hincando la rodilla en el suelo. Dibujo y ajusto tanto la posición del jugador como la de la pelota. Si la bola es cogible por el meta, va a esta acción.
Si el guardamallas está dentro de su área, tanto si el balón es raso como elevado, hago que lo coja bien en las 8 direcciones posibles, ajustando el esférico en cada momento a las manos del portero.
Distingo si hay cesión: si sí, hago que pueda cogerlo con el pie, pararlo con el pecho, rematarlo de cabeza, o dejarlo pasar. En caso de no existir cesión, lo atrapa si llega y si está dentro del área, que puede que el cuero vaya muy alto y el cancerbero no lo alcance.
Evito que el guardameta coja su propio pase, tiro, etc.
Fuera del área nunca lo atrapa, sino que lo coge con el pie raso o con pecho o de cabeza (vamos, totalmente idéntico a como si fuera cesión).
Por esto último veo que el portero no tira a su enemigo al quitarle el balón y encontarse fuera del área. Lo arreglo y ahora ya sí.
Haciendo lo anterior veo que la pelota en el choque entre jugadores se mueve misteriosamente a la esquina superior izquierda de donde está dibujado el jugador. Observo que es porque directamente no me recoloca la bola. Lo soluciono.
Evito que el portero caiga por recibir un balonazo, pues al salir el balón rechazado sería muy fácil meter gol con el portero en el suelo.
Corrijo que el portero no coja la pelota si hay cesión y se encuentre una flecha de dirección pulsada mientras lo atrapa.
Mejoro la cogida del cuero con el pecho cuando exista cesión, que antes casi siempre despejaba de cabeza cuando podía controlarla con el pecho perfectamente. Ahora creo que están mejor puestas las condiciones en cada caso.
Repito todo esto anterior para el portero 2 en su área.
Versiones 0.62, 0.63 y 0.64: (19-12-2012)
Hago que el portero se ponga "en guardia" si el contrario lleva la pelota. Si no está activo el meta, se gira hacia donde esté el balón (de momento, porque cuando realice la basculación de todo el equipo, a él también le afectará), mientras que si es manejable puede ponerse a correr si se pulsa cualquier flecha, hacer segada o meter la pierna para quitar el cuero, o quedarse quieto si uno de su equipo recupera el esférico.
Añado las imágenes (y las dibujo y ajusto con la función que me hice hace poco) de: coge balón raso, coge balón elevado y quieto con la pelota en las manos.
Configuro que el cancerbero pueda atrapar la bola. Para ello, le pongo colisión con el jugador contrario y de momento el portero siempre quita la pelota, tanto si está corriendo como quieto. Además, mira si va a este nuevo estado de atrapar el esférico (si se encuentra dentro de su área) o quitarlo sin cogerlo por encontrarse fuera de ella. El jugador al que le han arrebatado el cuero cae al suelo.
Programo que tras hacerse con la bola por bajo vaya a la animación de quieto con el balón en las manos (donde de momento se queda parado, girando sobre sí mismo sin desplazarse).
Realizo los estados nuevos de la pelota para las animaciones recién añadidas al portero (para ajustar la posición del cuero, hacer que no gire en las manos del meta, etc).
Observo que el pase corto del equipo 2 no funciona. Al haber cambiado cosas, me faltaban por actualizar las teclas. Ya vuelve a ir.
Arreglo que el portero espectante no se mueva si el jugador activo es otro.
Defino, creo, parto y destruyo los bitmaps de "saca de puerta con el balón en las manos" y, además, realizo que del estado de "quieto con el esférico atrapado" detallado anteriormente, vaya hacia esta animación.
Dibujo el saque. La bola avanza en la dirección en la que mira el portero, permitiendo sacar por tiempo y al presionar el botón de disparo.
Ajusto las imágenes durante el saque (en las 8 direcciones) y pongo que el portero ha sido el último en tocar la pelota.
Además adapto el balón, dependiendo de la dirección en la que vaya a salir, para que dé sensación de que lo suelta y cae hasta el pie que lo golpeará, y debido a esto, dibujo el esférico por encima de la pierna.
En saque de puerta con la pelota en el suelo o en las manos, si el balón va recto en vertical, pongo que aleatoriamente decida si va en línea recta o si se mueve ligeramente hacia uno de los dos lados.


Más acciones del portero.

Versiones 0.59, 0.60 y 0.61: (08-12-2012)
Hago que al salir el balón del campo, todo jugador que se encuentre fuera de las líneas del terreno de juego, vuelva dentro, excepto si debe sacar de córner, banda o puerta.
Hago que cuando esté un jugador del equipo contrario esperando a que se realice un saque de banda, si es el más cercano al balón, se active.
Evito que un jugador se haga con el esférico si se posiciona muy cerca del que saca de banda, pues la pelota sale elevado siempre y hasta que no empiece a bajar no puede ser atrapada.
Mientras un jugador corre, tengo programado que la bola tenga una posición u otra dependiendo de las teclas que se pulsen. Pues bien, me he dado cuenta de que si quien lleva el cuero es un jugador del equipo 1, pero se presionan las del equipo 2, el balón se mueve cuando no debería. Lo arreglo para que solamente se mueva con las teclas de quien tiene la posesión de la pelota.
Realizo el saque de centro:
- Hago que dibuje a los jugadores en sus posiciones antes de sacar.
- Dejo un tiempo para que suene en un futuro el pitido inicial.
- El juego realiza el pase de un jugador a otro automáticamente y a partir de ahí comienza el partido.
Con esto anterior, al haber gol, codifico que el equipo que lo ha encajado saque de centro tras la celebración del tanto, ubicando correctamente a los jugadores en las posiciones de saque.
Comienzo a capturar del juego original, limpiar y adecuar los gráficos del portero.
Todavía sin añadir ninguno nuevo, agrego las mismas imágenes del jugador pero con la paleta del meta del equipo 1.
Dibujo las animaciones de quieto, corriendo, disparar, caerse, hacer segada, remate de chilena... en definitiva, todas menos las dos de saque de banda, ya que el guardamallas nunca las realizará. Y sí, mi arquero podrá salir del área e incluso subir a marcar goles.
Pongo la primera novedad de guardameta (ya que hasta ahora todo lo que hacía el cancerbero lo realizaba también cualquier jugador de campo): poder pisar el balón en diagonal justo antes de sacar de puerta, cambiando la posición del esférico según la dirección en la que esté pisando.


Movimientos del portero: correr, volver a portería para sacar, pisar el balón...

Versiones 0.55, 0.56, 0.57 y 0.58: (01-12-2012)
Viendo que, de vez en cuando, en el disparo raso el balón no está pegado al suelo y cuando lo coge un jugador sigue en esa altura en vez de estar adherido a la superficie, configuro que cada vez que un participante coja la bola, se ponga en altura 0 (si no requiere control con el pecho previo); y si el disparo raso sale con altura superior a 0 la voy bajando poco a poco mientras se desplaza.
Percibo que el portero (y posteriormente compruebo que ocurre con cualquier jugador), no coge el balón si éste bota. Ya puede ser atrapado sin problemas.
Tenía puesto que al salir el cuero fuera del campo, si un jugador estaba quieto, se frenase. Lo quito, porque si está parado ya, es tontería que frene xD
Aprovechando el saque de banda, realizo el saque de puerta teledirigido al compañero para el equipo 1, pulsando la Z.
Con X ó C saca recto, elevado y más corto que el disparo normal (que hasta ahora era el tiro común el que tenía puesto) y al caer el balón botará si no ha sido cogido por ningún jugador. El saque irá hasta más o menos el centro del campo.
Mejoro el saque de banda (el normalito, el que no va a la zona de un compañero, el saque recto o diagonal) haciendo que el balon se eleve, caiga y bote, (que antes iba recto y sin variar de altura), tanto si saca cerca (C) como lejos (X), y que se pueda coger, que hasta ahora por error simplemente sacaba y hasta que no tocaba el suelo no se podía coger.
Veo que al sacar de banda, si la pelota se va fuera directamente por el fondo de la portería de quien saca, otorgo saque de puerta, mientras que si es por la del equipo enemigo, será córner. Es decir, está haciendo justo lo contrario a lo que debe. Lo soluciono.
Al querer hacer el saque de puerta hacia un compañero de equipo, veo que el saque normal toma velocidades contrarias (el que saca manda la pelota a córner). Lo solvento.
Le pongo al equipo 2 el saque de puerta hacia la zona donde se encuentre un integrante de su grupo, que solo lo había puesto en el conjunto 1 para probarlo y ahora que ya va bien lo habilito para el segundo.
Hago que cualquier balón elevado bote (saque de puerta, banda, disparo...) dos veces, una más larga y otra más corta, y luego avance un poco raso hasta detenerse por fin.
Arreglo el corner normal de ambos equipos, que con los últimos cambios ya no lanzaba recto en la dirección en la que mirase.
Corrijo el lanzamiento de córner olímpico del equipo 2. Tenía copiado y pegado el saque del 1 y el esférico siempre se iba fuera xD
Le pongo curva de salida al córner normal para que no vaya en línea recta, si no como lo que es: un centro colgado, pero nunca cogerá más efecto ni se meterá en la portería. Pero ojo, si se realiza el saque en diagonal, sí que sale recto.
El cuero lanzado de los córners anteriores se eleva rápido y cae del mismo modo. La bola se puede coger y rematar a partir de un determinado momento.
En los saques de esquina programo la misma prohibición que hice en el saque de banda: quien ha sacado no puede tocar de nuevo el balón hasta que no lo golpee otro jugador.
Ajusto la imagen del jugador realizando el lanzamiento de córner del equipo 2 en diagonal, que estaban muy separados de donde se encuentrase el balón.


Saque de banda al compañero y remate de cabeza.

Versiones 0.52, 0.53 y 0.54: (22-11-2012)
Observo que el portero y los jugadores hacen cosas raras cuando ataca el equipo contrario: los integrantes de un equipo apoyan el saque de puerta del contrario, se meten dentro del área porque sí... Finalmente, lo arreglo.
Al cambiar algo de las actualizaciones anteriores he visto que el portero puede controlarse cuando recibe un gol. Lo soluciono y ya se queda quieto e inmanejable.
Hago que el saque de banda vaya a la zona donde haya un jugador del mismo equipo, dentro de unos márgenes (muy largo en horizontal, y pequeño en vertical). Si estos son sobrepasados, saca como hasta ahora: recto en la dirección elegida.
Este "nuevo" saque de banda, al pulsar Z mientras se maneja a un miembro del equipo 1, ó 6 con el conjunto 2, realiza una comprobación de cuál es el jugador más cercano al que hará el lanzamiento desde el lateral. Entonces el balón irá a una zona cercana al deportista elegido. Si por algún casual, el jugador que realiza el saque está mirando hacia arriba pero el más cercano se encuentra hacia abajo, cambiará su dirección automáticamente para sacar en el sentido correcto.
Con esto veo el inconveniente de que si el jugador más próximo está muy cerca de la banda, la velocidad horizontal de la pelota durante el saque será prácticamente 0 y puede ocurrir que el propio jugador que hace el lanzamiento, la coja. Evito esto poniendo que como mínimo, la velocidad siempre sea 1 y aumento el tiempo de acción de coger el balón.
Además, por esto último obligo a que el jugador que saca desde el lateral no pueda coger el esférico si no la ha tocado otro jugador antes, tanto para este saque de banda teledirigido como para el normal. El jugador podrá ser manejado con los controles, pero pasará por encima del balón sin hacerse con él.
Me doy cuenta de que el cuero se podía coger con el pecho siempre, aunque estuviese el balón muy alto y eso no podía ser. Lo solvento añadiendo un máximo de altura.
Me creo una función interna para visualizar una a una todas las imágenes de los jugadores que he puesto, para comprobar que están bien dibujadas dentro de los márgenes, con sus medidas adecuadas, que ninguna salga cortada, etc. Por ello, arreglo 2 sprites mal puestos, y me vendrá de perlas para cuando integre los dibujos de los porteros.
Programo el remate de cabeza:
- solamente ocurrirá cuando el balón ha sido sacado de banda y va teledirigido a la cabeza de otro jugador.
- Mientras cae la bola, si se pulsa Z para el jugador 1, ó 6 para el 2, realizará el remate, que siempre será recto, hacia arriba o hacia abajo (salvo que en un futuro decida cambiarlo, que en el juego original veo que sólo remata recto).
- El esférico avanzará cayendo al suelo, y botará dos veces antes de pararse.
- Veo que si la pelota, tras ser rematada de cabeza, impacta en un jugador y éste cae el suelo, el cuero sale rebotado, pero si se sigue pulsando Z ó 6, volverá a salir rematado. Lo arreglo y ya al chocar, rebota como siempre.
- Me percato de que si se coge el balón sacado de banda sin que haya finalizado su ejecución, la cámara se sigue moviendo siguendo el movimiento natural de la pelota hasta parar, y una vez quieto, ya no realiza más scroll hasta soltar la bola de nuevo. Hago que si no se remata el esférico pero se ha cogido, se controle con el pecho y así ya no hay problemas de desplazamiento del tomavistas.
Versiones 0.49, 0.50 y 0.51: (14-11-2012)
Tal cuál tenía programado hasta ahora el juego, al querer sacar mi portero de puerta, los jugadores de su mismo equipo apoyaban metiéndose dentro del área, y esto no podía ser, ya que según las normas futbolísticas, el balón no se considera "en juego" hasta que éste sale del área grande. Pues bien, para que esto ocurra correctamente, realizo todo lo siguiente:
Hago que todos los jugadores atacantes del equipo 1 se salgan fuera del área cuando el portero del conjunto 2 vaya a sacar de fondo. Como funciona bien, lo repito con el grupo 2. Al producirse con exito, reitero la acción con los defensas del bando 1 primero, y después con los del segundo. Con lo que ahora cualquier jugador (menos el portero que saque de puerta) que se encuentre dentro del área, se saldrá automáticamente (y se pondrá en posición defensiva si atacaba, pues ya no tiene su equipo el esférico en su poder) cuando haya un saque de puerta, tanto a favor como en contra.
Todo esto anterior, conlleva lo siguiente:
- Evito que el guardamallas pueda sacar de puerta si hay algún jugador dentro del área, es decir, hasta que no salga el último deportista, no se activa el control del portero para sacar.
- Creo un estado especial para que si se debe realizar el saque de puerta, todo jugador (excepto los porteros) que esté dentro del área, debe salirse.
- Hago que si un jugador pierde la pelota a manos de un contrario cuando su equipo estaba atacando, entonces dejan de atacar y van a recuperar su posición inicial.
Evito que el jugador 2 golpee el balón por debajo de la línea de fondo. Si la pelota sale, no queda encima de la raya, si no que lo hago como con el gol tal como dije en versiones anteriores.
Arreglo las imágenes de "jugador frenando", que estaban mal puestas.
Habilito al portero para que también pueda ser activable si la bola está cerca de él, cosa que en el juego original no puede ser ya que el cancerbero nunca sale del área pequeña y encima podía coger el cuero con las manos ya que no existían las cesiones por aquel entonces.
Hago que el equipo 2 se apoye igual que hace el 1, que hasta ahora solo se apoyaba el conjunto 1 entre sí.
Observo que si el cuero golpea al portero de ellos y sale fuera, saca él de puerta, pero en mi portero va a córner, que es lo correcto. Simplemente me faltaba un = para que se cumpliera la condición.
Hago que si el portero, por alguna circunstancia, se encuentra fuera del área a la hora de sacar de puerta, regrese a su posición (que hasta ahora solamente tenía hecho el movimiento para cuando estuviera dentro del área chica). Ahora ya incluso si ha subido a rematar un córner y le hacen contraataque pero se va el balón por la línea de fondo de su portería, regresa para sacar, y lo hace rápido además.
Versiones 0.47 y 0.48: (06-11-2012)
Doy por finiquitada la codificación de las animaciones "meter la pierna para quitar el balón", "hacer segada", "controlar con el pecho", "ir a sacar de banda", "ir a sacar de corner", "hacer chilena", "portero corre a sacar de puerta" y "portero quieto antes de sacar de puerta", una vez comprobado que todas estas acciones las realizan ambos equipos correctamente.
Pongo el tiempo en gráficos. Esto es que ahora los números aparecen con los dibujos del juego en vez de en modo texto como lo hice anteriormente. Observo que me dibuja bien los 4 dígitos (decenas de minuto, unidades de minuto, decenas de segundo y unidades de segundo) y entre minutos y segundos añado dos puntos de separación, que parpadearán cada medio segundo.
También pinto en pantalla el rádar que indica la posición actual de los jugadores en el campo y la del balón. Los deportistas aparecerán en el mapa identificados con un punto del color de la camiseta que lleven, incluidos los porteros, que aunque ahora mismo se ven físicamente como un jugador de campo más, tendrán colores diferentes cuando añada sus imágenes. La pelota en estos momentos tendrá color blanco, pero si el cuero es amarillo, entonces se presentará amarillo, etc. Y parpadeando, el recuadro que actualmente estoy dibujando en la pantalla. Además, evito dibujar jugadores y esférico que estén fuera del campo.
Hago que el jugador activo sea el más cercano cuando la lleve el contrario pegada al pie, que hasta ahora solamente lo hacía cuando el balón estaba suelto.
Agrego los gráficos del marcador, verificando que lleva bien la cuenta de goles ya que al igual que en el tiempo, mostrará 4 dígitos: decenas de goles del equipo2, unidades de tantos del conjunto2, decenas de goles del grupo1 y unidades de tantos del bando1, separados por una raya vertical. Al lado de cada par de números expongo la equipación del equipo al que pertenecen dichos goles, que no me gustaba tal cual lo tiene el juego original (COM y RED) y tampoco iba a poner cosas como JUG1 y JUG2.
Observo que si un balón elevado impacta sobre un jugador, entonces la pelota sube elevándose más aún, sobrepasando el límite de tamaño que puede tener la pelota, así que evito que ocurra esto y ya nunca sobrepasa el tope (creo xD).


Rádar, tiempo, marcador, uniformes, control del jugador 2...

Versiones 0.44, 0.45 y 0.46: (01-11-2012)
Hago el estado de frenar. Esto ocurre cuando un jugador de un equipo lleva la pelota y la pierde cuando su grupo está atacando. Todos los integrantes de su conjunto que estén corriendo se detengan.
Codifico que también se paren cuando haya un saque de banda, de córner o de puerta y estén corriendo y atacando.
Si por algún casual, al existir un gol en un partido, y cualquier jugador seguía corriendo u otra cosa que no fuese estar quieto, celebrar el gol o llevarse las manos a la cabeza, ahora de fijo se queda quieto.
Habilito que el jugador 2 corra, configurando las teclas para manejarlo, que no son definitivas, pero de momento le he puesto: I arriba, K abajo, J izquierda y L derecha, y me aseguro de que se lleva bien con el estado de "estar quieto" que era el único que tenía configurado 100% hasta ahora.
Doy por finalizadas las animaciones de "ir a sacar de banda" y de "pisar el balón" para los jugadores 1 y 2.
De igual modo los estados de "celebración de goles a favor" (corriendo el que marca, levantando el brazo y pegando saltito, y persiguiéndole los compañeros de equipo) tras comprobar que en el jugador 2 funcionan también estupendamente.
Arreglo que si metía gol en la portería de abajo andando con el verde, me decía que era gol en propia puerta cuando es mentira (en propia puerta es en la de arriba). Tenía mal puesta la condición para comprobar si lograba gol o no.
Tras corregir lo anterior y otorgar ya el gol a favor debidamente, el balón se quedaba sobre la raya pero lo contabilizaba como gol. Ya deja la pelota donde la tiene que dejar.
Permito que el jugador 2 desplace el esférico con el pie. Habilito, para ello, las teclas 6 disparo raso, 7 lanzamiento elevado, y 8 pase corto. Realiza correctamente los tiros y el pase corto, sea o no al pie.
Aumento el rango de "meter la pierna para quitar la bola", que veo que en alguna dirección aunque pulses el botón y estés pegado a quien lleva la pelota, no mete la pierna. Ahora ya parece que sí.
Configuro que se deba levantar el dedo antes de volver a meter la pierna o disparar (excepto cuando es chilena). De este modo nada más introducir la zanca y hacerte con el cuero, no dispara el jugador automáticamente, sino que hay que ordenárselo levantando el dedo y dándole de nuevo al pulsador.
Saco a los fotografos a parte, que antes venían incrustados en el propio terreno de juego, y si quiero hacer varios dibujos de campo ahora es más fácil hacerlo. Los dibujo por separado en pantalla y observo que aparecen bien y en sus sitios.
Versiones 0.41, 0.42 y 0.43: (27-10-2012)
Poco a poco sigo mejorando el pase corto:
- ahora el balón va al pie del jugador más cercano en la dirección en la que esté mirando quien pasa.
- dejo un porcentaje de error para que no pase siempre al pie, sino que pueda irse largo o quedarse corto, o desplazarse más hacia un lado de lo que debería... más que nada porque si va siempre al pie es un poco tontería creo yo, siempre teledirigido no me mola.
- si no hay nadie en dicha dirección, la pelota avanzará como hasta ahora (en el sentido en el que mire y más lenta que un tiro).
- corrijo dirección y velocidades del esférico varias veces hasta dejarlo fetén.
- ¡OJO! El pase puede ir al portero si éste es el más cercano.
Observo que si un jugador tira el cuero fuera de banda o córner, si después del saque le llega la bola al mismo deportista, hasta ahora no la cogía porque seguía marcado ese jugador como "el último que ha tocado la pelota antes de irse fuera". Ahora lo arreglo y ya la agarra. Al hacer el pase corto es donde me he dado cuenta de esto.
Pongo comprobaciones de que si el balón ha salido fuera del campo, se evite el verificar si ha traspasado la línea de banda, de fondo, si es gol, etc, y que se prohíba a los jugadores cogerlo, ya que hasta ahora se volvía loco el juego si esto ocurría.
Al intentar hacer una mejora para el saque de banda veo que mi equipo no realiza el saque, pero el contrario sí. Elimino simplemente un par de sentencias y ya vuelve a sacar perfectamente.
Si tira un jugador del equipo rojo (el único con el que puedo disparar) y el cuero impacta en otro del mismo equipo, en el que ha chocado, a veces en vez de caerse al suelo, controla la pelota. Esto era debido a que al hacer que se desmoronase no reiniciaba la cuenta y podía dar lugar a que cuando tuviera que desplomarse, el tiempo necesario de dicha animación ya había transcurrido, erróneamente.
El esférico rebotado y elevado tras colisionar con un jugador no puede ser cogido hasta que éste empiece a descender. Parece lógico, pero no lo tenía hecho xD
Hago contadores de goles de los dos equipos y del tiempo de partido. De momento simplemente los muestro por pantalla en modo texto. Aunque se acabe el tiempo (90 segundos), sigues, porque como solo hay un partido es tonteria acabarlo, pero el crono se para al llegar a 0.
Detengo el crono cuando hay gol, tanto a favor o en contra, de un equipo u otro, y cuando los jugadores aparecen recolocados comienza a contar de nuevo.
Ahora en vez de 90 segundos, se muestra 01:30, es decir, diferenciando minutos y segundos.


Pase corto y marcador cutre.

Versiones 0.38, 0.39 y 0.40: (20-10-2012)
Hago que los jugadores que apoyan al que lleva el balón, elijan al azar una posición de destino para llegar y ayudar desde ahí. Este emplazamiento oscilará entre unos píxeles por delante y por detrás de la ubicación del deportista que tiene la pelota.
Además, una vez alcanzado el lugar de destino, optan libremente por alguna de estas opciones: quedarse parado en dicha posición, moverse en horizontal para apoyar en corto, o desplazarse en todas las direcciones para seleccionar una nueva zona desde la que ayudar al compañero que conduzca el esférico.
Con esto del azar puede ocurrir que el jugador se desplace en vertical mientras su animación de correr dice que se debe mover en horizontal. Pues bien, si esto ocurre, obligo al jugador a cambiar de sentido a la hora de correr y, al menos, debe ponerse a esprintar en diagonal.
Si un jugador que lleva la pelota se choca con otro, miro a ver si se golpea por los 4 costados. Si es así, entonces hago que se traspasen
*
mútuamente, ya que si colisionan por todos los lados no puede avanzar y el juego se queda en un continuo combate inútil. En caso contrario por algún lugar se puede salir y continuar la jugada.
* En cuanto al traspaso, de momento lo dejo así. Cuando termine lo que es jugar el partido en sí (que va para largo) quizá me anime y haga que cuando ocurra esto, en vez de atravesarse, el jugador que lleve la pelota haga un regate al otro, con la consiguiente creación de imágenes de quiebros.

Estaba empeñado en hacer que si un jugador corriendo le quita el cuero al contrario, le franqueara y no hubiera choque entre ellos, porque quitar el esférico y colisionar no tiene mucho sentido xD, pero me di cuenta a tiempo de que en el juego original es muchísimo más fácil: una vez que le roban el balón, el jugador cae al suelo. Así que eso he hecho. Buena gana de complicarme la vida xD
También aprovecho y programo que en esta circunstancia, si el que recupera la pelota no es el jugador que se controla, se hace manejable.
Como ya comenté en torno a la versión 0.28, el jugador que lleva el balón puede chocarse contra los miembros del equipo contrario; pues bien, ahora me aseguro de que además de que eso ocurra, también impacte contra ambos porteros siempre (sí, incluido el suyo propio), mientras que contra sus compañeros colisionará una de cada 10 veces (vamos, que se frena un poquitín de vez en cuando, apenas se nota en el juego, pero me parece más realista).
Habilito el botón C para dar un pase corto. De momento hace lo mismo que con la letra Z para saques de banda, córner, etc.
Creo el pase. De momento lo que hago es lanzar la pelota en la dirección en la que mira el jugador, pero a una velocidad bastante más lenta que la de cualquier disparo, valiendo las mismas comprobaciones que para los tiros: que salga de banda, que la intercepte un contrario, que sea gol... excepto que choque contra un jugador, por ir más lento el impacto no le tira.
Observo que al realizar el pase estando cerca de un contrario, la bola atraviesa a este último. Lo arreglo y ahora en cuanto la pelota sale del pie del jugador que realiza el pase, ya puede ser interceptada por cualquier otro deportista.
Ajusto la velocidad del esférico durante el pase, ya que si es un pase corto, no puede ir de una portería al medio del campo xD Lo configuro para que más o menos se desplace en horizontal desde la línea del área grande hasta un poco pasado el punto de penalty, y en vertical desde la raya de fondo hasta recién pasada la frontal del área.
Versiones 0.35, 0.36 y 0.37: (13-10-2012)
Configuro que exista comprobación de balón (sale fuera, es gol, etc.) sin dispararlo, es decir, cuando el jugador lleva la pelota pegada a sus pies. Asimismo, retraso al individuo si choca con el palo.
Por las verificaciones anteriores, ajusto el cuero en las posiciones X e Y, ya que si, por ejemplo, andaba hacia la izquierda (en X), el esférico está en una posición Y diferente a si ando hacia la derecha, y ocurría que por un lado salía de banda bien pero por el otro necesitaba recorrer un poco más de terreno.
Finalmente codifico el córner de ellos, aunque no lo puedo probar todavía xD Pero hago que saque él solo si no lo ha hecho ya pasando un determinado tiempo. Les permito también realizar goles olímpicos.
He hecho que el jugador más cercano del equipo 1 al que lleva el balón, le apoye. Lo descarto, pues se me ocurre otra cosa que creo que es mejor (siempre, salvo que diga lo contrario, es todo para el equipo 1):
En su lugar realizo que si el jugador1 tiene la pelota, todos los de su equipo ataquen, menos el portero. De momento van hacia arriba de manera aleatoria pudiendo cambiar de dirección excepto ir para abajo. Parece lógico, pero, ¿y si al llevar el cuero me tengo que ir hacia abajo por lo que sea? ¡ Mi equipo se ha ido hacia arriba y no tengo apoyos! Esto lo solucionaré más adelante.
Evito que el jugador que ataque se quede parado mientras corre a su posición ofensiva. Sólo se parará al llegar a su emplazamiento final.
Programo que el jugador atacante lo haga sin variar contínuamente su posición en el campo. Esto es que decidirá si cambia o no de dirección cada X pasos andados en lugar de en cada iteración del juego. También evito que ataque fuera del campo, comprobando que no avance más allá de las líneas de banda que limitan el terreno de juego. Hacia arriba o hacia abajo es imposible que se salga.
Codifico que si un jugador está fuera del campo (porque ha hecho una segada, etc.) y le llega el balón, no lo pise, sino que vaya al estado de correr, aunque luego no corra, pero es para que no se me vuelva el juego loco en el saque de banda.
Si los jugadores del equipo 1, por alguna extraña razón, están corriendo y atacando en una dirección que les haga descender, entonces los fuerzo a que vayan siempre hacia delante. Mejor prevenir que lamentar.
Configuro que si un jugador que ataca está corriendo mientras hay un gol en propia puerta, deje de correr y se pare.
Hago que un tiro elevado tenga botes de balón, que antes según caía del aire se plantaba en el suelo. Ahora realiza un brinco largo y al volver a golpear en el piso, otro muy cortito. (El disparo raso no implica botes).
Sigo mejorando el apoyo al compañero que lleva el esférico de manera que si el cuero está más atrás que el jugador atacante, dependiendo de si éste es un defensa, un medio o un delantero y de la posición en la que se encuentre, bajará o no a apoyar al colega que tiene la pelota en su poder. De momento lo estoy haciendo todo con un sistema de juego 4-4-2, bajando los 4 defensas a apoyar, o incluso, los dos medios centros. En otros sistemas descenderán más o menos jugadores.


Jugadores atacando y defendiendo.

Versiones 0.32, 0.33 y 0.34: (22-09-2012)
Veo que la elección de decidir si ha sido córner, fuera, gol, etc no es del todo correcta. Después de trastear un poco parece que ahora ya sí, o al menos se llevan bien al 99% xD
Permito scrollear la pantalla si el jugador sigue en el lanzamiento de córner (esto ocurre al sacar de esquina e irse el balón fuera despejado por un contrario por el mismo lado desde el que se ha disparado). Antes como el jugador ya estaba allí, directamente permitía el lanzamiento y no scrolleaba aunque éste quedara fuera de la imagen y viniera el cuero de nuevo al área por arte de magia.
Observo que, por error, el gol me lo celebra otro si ese jugador se pone como activo antes de que entre el balón en la portería. Así que lo arreglo y ahora lo festeja correctamente quien lo ha marcado.
Realizo el saque de puerta:
- Programo tanto el de mi portero como el guardameta del equipo contrario (de momento la pelota va recta, más adelante haré que saque a una zona donde esté algún jugador de su equipo, más cerca o más lejos, dependiendo del botón que se pulse, etc.).
- También codifico que saque pasado un determinado tiempo para no esperar eternamente.
- Hago que scrollee la pantalla debido a que el esférico puede salir justo pegado a la banda, y entonces debe ajustarse hacia la posición en la que vaya a sacar el portero aunque éste haya llegado ya al lugar en el que patear.
- Éste no lanzará hasta que no haya terminado de scrollear (más adelante tampoco tirará hasta que los jugadores salgan del área).
- De momento, el cancerbero dispara siempre por el lado por el que ha salido el cuero.
- Ajusto que el portero avance lateralmente sin salirse del área para que no saque desde fuera.
Hago el saque de banda del equipo 2 tal como lo realiza el equipo 1, incluyendo el saque por tiempo.
Evito que se pueda seguir manejando al jugador1 cuando ha sido gol del contrario en propia puerta. Además programo que no me dibuje las flechitas en ambos equipos cuando se consigue un tanto en su misma portería.
Arreglo un problema con el gol en propia puerta de ellos, ya que si se lograba tras golpear en un jugador de campo me decía que era gol (los jugadores del equipo contrario se llevaban las manos a la cabeza y todo), pero no me lo daba, mientras que si era del portero misteriosamente sí me lo contaba. Parece que ya lo otorga con satisfacción igualmente en ambos casos.
Versiones 0.28, 0.29, 0.30 y 0.31: (08-09-2012)
Ajusto el balón al pie del jugador cuando lo consiga alguien diferente al que lo tenía y lo pise.
Veo que si meto gol, inmediatamente un jugador va a sacar córner o el portero de puerta. Por ello, amplío lo que dije más abajo de evitar sobrecarga del procesador y hago que se realice una y sólo una comprobación entre: salir de banda, ser córner, ser saque de puerta, golpear en el palo, en el larguero, ser gol...
Hago que justo al disparar normal, de chilena, sacar de banda, ajustar el balón al pie... el último jugador que la toque sea el que estaba activo, ya que observé que si la pelota la tocaba un enemigo y el valor del último que había golpeado el cuero no se actualizaba y metías gol, el tanto subía, pero el esférico no se quedaba en la red ni el jugador celebraba el tanto conseguido. Ahora ya sí.
Configuro el rebote del balón en un contrario para que avance hasta: que pase un determinado tiempo, que salga del campo, choque con el poste o el larguero, sea gol, la coja otro jugador con el pecho o en carrera...
Acomodo las animaciones del saque de banda con el cuero encima de la cabeza con la imagen posterior de pelota lanzada (con los brazos hacia delante), ya que había veces que al cambiar a esta última el jugador se movía varios píxeles hacia arriba o hacia abajo.
Al igual que con la segada, realizo que cualquier jugador que esté cerca del dueño de la pelota pueda meter el pie para robarle el balón (excepto al portero), y con esto digo que incluyo a los jugadores del equipo contrario y a los de mi equipo sin ser el jugador activo.
Hago que cuando el esférico lo tiene el contrario y está corriendo o pisando la pelota, pueda quitarle el balón uno del equipo adversario sin hacer segada ni meter la pierna. A partir de ahí entra en juego el azar y se lo quitará en 3 de cada 5 veces.
Configuro que un jugador que corre, con balón o sin él, pueda chocarse con compañeros o rivales, incluidos los porteros, más que nada para que no los traspase, pero tras ver el juego, decido hacer como ellos, es decir, que haya choque sólo si uno de los dos tiene la pelota en su posesión, ya que al deber controlar a 20 o 21 jugadores de manera aleatoria, pueden ocurrir choques contínuamente y ser un auténtico caos xD Así que ahora mismo solamente choca el jugador activo del primer equipo contra otro del segundo equipo siempre y cuando uno de los dos tenga el cuero en su poder (hacerlo al revés debería ser pan comido, pero hasta que no empiece a hacer los movimientos del jugador 2 no lo programaré).
Evito dibujar las flechas de "jugador que manejas" cuando ha sido gol, tanto a favor o en contra.
El gol, a partir de ahora, se puede celebrar también hacia la izquierda. Al anotar, de forma aleatoria, el goleador decidirá hacia qué lado desea ir a celebrarlo. Ajusto las imágenes de celebraciones hacia este lado, ya que sólo lo tenía hecho para el derecho.
Hago que saque de esquina (hasta ahora sólo corría para sacar):
Compruebo que mi jugador lanza bien el corner, despues de ajustar los sprites y de permitir que pueda sacar recto y en diagonal (estos disparos los modificaré más adelante).
También programo que se pueda hacer el "gol olímpico" (conseguir gol directo el lanzador de un córner). Está oculto mediante una combinación de teclas, aunque con los pocos botones que se usan en el juego, es fácil encontrarla.
Codifico que el gol olímpico no ocurra siempre, permitiendo que se pueda quedar corto el lanzamiento, pasarse de fuerza, o incluso golpear en los palos y en el larguero.
Veo que el jugador que marca desde el córner, al encontrarse fuera del terreno de juego, celebra el gol evidentemente fuera del campo. Lo arreglo para que lo festeje dentro de las líneas que limitan el juego.


¡Gol olímpico!

Versiones 0.25, 0.26 y 0.27: (29-08-2012)
Arreglo el "ir a sacar de banda", ya que le tenía puesto que fuese hasta la posición X ó Y por la que el balón había salido, y claro, se paraba en cuanto llegaba a una de ellas y sacaba más arriba o más abajo de lo debido la mayoría de las veces. Ahora hago que corra hasta que llegue a la posición X e Y. Si no llega a ambas al mismo tiempo, correrá recto o haciendo un poco el mongolo de un lado a otro xD Pero llegar llega ya de fijo bien.
Controlo también que si la pelota vuelve a salirse del terreno de juego justo antes de que el sacador de banda haya entrado, éste no vaya unos píxeles hacia atrás para sacar, sino que saque en la posición horizontal en la que está, pues sigue fuera del campo.
Además, solvento un extraño problema en el que a veces el esférico aparecía encima de la cabeza del segundo jugador más cercano a la banda porque no me contaba el que estaba fuera, quizá porque uno de los dos era el jugador activo cuando no le tocaba en ese momento.
Hago que el jugador regrese a su posición inicial cuando ya no tenga el balón. Es más que nada un primer acercamiento a la inteligencia que le daré a los jugadores, que cuando ya no se ataque, debe volver a su posición de defensa.
Veo que hay veces que celebra un gol a favor o se lamenta de uno encajado en contra, y otras veces no. Descubro que no lo hace cuando la pelota ha salido por la banda. Investigo y veo que era que no actualizaba una variable desde que salía por el lateral hasta que era gol. Ahora ya celebra los goles siempre hasta nuevo fallo xD
Para evitar sobrecargar al procesador de comprobaciones inútiles, hago que no verifique si la pelota ha salido del campo cuando ya ha sido gol.
Creo los primeros pasos del saque de esquina:
Lo primero que hago es como en el saque de banda, que el jugador más cercano del equipo que debe sacar (el contrario al que la ha echado fuera, y sin contar el portero propio), sea el que corra a la esquina a poner de nuevo el balon en movimiento.
Veo que no me realiza el scroll de cámara, así que lo ajusto para que lo haga, ya que debe siempre enfocar hasta el límite del lado por el cuál ha salido, ya que de lo contrario no se vería realizar el lanzamiento de esquina. Evito, por tanto, que el balón pueda ser puesto en movimiento antes de que acabe la cámara de llegar. En cuanto se pare, el jugador podrá sacar el córner.
Repito lo mismo para las 4 esquinas, teniendo en cuenta que las dos superiores son para un equipo y las dos inferiores para el otro, y debe realizar el scroll de 4 maneras diferentes.
El jugador2 (en estos momentos, de verde) a veces al ir a sacar el córner no trae las flechitas indicadoras de "jugador manejable". Después de indagar un rato lo solvento añadiendo un par de nuevas comprobaciones y ya siempre tiene las flechas consigo.
Observo que hay veces que el jugador, tonto de él, al querer disparar, se golpea a sí mismo, cayendo al suelo fulminado y saliendo el cuero rebotado. Por ello, decido recolocar la pelota dependiendo de la dirección que vaya a tomar y ya evito que se golpee.
Configuro por completo la segada. Esto es que el jugador activo puede hacerla pulsando la letra X siempre y cuando esté cerca del esférico. Al hacerla, compruebo si se lleva o no el balón. Si sí se lo lleva, arrastra un poco el cuero mientras se siga deslizando por el suelo y cuando se levanta lo pisa, salvo que te muevas con las flechas y entonces correrá; mientras que el jugador contrario se caerá al suelo. OJO, se supone que cualquier miembro del equipo (menos el portero, claro) podrá hacerla aunque no sea el jugador activo, pero cuando éste toque la pelota ya sí será el jugador manejable. Y aclaro también que un jugador no tendrá el poder de hacerle una segada a un portero (lo permitiré, pero sólo cuando el portero juegue la pelota con los pies).
Versiones 0.21, 0.22, 0.23 y 0.24: (22-08-2012)
Ahora que ya tengo 22 jugadores hago que, en vez de ir el jugador que tira la pelota fuera a sacar de banda, vaya el que más cerca esté, pero siendo del equipo contrario al que lo ha echado fuera. Los porteros no cuentan para sacar de banda.
Coloco a los 22 contendientes en sus posiciones iniciales. De momento pongo un sistema 4-4-2 (4 defensas, 4 medios y 2 delanteros), pero una de las mejoras de este remake es elegir tu propio sistema de juego (3-5-2, 4-3-3, 3-6-1...), pero eso más adelante.
Añado las imágenes de los jugadores del equipo número 2 (todavía faltan los porteros de ambos conjuntos). Se distinguen porque están pintados con otros colores y hago que sean dibujados en todos los estados que he introducido (corriendo, segando, celebrando un gol...).
Agrego rayas verticales a la camiseta del primer equipo primero, y de la segunda escuadra después. Con esto ahora puedo crear indumentarias de equipos como el Atlético de Madrid, el FC Barcelona, la Juventus de Turín, el Milan, el Newcastle...
Pongo a las aficiones en las partes superior e inferior del campo. En la de arriba estará el público que anima al equipo 1 (en la que mete los goles) y abajo los del grupo contrario. Los simpatizantes vestirán los colores que llevan propiamente su club.
Amplío el campo por los 4 costados. En vertical para meter a las aficiones, y en horizontal para dejar espacio al marcador en la derecha cuando se ataque por esa banda; y ya que estaba agrandé por la izquierda también y de momento he dibujado un pequeño rectángulo a modo de "área técnica donde el entrenador da instrucciones a sus jugadores". Supongo que más adelante en los trozos que me quedan pondré vallas publicitarias (imagino que me las inventaré y no pondré las típicas de Fuma, Mike, Konan...)
Con motivo de la expansión del campo, he tenido que ajustar todos los márgenes laterales, superiores, inferiores, de colocación de las porterías, palos, goles, etc.
Observo que se me queda contínuamente realizando una misma animación una y otra vez. Se debe a que mucha parte del código todavía está puesta para que funcione sólo con el jugador activo, mientras que con los demás no. Lo voy solucionando poco a poco.
Hago que automáticamente el jugador 1 que esté más cerca de la bola es el jugador que está activo, es decir, el que se puede manejar con las teclas. Lo mismo con el jugador 2, pero todavía no le he asignado botones para su control.
Veo que hay veces que me celebra los goles a favor y otras veces no. Se me escapó ajustar unos márgenes y ahora ya festeja todos los tantos sin distinción.
Alargo el disparo (tanto el raso como el elevado), ya que según el juego original deben de pasar como mínimo del medio campo si lanzas desde un extremo del terreno de juego.
Arreglo que si el balón entra en la portería pero no hasta el final, es gol, que antes sólamente tenía puesto que si llegaba al final de la red era gol y claro, así, cualquier pelota que traspasase la línea pero no tocase la red, no contaba como tanto conseguido. Ahora ya sí, como debe ser, sin goles fantasma.
Hago que los 22 jugadores, si no llevan el balón, se giren hacia donde está la pelota, para dar un poco de sensación de movimiento y que no sean maniquíes mientras sigo programando más y más cosas xD
Me doy cuenta de que si al sacar de banda, un jugador del equipo que realiza el lanzamiento está cerca del esférico y se vuelve activo, si el que saca por el lateral no terminó su animación antes de que dejase de ser él el jugador manejable, se queda pinzado con los brazos hacia delante. Lo solvento exportando a todos los jugadores (y no sólo al que saca de banda) el código de esta animación.
Dibujo las dos flechas indicadoras para los jugadores 1 y 2 (de momento las dibujo siempre, pero limitaré su aparición).


Observamos la camiseta rojiblanca, la afición, las flechas indicadoras, el área técnica, que los jugadores se giren hacia donde esté la pelota...

Versiones 0.18, 0.19 y 0.20: (16-08-2012)
Hago que al tirar el balón fuera de banda, como no tengo más jugadores, él mismo vaya a sacar de banda por el sitio por donde ha salido la pelota.
Creo, por ello, el propio saque de banda: dependiendo del lado por el que vaya a sacar, el jugador tomará 3 posiciones (hacia arriba -pulsando tecla arriba-, hacia abajo -presionando abajo- y recto -sin apretar ningún botón-), y de momento configuro que si se oprime Z, lance el balón en largo, mientras que si se empuja la clavija X, tire la pelota cerca. Esto es temporal, pues se supone que siempre debe pasar a un jugador de su equipo, pero como no hay, así lo dejo mientras.
Realizo el gol. Esto es, que configuro que si el balón entra en la portería (comprobando las posiciones X e Y de las mallas y la pelota, y la altura de esta última) entonces, además de parar el cuero directamente -quizá más adelante haga que se pueda mover durante unos instantes, igual que animar la red- y de decrementar el tamaño de la pelota, miro quién ha sido el último en tocarla y en cuál de las dos redes se ha introducido el esférico, para hacer que los jugadores celebren el gol o si por el contrario se deben lamentar por introducírselo en propia puerta.
Si resulta que es en su misma meta, el jugador se lleva las manos a la cabeza y no se le puede mover. Cuando pase un determinado tiempo, balón y jugadores serán devueltos a sus posiciones originales para comenzar de nuevo el juego.
Si por el contrario el tanto se logra en el marco rival, el que ha anotado correrá hacia la derecha dando un pequeño saltito en la celebración, mientras que el resto de los integrantes de su equipo le persiguen con los dos brazos elevados. Una vez pasado el mismo lapso de tiempo comentado anteriormente, también se reposicionarán los deportistas en sus posiciones prefijadas.
Pongo a 22 jugadores en pantalla. De momento sólo están ahí presentes. Ninguno hace nada salvo el que se maneja. Además, todos visten igual y no hay porteros, pero 11 pertenecen a un equipo y los otros 11 al otro (el gif animado inferior da constancia de ello).
Con ello compruebo que los jugadores del mismo equipo que no han metido el gol, corren hacia el anotador con ambos brazos levantados, tal como programé y comenté anteriormente, mientras los del equipo contrario, siempre permanecerán impávidos.
Codifico que mientras un jugador pisa la bola, si pulsas ARRIBA+ABAJO ó IZQUIERDA+DERECHA, no cambie contínuamente de estado, ya que según lo tenía, al pulsar al menos una flecha dejaba al instante de pisar el balón y se ponía a correr, pero si presionaba flechas de direcciones opuestas, alternaba esas dos acciones todo el rato, así que con esto ahora lo prohibo y si se oprime alguna de estas dos combinaciones, seguirá pisoteando la pelota.
Extrapolo el estado de "se cae al suelo" a todos los jugadores, pues antes si alguno de los deportistas recibía un balonazo, se caía al suelo una y otra vez, es decir, sólo volvía a su estado normal si impactaba en el único jugador que tenía antes, pero ahora funciona bien en todos.
Arreglo que el balón salga rebotado cuando, al ser disparado, impacte en otro jugador direfente. Antes si no golpeaba en el mismo que disparaba, el jugador sí caía, pero la pelota iba recta y rápida y sin rebotar.
Configuro que el esférico despedido por pegar en otro jugador, pueda golpear en algún palo de la portería o incluso ser gol.


Vemos que hay jugadores que celebran el gol (los que pertenecen al mismo equipo) y otros que no (equipo contrario).

Versiones 0.14, 0.15, 0.16 y 0.17: (10-08-2012)
Dibujo la portería por encima del balón, salvo que éste vaya muy elevado y entonces se pierda por encima de ella. Asimismo, el balón lo pinto por encima o por debajo de los jugadores, dependiendo de la altura que lleve la pelota (la altura de los jugadores es siempre la misma).
También dibujo a los jugadores siempre por debajo de la portería.
Hago que el balón disparado rebote al golpear en un palo de la portería, incluido el larguero.
Realizo que el balon rebotado pueda afectar a los jugadores de 3 maneras diferentes:
- que el jugador remate de chilena
- que sea capaz de controlar el balón con el pecho
- que si el balón va muy rápido, impacte en el jugador y lo tire al suelo, saliendo el balón rebotado de nuevo
Codifico el control de la pelota con el pecho: el balón bajará hasta situarse en los pies del jugador. Además, ajusto el balón dependiendo de la posición en la que esté el jugador (son 8 direcciones).
Programo que el balón rebote en un jugador y le haga caer al suelo, saliendo aquél despedido en una dirección elegida aleatoriamente. No está finalizado todavía, ya que la pelota solamente para cuando pasa un determinado tiempo. Queda comprobar si sale fuera del terreno de juego, si al rebotar se consigue un gol a favor o en contra, etc.
Permito que el jugador pueda hacer una chilena, y evito que la haga si ya la está haciendo xD Esto parece una obviedad, pero tal como la tenía, si el balón volvía a rebotar en el palo y regresaba al jugador mientras todavía no había cambiado de estado, éste nuevamente podía golpear a la pelota, y así podía ocurrir hasta que te cansaras.
También prohibo que el jugador haga la chilena si el balón está parado y va a cogerlo con una tecla de disparo pulsada. Ahora si ocurre eso, lo que hace es disparar con el pie, que es lo que debe hacer.
Posibilito que con Z y X sin llevar el balón en su poder, el jugador meta la pierna para intentar quitar el balón o siegue, respectivamente.
Configuro que la llamada a estas dos acciones tengan lugar solamente si el jugador que lleva el balón esta cerca, porque de lo contrario, que se haga una segada por una banda cuando la jugada transcurre por la otra no tiene mucho sentido ya que es imposible quitarle la pelota desde tan larga distancia.
Hago que la segada avance. Y ahora mismo, sin hacer nada más, el jugador que siega se lleva el balón si impacta con él estando éste sin dueño. Falta ver si funciona contra un enemigo.


En el rectángulo rosa irá el público, que de momento no está añadido.

Versiones 0.10, 0.11, 0.12 y 0.13: (31-07-2012)
Añado colores para el portero del primer equipo, los jugadores del conjunto contrario, el guardamallas del grupo rival, y para las medias de los integrantes de la primera plantilla, ya que en la equipación original del juego coincide con la camiseta y no me he dado cuenta hasta ahora xD
Agrego la animación del remate de chilena. Es diferente a lo visto en el juego original porque en él hay 3 tipos de chilenas diferentes, dependiendo de la posición del jugador, de por dónde venga el balón, etc. Pues yo uno las 3 en la misma animación, sin dar distinciones, poniendo cada imagen como yo creo conveniente; y lo hago en las 8 direcciones.
Le incorporo al remate de cabeza las animaciones hacia abajo (para el player 2/CPU), que se me había pasado. Con esto creo que ya no tengo que agregar ninguna animación más al jugador de campo, con lo que paso a la ardua tarea de codificar estos 16 movimientos y de tomar las decisiones sobre a cuál ir y en qué circunstancias.
Hago que al jugador se le pueda manejar con las flechas de dirección, controlando desde no pulsar ninguna hasta apretar las 4 a la vez:
- Si no presiona ninguna, no hace nada.
- Si pulsa una, va hacia arriba, abajo, izquierda o derecha.
- Si se oprimen dos, puede ir en cualquiera de las 4 diagonales, o si se pulsa ARRIBA+ABAJO ó IZQUIERDA+DERECHA, se queda quieto.
- Si se aprietan 3, irá en la dirección en la que no se contradice con ninguna de las otras teclas. Es decir, si se pulsan IZQUIERDA+ARRIBA+ABAJO, se desplazará hacia la izquierda, pues ARRIBA y ABAJO se anulan la una a la otra.
- Si se pulsan las 4, ARRIBA y ABAJO se anulan mutuamente como en el caso anterior, y también se cancelan IZQUIERDA con DERECHA.
Codifico que cualquier jugador pueda coger el balón cuando éste no se mueve y no tiene dueño. Al cogerlo, el balón "perseguirá" al jugador que lo tiene. Falta pulir que aparezca en una determinada posición según la imagen de la animación, etc., porque ahora mismo sale siempre en la esquina superior izquierda del jugador, independientemente de hacia dónde camine.
Modifico el metodo del scroll de la pantalla. Antes movía el balón por la pantalla con 4 teclas. Ahora hago que se mueva cuando un jugador tiene el balón en su poder y lo conduce, y cuando le pega una patada a la pelota.
Por esto anterior, programo que el jugador pueda realizar el primer disparo pulsando la letra Z: raso, avanza fuerte y va frenando poco a poco, en las 8 direcciones.
Añado un segundo botón, la letra X: el anterior para tirar raso y la X lanzará el balón elevado, que es mi juego y lo hago como me da la gana xD
Realizo que la pelota gire sobre sí misma cuando está en posesión de un jugador y éste va corriendo o dispara. Si está el balon sin dueño, no gira.
Codifico que mientras corre el jugador con el balón en los pies, éste se ajuste a la bota del jugador y se despegue un poco del deportista dando un poco de dinamismo. Lo hago en las 8 direcciones.
De igual manera coloco la pelota en el pie del lanzador cuando el jugador dispara, en las 8 direcciones.
Ajusto también el balón a la suela del atleta (y hago que no ruede sobre sí mismo) cuando el jugador se para y pisa el balón.


Jugador corriendo con el balón y disparando elevado.

Versiones 0.06, 0.07, 0.08 y 0.09: (15-07-2012)
Continúo añadiendo animaciones de los jugadores de campo:
- segada, en las 8 direcciones.
- saque de banda, también en 8 direcciones, aunque 2 en teoría (arriba y abajo) no las utilizaría en el juego original, pero si por ejemplo me da por hacer una opción en la que se pueda girar el campo para jugar en horizontal en vez de en vertical, pues sí utilizaría esas en vez de las de izquierda y derecha, así que de momento las dejo.
- frenar (el jugador la usa para cambiar de dirección o cuando pierde el balón y hay que replegarse), en las 8 direcciones.
- celebración de gol por todos menos por el que marca. 8 direcciones.
- celebración por parte del que anota el gol. 1 sola dirección, ya que siempre lo celebran igual: lléndose hacia la derecha.
- controlar el balon con el pecho. 8 direcciones.
- pisa el balón (el jugador se queda quieto teniendo el balón en su poder), en 4 direcciones: si vas corriendo en diagonal, se para en una de las 4 direcciones principales: arriba, abajo, izquierda o derecha.
- le arrebata el balón al contrario. 8 direcciones.
- remate de cabeza. 3 direcciones: arriba-izquierda, arriba centro y arriba-derecha. Hacia abajo o sólo los laterales no remata. Aquí pasaría algo parecido a la animación de saque de banda. En principio no uso remates de cabeza laterales pero si girase el campo sí debería hacerlo. No los añado de momento; esto va por días: unos sí añado y otros no xD


Jugador celebrando un gol con el balón enorme.

Versiones 0.02, 0.03, 0.04 y 0.05: (08-07-2012)
Empiezo a ripear y a añadir las imágenes de los jugadores (agregando un jugador de prueba para testear en él lo que hago):
- la animación de "jugador quieto sin balón" en sus 8 direcciones: arriba, abajo, izquierda y derecha y las 4 diagonales.
- la de andar en las 8 direcciones, ajustando bien los ejes entre un frame de la animación y el siguiente (que luego veo que no la usa en el propio juego, así que la quito xD).
- la de correr (que ésta es la que usa), también en sus 8 direcciones.
- la de golpear al balón, cómo no, en sus 8 direcciones, pero con la salvedad de que en 5 de ellas dispara con la pierna derecha y 3 con la izquierda.
- animación de "se cae al suelo" (por una entrada de un rival, por golpearle fuertemente el balón...) en las 8 direcciones.
- la de "gol en propia puerta", en sus 8 direcciones.
Ripeo 81 imágenes del balón. Bueno, el realidad primero 63 (9 frames de 7 animaciones diferentes por los tamaños que toma el balón), después amplío a las 81 de los 9 tamaños que usa, y finalmente lo dejo en 37 porque veo que esos son los que usa el juego realmente, o eso creía yo, porque luego más adelante he visto que usa más, dependiendo de hacia dónde vaya el balón, así que tendré que volver a poner los 81, pero más adelante, cuando vea cuáles usa en que direcciones y tal, y de momento siguen los 37.
Cambio varios colores: líneas del campo, color del pantalón del jugador... ya que comparten colores con el balón, y esto es perjudicial para cuando quiera cambiar los colores de alguna cosa mediante paletas.


Jugador disparando.

Versiones 0.00 y 0.01: (01-07-2012)
Comienzo el juego, abriendo el modo gráfico, instalando el teclado, los caracteres unicodes y añadiendo un temporizador para que la velocidad del juego sea la misma en todas las CPUs.
Declaro las primeras variables y funciones y trato desde ya los cambios de resolución del juego, de momento sólo hago 3 tamaños: 320x240, 640x480 y 960x720, que yo creo que son más que suficientes xD
Cargo la imagen del terreno de juego y la dibujo en pantalla. Después, consigo desplazarme por todo el terreno de juego con las flechas de dirección, con la consecuente creación de los scrolls horizontal y vertical, funcionando ambos a la vez si te desplazas en diagonal y no avanzando más cuando te acercas al final del campo.
Dibujo un círculo (a modo de balón) y hago que la cámara se desplace según en la posición en la que esté esta "pelota".
De momento el juego simplemente carga la imagen del campo y funcionan las fechas, y pulsando ESC abandona el juego por completo.
Permito poder hacer capturas de pantalla, como en el resto de mis juegos.
Creo la función de pausar el juego, que no es como la del resto de mis juegos sino que ésta no consume CPU inútilmente, vamos que parece que está bien hecha xD


Campo y "balón" (los fotógrafos están de adorno xD)