domingo, 21 de agosto de 2016

Capítulo 66: Moviendo figuras en Small Basic. Parte 2


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

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...