jueves, 14 de julio de 2016

Capítulo 54. Moviendo una figura en Small Basic


Diario de un programador.- Dia 99

Moviendo un cuadrado con el teclado

99 días desde que empecé con esto de la programación, bueno hay que reconocer que son muchos más días ya en una oportunidad mencioné que hay veces en que no escribo ni una sola línea de código por tener que atender otros asuntos como son familia, trabajo etc.


En esta oportunidad voy a hacer que la figura que se muestra a continuación, sea posible moverla en cuatro direcciones diferentes, usando las flechas direccionales del teclado.


Es un simple cuadrado de 50 x 50 ubicado en la posición 0,0. Como es sabido, para dibujar un cuadrado en la ventana gráfica, se hace de la siguiente manera

GraphicsWindow.DrawRectangle(Posicion X,Posicion Y , Ancho,Alto)

La idea es crear un programa que permita modificar la posición X,Y de la figura. Para ello voy a crear eventos que permitan agregar o quitar valores a esas posiciones, por ejemplo, cada vez que presione la flecha direccional derecha, se agrega +1 a la posición X, o si presiono la flecha direccional izquierda, se quitara -1 a la posición X, y así con los demás valores. Para poder jugar con esos valores, crearé una variable que represente cada posición.

x = 0
y = 0

Lo siguiente será crear una subrutina que muestre la figura

Sub cuadrado
  GraphicsWindow.DrawRectangle(x,y, 50,50)
EndSub

Ahora voy a crear el evento que permita generar una acción cada vez que se presiona una tecla

GraphicsWindow.KeyDown = presionar

Posteriormente voy a crear las subrutinas que modifiquen los valores de las posiciones. Empezaré por crear la que modifique la posición X

Sub derecha
  GraphicsWindow.Clear()
  x = x + 5
  cuadrado()
EndSub

Esta subrutina, lo que primero que hará será limpiar la pantalla con la finalidad de que se elimine la antigua posición que tenía. Lo siguiente es el valor de X que aumentará en 5, si primero X valía 0, esta función hará que X sea igual a 5 y cada vez que se llame ese valor aumentará en 5. Por último, se llamará a la subrutina para que dibuje la figura con su nuevo valor. Ya que está lista la primera subrutina, haré lo mismo para cada posición que quiero modificar.

Sub izquierda
  GraphicsWindow.Clear()
  x = x - 5
  cuadrado()
EndSub

Sub abajo
  GraphicsWindow.Clear()
  y = y + 5
  cuadrado()
EndSub

Sub arriba
  GraphicsWindow.Clear()
  y = y - 5
  cuadrado()
EndSub

Ahora, lo que me falta es crear la subrutina que permita realizar alguna acción cuando presiono una tecla, en este caso las flechas direccionales del teclado

Sub presionar
  flecha = GraphicsWindow.LastKey

El inicio de la subrutina. En la segunda línea es creado el evento que permite detectar la última tecla que se presiona y ese valor es guardado en la variable "flecha". Ahora, lo que sigue  de la subrutina queda de la siguiente manera:

  If flecha = "Right" Then
    derecha()
  EndIf
 
Aquí este instrucción dice "Si la útima tecla presionada es "Right" (flecha derecha) entonces, ejecuta la subrutina "derecha()". Ya creado esto, haré lo mismo para las demás.


  If flecha = "Left" Then
    izquierda()
  EndIf
 
  If flecha = "Down" Then
    abajo()
  EndIf
 
  If flecha = "Up" Then
    arriba()
  EndIf
 
EndSub

Ya por último queda llamar a la subrutina "cuadrado()" para dar inicio al programa
cuadrado()
Con esto ya está listo el programa. El código completo es el siguiente:

x = 0
y = 0

Sub cuadrado
  GraphicsWindow.DrawRectangle(x,y, 50,50)
EndSub

GraphicsWindow.KeyDown = presionar

Sub derecha
  GraphicsWindow.Clear()
  x = x + 5
  cuadrado()
EndSub

Sub izquierda
  GraphicsWindow.Clear()
  x = x - 5
  cuadrado()
EndSub

Sub abajo
  GraphicsWindow.Clear()
  y = y + 5
  cuadrado()
EndSub

Sub arriba
  GraphicsWindow.Clear()
  y = y - 5
  cuadrado()
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

cuadrado()

Al ejecutar el programa se tendrá un cuadrado que puede ser controlado por las flechas direccionales del teclado.
Esto es todo por ahora. Saludos

Gustavo J. Cerda Nilo
Febrero 2016, última actualización Julio 2016




3 comentarios:

  1. Buenas, muy buena explicación, pero me encuentro que quiero introducir la diagonales, y no me reconoce la pulsació de dos teclas a la vez. como se puede programar? he creado las subrutinas, y en la de "presionar" he añadido drentro del IF (flecha = "right" and flecha = "down")...

    ResponderEliminar
    Respuestas
    1. Buenas tardes. El problema es que la propiedad Lastkey solamente obtiene la última tecla que se presionó o se liberó, es por ese motivo que no se pueden detectar dos teclas al mismo tiempo. Pero si puedes programar diagonales en un solo botón, por ejemplo, si quisiera programar un movimiento diagonal en la dirección abajo/derecha, puedes lograrlo de la siguiente manera.

      'Primero crear las variables

      x = 0
      y = 0

      'aqui creamos una figura

      Sub cuadrado
      GraphicsWindow.DrawRectangle(x,y, 50,50)
      EndSub
      GraphicsWindow.KeyDown = presionar

      'esta subrutina permite el movimiento diagonal

      Sub abajoDerecha
      GraphicsWindow.Clear()
      y = y + 5
      x = x + 5
      cuadrado()
      EndSub

      'Y posteriormente crear la subrutina que permite el movimiento

      Sub presionar
      flecha = GraphicsWindow.LastKey

      If flecha = "P" Then
      abajoDerecha()
      EndIf
      EndSub
      cuadrado()

      Como se puede ver, aquí se dejó seleccionada la letra "P", la cual debe ir en mayúsculas. Al presionar esa tecla, la figura se desplazará. De esta misma forma pueden programarse las otras diagonales.
      Al momento, es la única manera que conozco. Si encuentro alguna forma de detectar dos teclas a la vez, lo publicaré. Saludos

      Eliminar
  2. Gracias por la explicación. Muy agradecido, pero veo que no es posible detectar dos teclas a la vez y hacer ejecutar una rutina o subrutina...nos dedicaremos a hacer cosas sencillas y no juegos tontos...XD
    Un Saludo!
    att. Jordi

    ResponderEliminar

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