Imprimir

Reorganización del código en métodos

Poco a poco puedes ir viendo que el código va creciendo y llega un momento en que puede perder algo de legibilidad por la cantidad de líneas de código que se incluyen en la aplicación. A continuación vas a poder aprender a organizar el código declarando métodos dentro de la clase que estés desarrollando. Así el código puede quedar mejor organizado, pudiendo además reutilizar los bloques de código ejecutándolos cada vez que lo necesites con sólo llamar al método que hayas creado.

Método para reinicio de partida

Podemos , por ejemplo, crear un método donde se incluyan las líneas necesarias para reiniciar cada partida del juego. Es decir, donde se coloque la bola en su posición inicial, y se ponga a cero el contador de la puntuación.

La declaración de un método que vayas a utilizar dentro de la clase actual puedes hacerla de la siguiente manera. El código deberás escribirlo dentro de la clase, pero fuera de cualquier otro método, es decir, fuera del método start o de los métodos handle que hemos usado anteriormente.

Screen Shot 2018 01 22 at 22.05.26 ea434

Las palabras utilizadas en esta declaración tienen el siguiente efecto:

Dentro de la declaración del método debes incluir las líneas de código que se deberán ejecutar cuando sea llamado este método. En este caso debes mover dentro del método las líneas que ya se habían utilizado para reiniciar el juego cuando la bola llega al borde derecho de la ventana:

Screen Shot 2018 01 22 at 22.20.21 eefac

Al escribir ese código verás que surge un problema con la utilización de la variable textScore. Esto ocurre porque esa variable está declarada dentro del método start de la aplicación, por lo que sólo podrá ser utilizada dentro de dicho método. Resumiendo el código que ya tenemos se vería algo así:

Screen Shot 2018 01 22 at 22.27.47 9c83b

Si necesitamos que la variable textScore sea visible en los métodos start y resetGame, habrá que sacar la parte de la declaración de la variable para hacerlo fuera de cualquiera de ambos métodos:

Screen Shot 2018 01 22 at 22.30.24 78936

Ten cuidado de eliminar la parte de la declaración de la variable (la palabra Text en este caso) del interior del método start. Si no lo hicieras estarías declarando 2 variables distintas con el mismo nombre.

Ahora llega el momento de llamar a este método sustituyendo al código que realizaba las mismas acciones. Tan sólo deberás indicar en ese lugar el nombre del método seguido de los paréntesis vacíos.

Screen Shot 2018 01 22 at 22.36.05 37357

Con el fin de que esos valores que se indican para reiniciar una partida también se utilicen en la primera ejecución de la aplicación, conviene hacer una llamada a este mismo método dentro del método start de la aplicación.

Screen Shot 2018 01 22 at 22.41.22 f25f6

De esta manera, si deseas cambiar algo que afecte al inicio de cada partida, deberás incluir el código correspondiente dentro de la declaración del método que acabas de crear. Por ejemplo, podemos añadir el código necesario para que la posición Y inicial de la bola sea diferente en el inicio de cada partida. Para ello necesitamos conocer también cómo crear números aleatorios, que en Java se pueden obtener con la clase Random.

Screen Shot 2018 01 22 at 22.50.17 309fe

Observa que para generar un número aleatorio se crea un objeto de la clase Random de la manera habitual. A continuación se usa el método nextInt sobre ese objeto. Este método retorna un valor aleatorio entre 0 y el valor que se indique como parámetro (no inclusive). En este caso se quiere obtener un número aleatorio entre el tamaño vertical de la ventana, por lo que se hace referencia a la constante SCENE_TAM_Y. Así se almacena en la variable ballCenterY un valor aleatorio entre 0 y 399.

Ejecuta varias veces la aplicación y comprueba que la bola aparece en distintas posiciones cada vez que se inicie la aplicación y cada vez que se reinicia una partida.

Uso de la palabra this

Quizá te llame la atención que hasta ahora siempre que se usaba un método se precedía de un objeto o una clase (si el método es estático) y un punto, por ejemplo: random.nextInt(), textScore.setText(), rectStick.setFill(), etc. Y ahora, para usar el método que hemos creado sólo se indica el nombre del método sin estar precedido de nada.

Esto es porque el método se encuentra declarado en la misma clase desde donde se está invocando. En esos casos, no es necesario indicar nada, aunque también se puede usar la palabra this, especificando que se está haciendo referencia al método de esta (this) clase.

Screen Shot 2018 01 22 at 23.03.00 375dd

En general, no se suele utilizar este formato a no ser que sea estrictamente necesario cuando haya que evitar confusiones. En ocasiones viene bien su uso ya que NetBeans mostrará (tras escribir el punto) la lista de métodos y propiedades declaradas dentro de la misma clase.

Declaración de métodos con parámetros

Si se necesita indicar uno o varios datos a un método, se deben declarar los parámetros necesarios que permitan ese paso de información desde la llamada al método hacia su declaración.

Método para el dibujo de la red

La declaración de los parámetros se realiza de manera similar a la declaración de las variables, indicando el tipo de dato seguido de un nombre identificador.

