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