Diario de un programador.- Día 165
Segunda parte de la clase anterior. Continuaremos con
el resto de los ejercicios.
3.- Código para
evitar que la figura salga de la ventana
Dentro de las subrutinas "arriba, abajo, izquierda y
derecha" agregué el siguiente código. Ejemplo:
If x <= 0 Then ' para
no salir del limite de la pantalla
Shapes.Move(circulo, 0, y)
x = 0
EndIf
Esa condición se encuentra
dentro de la subrutina "izquierda". Como se puede ver, la condición
dice que si "X" es menor o igual a cero, entonces la operación
"Move" hace que la figura se mantenga en su posición y no siga
avanzando, esto debido a que dejé su valor en cero (circulo, 0, y) La variable x = 0
que destaqué a continuación es importante para evitar un pequeño
"bug" o "glitch" (bienvenido a mi mundo jajaja) Lo que
sucedía es que al llegar al límite de la pantalla, efectivamente la figura no
se movía, pero al presionar otra tecla, la figura se "transportaba"
fuera de la pantalla (prueba a quitar esa X para entender lo que digo) Esto
sucedía porque al seguir presionando la tecla en esa dirección, la variable x
iba acumulando valores. Así, al momento de presionar en otra dirección, la
figuraba se desplazaba al lugar donde la variable x había quedado. Al ver esto
(Lo cual me costó varios minutos en entender que estaba pasando) decidí que lo
mejor era igualar la variable x a cero, para que así no acumule valores a pesar
de seguir presionando en esa dirección.
4- Agregar otra figura en pantalla, que se mueva
sola y que cambie de dirección al azar.
Para este ejercicio yo
agregué un cuadrado azul. Luego me puse a analizar el ejercicio y se me ocurrió
que para hacerlo cambiar de dirección debía ocupar la operación Random del
objeto Math. Lo que me tuvo de cabeza un tiempo fue el encontrar alguna
operación que me permita "activar" automáticamente un evento. Fue
entonces que me puse a investigar el objeto Clock, el cual permite acceder al
reloj del sistema. El objeto Clock, tiene la propiedad "second" el
cual obtiene el segundo actual. Como los segundos cambian constantemente,
entonces se me ocurrió ocupar esta propiedad para mi trabajo. La forma en que
ocupé esta propiedad, fue la siguiente: Hice un ciclo infinito, donde cada dos
segundos se llamaba a una subrutina, la cual modifica la posición X,Y de la
figura. Una vez modificada la posición, se emplea la operación
"animate" para desplazar la figura a ese lugar.
El ciclo infinito se
codificó de la siguiente manera:
azar = 1
While azar = 1
reloj = Clock.Second
If
Math.Remainder(reloj, 2) = 0 Then
MovCuad()' <-- Subrutina para mover
la figura
EndIf
EndWhile
La
subrutina para mover la figura quedó de la siguiente manera:
Sub MovCuad
azarX = Math.GetRandomNumber(500)
azarY = Math.GetRandomNumber(500)
Shapes.Animate(cuadrado,azarX,azarY,2000)
EndSub
Esto
es todo. Ahora colocaré el código completo:
imagen =
"G:\fondo.png"
GraphicsWindow.DrawImage(imagen,0,0)
GraphicsWindow.BrushColor =
"Red"
x = 300
y = 200
circulo =
Shapes.AddEllipse(50,50)
Shapes.HideShape(circulo)
Shapes.Move(circulo,x,y)
Shapes.ShowShape(circulo)
GraphicsWindow.KeyDown =
presionar
Sub derecha
x = x + 2
Shapes.move(circulo,x,y)
If x
>= 574 Then ' para no salir del limite de la pantalla
Shapes.Move(circulo, 574, y)
x = 574
EndIf
Posicion()
EndSub
Sub izquierda
x = x - 2
Shapes.Move(circulo,x,y)
If x
<= 0 Then ' para no salir del limite de la pantalla
Shapes.Move(circulo, 0, y)
x = 0
EndIf
Posicion()
EndSub
Sub abajo
y = y + 2
Shapes.Move(circulo,x,y)
If y
>= 392 Then ' para no salir del limite de la pantalla
Shapes.Move(circulo, x, 392)
y = 392
EndIf
Posicion()
EndSub
Sub arriba
y = y - 2
Shapes.Move(circulo,x,y)
If y
<= 0 Then ' para no salir del limite de la pantalla
Shapes.Move(circulo, x, 0)
y = 0
EndIf
Posicion()
EndSub
Sub presionar
flecha = GraphicsWindow.LastKey
If flecha = "Right" Then
derecha()
EndIf
If flecha = "Left" Then
izquierda()
EndIf
If flecha = "Down" Then
abajo()
EndIf
If flecha = "Up" Then
arriba()
EndIf
EndSub
'POSICION DEL CIRCULO
GraphicsWindow.DrawRectangle(520,15,100,50)'cuadro
negro
GraphicsWindow.BrushColor =
"white"'
GraphicsWindow.FillRectangle(521,16,98,48)'cuadro
blanco
GraphicsWindow.BrushColor =
"red"
GraphicsWindow.DrawText(530,
20, "POS X: ")
GraphicsWindow.DrawText(530,
40, "POS Y: ")
GraphicsWindow.DrawText(580,
20, x)
GraphicsWindow.DrawText(580,
40, y)
Sub Posicion
GraphicsWindow.BrushColor = "white"'tuve
que parchar, para no hacer clear
GraphicsWindow.FillRectangle(521,16,98,48)'con
un cuadro blanco ;)
posX = Shapes.GetLeft(circulo)
posY = Shapes.GetTop(circulo)
GraphicsWindow.BrushColor = "red"
GraphicsWindow.DrawText(580, 20, posX)
GraphicsWindow.DrawText(580, 40, posY)
GraphicsWindow.DrawText(530, 20, "POS X:
")
GraphicsWindow.DrawText(530, 40, "POS Y:
")
EndSub
'OTRA FIGURA
GraphicsWindow.BrushColor = "Blue"
cuadrado = Shapes.AddRectangle(50,50)
azar = 1
While azar = 1
reloj = Clock.Second
If Math.Remainder(reloj, 2) = 0 Then
MovCuad()
EndIf
endWhile
Sub MovCuad
azarX = Math.GetRandomNumber(500)
azarY = Math.GetRandomNumber(500)
Shapes.Animate(cuadrado,azarX,azarY,2000)
EndSub
Una vez que se ejecuta el
código, se puede controlar el circulo con las flechas del teclado y la otra
figura parecer tener "vida propia", desplazándose como si fuese un
bicho en nuestra pantalla.
Gustavo J. Cerda Nilo
Marzo 2016, Agosto 2016
No hay comentarios:
Publicar un comentario