Vamos a probarlo creando un nuevo método para el dibujo de la red, para que se pueda modificar su diseño más cómodamente.

Hasta ahora el dibujo de la red se ha hecho de la siguiente manera, dentro del método start de la aplicación:

Screen Shot 2018 01 22 at 23.13.23 204ea

Este código va creando líneas con un tamaño vertical de 10 puntos, un ancho de 4 puntos y con una separación de 30 puntos entre cada una. Vamos a ver que creando un método podemos hacer este código más sencillo de modificar si se desea cambiar alguno de esos datos.

Screen Shot 2018 01 22 at 23.23.12 d0afc

(Al igual que había pasado en el método anterior, tendrás que cambiar de sitio la declaración de la variable root, para que tenga visibilidad dentro de este método).

Se han creado 3 parámetros para la altura (portionHeight), el ancho (portionWidth) y el espacio (portionSpacing) entre cada porción de la red todos de tipo int (numérico entero). Observa que los identificadores de cada parámetro se usan en los lugares correspondientes dentro del código del método.

Ahora sustituye el código inicial que creaba el dibujo de la red por la llamada al método, indicando los valores que se muestran para mantener los mismos tamaños que antes:

Screen Shot 2018 01 22 at 23.27.03 2459f

Comprueba que se sigue mostrando la red igual que antes, y después prueba a cambiar los valores de los parámetros para que la red tenga otro formato. Por ejemplo:

Screen Shot 2018 01 22 at 23.29.30 fbd97

Métodos con valores de retorno

Hasta ahora has creado métodos que no retornan ningún valor. Vamos a ver que también puedes crear métodos que como resultado de su ejecución generen un valor de retorno que se puede asignar a una variable o utilizar directamente la llamada al método como el valor que retorna.

Método para obtener la zona de contacto de la bola con la pala

Más adelante programaremos la aplicación de manera que según la zona donde contacte la bola con la pala, la velocidad Y de la bola será diferente. Si la bola contacta con la parte superior de la pala, la bola rebotará hacia arriba con una velocidad Y mayor, y si contacta con la parte más inferior rebotará con una velocidad Y hacia abajo mayor que la normal.

Así que vamos a suponer que la pala esté dividida en 4 secciones, que podemos numerar del 1 a 4 como se representa en este gráfico:

PongFX 31 f7404

Este método necesitará conocer datos sobre la bola y sobre la pala, por lo que se le pasarán como parámetros ambos objetos para que utilice la información que necesite de ellos.

Observa que tras la palabra private se debe indicar el tipo de dato que va a retornar el método. En este caso se indica que será de tipo int, ya que se desea obtener un valor numérico entero que identifica a cada zona de las comentadas antes.

Screen Shot 2018 01 22 at 23.50.57 feb4c

Para retornar un valor dentro de un método en Java se usa la palabra return seguida del valor a retornar.

La primera acción que realiza el código anterior es comprobar si la bola ha contactado con la pala. Si no es así, el método retornará el valor 0.

La variable offsetBallStick almacena la distancia que se detecta entre la posición del rectángulo y centro de la bola. Si ese valor es menor que el 10% de la altura de la pala se considerará que ha contactado en la zona 1. Si no es ese caso, se comprueba si ha contactado de la mitad de la pala hacia arriba, en cuyo caso sería la zona 2. Se considera que ha contactado en la zona 3 si la posición de la bola es mayor al centro de la pala y menor que el 90% de su altura. La zona de contacto se considera la 4 si el punto de contacto es mayor que el 90% del tamaño de la pala.

Ese valor que se retorna se puede almacenar en una variable para poder utilizar su contenido posteriormente. Para ello, usa delante de la llamada al método el operador de asignación (=) que ya conoces, junto con el nombre de la variable.

Screen Shot 2018 01 22 at 23.54.39 6624a

Ahora podemos crear un nuevo método que modifique las propiedades ballCurrentSpeedX y ballCurrentSpeedY de esta clase, para que la bola tome distintos ángulos (velocidad en Y) según la zona de contacto. Observa que se asignan valores más altos (6 y -6) a la velocidad Y cuando la zona de contacto es uno de los extremos de la pala. Se indicará por parámetro el valor correspondiente a la zona de contacto:

Screen Shot 2018 01 22 at 23.53.38 fbfdd

Como este método no va a retornar ningún valor (void) y hay que pasar por parámetro la zona de comtacto, la llamada se debe hacer así:

Screen Shot 2018 01 22 at 23.55.32 f07ca

En realidad, la variable collisionZone se podría dejar de usar si el código anterior se sustituye por el siguiente, donde se usa directamente el valor retornado por getStickCollisionZone para usarlo como parámetro de calculateBallSpeed. Pero no sólo hay que tener en cuenta el ahorro de líneas de código, sino también facilitar su legibilidad, por lo que recomendaría dejarlo como antes.

Screen Shot 2018 01 22 at 23.56.53 9f346

Ejecuta la aplicación y comprueba que la bola toma distintos ángulos según la zona de contacto con la pala.