viernes, 23 de septiembre de 2016

Capítulo 72: Small Basic. Hacer rebotar un objeto


Diario de un programador.- Día 174

Small Basic.


 Rebotando...

En esta ocasión voy a hacer un programa que siempre me llamó la atención. Se trata de crear una esfera que rebote en las paredes. Parece algo simple, pero es algo que no pude lograr años atrás, cuando traté de iniciarme en la programación con python.

Lo primero que voy a crear será el objeto que se moverá en pantalla. En este caso será una esfera.

bola = Shapes.AddEllipse(32, 32)

Lo siguiente es crear cuatro variables, que servirán para dar movimiento a la esfera, las primeras dos variables (x, y) serán para dar el movimiento al objeto, tanto para avanzar, bajar etc. Las siguientes dos variables (deltaX, deltaY), servirán de auxiliares para indicar hacia donde será el movimiento, dependiendo del valor que tomen estas variables a lo largo del programa, será la dirección hacia donde se dirigirá la esfera.

x = 0
y = 0
deltaX = 1
deltaY = 1

Este programa tendrá una ejecución constante, por lo que necesita crearse un ciclo infinito. En este caso, el ciclo será creado mediante una instrucción goto. Para ello, se insertará la siguiente etiqueta:

EjecutarBucle:

Iniciado el bucle, es tiempo de empezar a agregarle valores de uno en uno a las variables que permitirán el movimiento de la esfera.

x = x + deltaX
y = y + deltaY

Con estas variables, se puede ver que el primer movimiento de la esfera será agregando un valor a X y un valor a Y, logrando que la esfera empiece a moverse en forma diagonal hacia la derecha. La instrucción para mover la esfera se encuentra más abajo.

Lo siguiente a definir es el alto y ancho de la ventana gráfica, esto es para conocer exactamente los límites que tiene la esfera para moverse. Al saber estos valores, se podrá asegurar que la esfera no los traspase. Esos valores serán guardados en las siguientes variables.

ancho = GraphicsWindow.Width
alto = GraphicsWindow.Height

Ahora viene la parte que tal vez sea un poco difícil de entender. Esta parte es la que controla no solamente que la esfera se salga de la pantalla, sino que también realiza el efecto de rebote en las cuatro paredes, tanto las laterales como en el techo y el piso. Lo voy a dividir en dos partes, explicando las que tienen que ver con  las paredes laterales. Una vez explicado eso, entender las que tratan sobre el techo y el piso será fácil ya que es prácticamente lo mismo. El código se trata de una condición que sigue a continuación.

If (x >= ancho - 32 Or x <= 0) Then
  deltaX = -deltaX
EndIf

Vamos por partes dijo Jack el destripador. Tenemos una condición IF que indica en su primera parte x >= ancho Hay que tener en cuenta que por cada iteración o ciclo del bucle, la variable x va aumentando de uno en uno su valor (recordar esta instrucción anterior: x = x + deltaX) Entonces, llegará el momento en que la variable X posea un valor que sea igual o mayor al ancho de la ventana, ese valor corresponde a la pared derecha de la ventana. Supongamos que el ancho de la ventana sea de 400 pixeles. Eso quiere decir que 400 corresponde al lado derecho y 0 corresponde al lado izquierdo (esto es algo que ya debería de conocerse). Continuemos. Luego dice - 32, ese 32 se refiere al tamaño de la esfera definido desde un principio. Si no se coloca el tamaño de la esfera, entonces esta se saldría de la pantalla. Esto es porque el tamaño 0,0 de los objetos están ubicados en la equina superior izquierda. Siguiendo con el ejemplo, si la ventana tuviese un ancho de 400 pixeles, entonces -32 significa que la condición debe cumplirse al llegar a los 368 pixeles. Esta primera parte controla cuando la esfera llega a la pared derecha. La segunda parte dice x <= 0 Esto es para controlar cuando la esfera llegue al pixel 0 que como sabemos, se encuentra en el lado izquierdo. La siguiente línea dice deltaX = -deltaX Lo que hace -deltaX es realizar un cambio de signo al valor de la variable deltaX. En un comienzo, deltaX tiene un valor de 1, ese valor es constante hasta que se cumple la condición. Una vez llegada a la condición, deltaX pasa a tener un valor de -1. Al tener un valor de -1, el movimiento de la esfera es negativo y empieza a retroceder. Al llegar a la condición x <= 0, deltaX vuelve a cambiar de signo, pasando de negativo a positivo, provocando el avance de la esfera.

Ahora vamos por la otra condición, es muy parecida y es para controlar el techo y el suelo.

If (y >= alto - 32 or y <= 0) Then
  deltaY = -deltaY
EndIf

Como se puede apreciar, la condición es muy similar a la anterior y opera la misma propiedad de cambiar el signo, siendo en este caso el signo de deltaY.

Lo que sigue a continuación es la instrucción para mover la esfera. En este caso se utilizó la siguiente instrucción:

Shapes.Move(bola, x, y)

Esta instrucción permite mover la esfera según lo indicado por x,y.

La siguiente instrucción permite controlar la velocidad de desplazamiento de la esfera.

Program.Delay(5)

Lo que hace Program es controlar la ejecución de programas. Delay lo que hace es retrasar la ejecución del programa, lo cual debe ser indicado en milisegundos. A mayor valor más lento se moverá la esfera.
Ya por último queda por dar la condición que permita se ejecute el ciclo o bucle. Para esto se utilizó la siguiente condición:

If (y < alto) Then
  Goto EjecutarBucle
EndIf


Ya con esto, el código está listo para funcionar.


El código completo es el siguiente:

bola = Shapes.AddEllipse(32, 32)

x = 0
y = 0
deltaX = 1
deltaY = 1

EjecutarBucle:
x = x + deltaX
y = y + deltaY

ancho = GraphicsWindow.Width
alto = GraphicsWindow.Height

If (x >= ancho - 32 Or x <= 0) Then
  deltaX = -deltaX
EndIf

If (y >= alto - 32 or y <= 0) Then
  deltaY = -deltaY
EndIf

Shapes.Move(bola, x, y)
Program.Delay(5)

If (y < alto) Then
  Goto EjecutarBucle
EndIf

Esto es todo por ahora. Saludos


Gustavo J. Cerda Nilo
Mayo 2016, Septiembre 2016




No hay comentarios:

Publicar un comentario

C++ El apuntador This

El apuntador This En C++, cada objeto tiene acceso a su propia dirección a través de un puntero o apuntador denominado This. Lo...