Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Mapear teclas en una colección
#1

Buenas!.

Pues comencemos. Cool

Algo que solemos hacer cuando queremos desplazar un sprite por llamarlo de alguna forma.
Ejemplo, un cuadrado dentro de un DrawingArea. Es que si lo hacemos con teclado, tenemos
que crear un grupo de sentencias condicionales, si queremos desplazar a la izquierda, a la derecha..etc.
Eso puede alargar el código.

Podemos usar las colecciones. Imaginar que queremos mediante la pulsación de una tecla
cambiar el color de fondo de un DrawingArea. Si, podemos usar las condicionales también.
Pero podemos ahorrarnos eso.

Bien. El primer problema que me encuentro es:
Usar el evento KeyPress del propio DrawingArea para saber que tecla se ha pulsado y donde lo voy a usar ¿ no ?.
Pues no. Se debe usar el evento KeyPress del formulario.

Tenemos un formulario con tan solo un DrawingArea:

GAMBAS
  1. Public Sub Form_KeyPress()
  2.  
  3.   Dim colores As Collection = ["r": Color.red, "a": Color.yellow, "b": Color.blue, "v": Color.Green]
  4.     
  5.   If colores.Exist(Lower(Key.text)) Then drw.Background = colores[Lower(Key.text)]
  6.  



Podía haber añadido que se mostrase la combinación de colores en la barra de títulos, pero ahora no me acuerdo de ColorInfo. Blush

¿ Cómo lograríamos el movimiento si fueran las teclas del cursor ?.

En este código voy a usar para desplazar la figura, los cursores y ademas el ratón. Nos interesa la parte de los cursores.
Como dicen en otro lenguaje...  Rolleyes ...la clase rect es nuestra amiga.

GAMBAS
  1. Const LADO As Integer = 20
  2.  
  3. Private coordenada As Integer[] = [0, 0]
  4. Private unrectangulo As New Rect
  5. Private movimiento As Boolean
  6.  
  7. Public Sub Form_Open()
  8.  
  9.   Me.Title = "Movimiento por mapeado de teclas"
  10.  
  11.   coordenada[0] = (drw.w - LADO) / 2
  12.   coordenada[1] = (drw.h - LADO) / 2
  13.  
  14.  
  15. Public Sub Form_KeyPress()
  16.  
  17.   Dim direccion As Collection = [Str(Key.Left): [-5, 0], Str(Key.Right): [5, 0], Str(Key.up): [0, -5], Str(Key.Down): [0, 5]]
  18.  
  19.   If direccion.Exist(Str(Key.code)) Then
  20.     coordenada[0] += direccion[Key.code][0]
  21.     coordenada[1] += direccion[Key.code][1]
  22.     drw.Refresh
  23.  
  24.  
  25. Public Sub drw_Draw()
  26.  
  27.   With unrectangulo
  28.     .X = coordenada[0]
  29.     .y = coordenada[1]
  30.     .W = LADO
  31.     .H = LADO
  32.  
  33.   Paint.LineWidth = 2
  34.   Paint.Brush = Paint.Color(Color.Green)
  35.   Paint.Rectangle(coordenada[0], coordenada[1], LADO, LADO)
  36.   Paint.Stroke
  37.  
  38.  
  39. Public Sub drw_MouseDown()
  40.  
  41.   If unrectangulo.Contains(Mouse.x, Mouse.Y) Then movimiento = True    
  42.  
  43.  
  44. Public Sub drw_MouseMove()
  45.  
  46.   If movimiento Then
  47.     coordenada[0] = Mouse.x - LADO / 2
  48.     coordenada[1] = Mouse.y - LADO / 2
  49.   drw.Refresh
  50.  
  51.  
  52. Public Sub drw_MouseUp()
  53.  
  54.   movimiento = False
  55.  



Como sabéis la clave de una colección es una cadena que es lo que uso al convertir el código de la tecla pulsada.
Si imprimiésemos una de las teclas del cursor, no veríamos mucho en la consola de Gambas

Y ahora voy a intentar subir el código. Smile

No he usado velocidad. Según sea derecha, izquierda, arriba o abajo. Siempre uso un valor constante de cinco que o bien sumo o resto
a la coordenada x o y. Si lo sé no he usado diagonales...eso seria complicarlo. Tongue

Saludos

Pues no parece que se vea el formato del código de Gambas. Undecided


Archivos adjuntos
.gz MovimientoColeccionTeclado-0.0.1.tar.gz Tamaño: 11.96 KB  Descargas: 1

"Pero no toques, por qué tocas? - Amador"
    ¡Gracias!
#2

(23-07-2020, 11:49)Shell escribió:  Pues no parece que se vea el formato del código de Gambas. Undecided

En la ventana emergente que sale al pulsar el botón de la gambas naranja, "Insert geshi" tienes que escribir el nombre del lenguaje. Es poco práctico, lo sé, pero de momento no he podido solucionarlo de otra forma. Me gustaría que saliera un selector tipo combobox para escoger el lenguaje, pero de momento es lo que hay. He corregido tu post, si le das a editar verás cómo queda la etiqueta.

Saludos

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
    ¡Gracias!
#3

Gracias Jesús.

Ahora ya sé como se hace. Son cambios que tenemos que aprender.

Para copiar y pegar el código se hace manualmente entonces, selección y arrastrar hasta el final de este y copiar.

¿ La presentación de un código embebido se queda en un área evitando expandirse por todo el mensaje ?.
No es mala idea, dificulta un poco la visión del código. Hubiera sido interesante una opción a la derecha
de esa ventana embebida con la posibilidad de expandir y reducir, empujando el texto que queda debajo
de la ventana. Es lo que hay. Se localiza mejor lo que quiero decir el texto.

Seria interesante que estas aplicaciones tuvieran como un perfil de usuario, al igual que pasa con el tema de los colores que
le gusta al usuario. Que se aplicase otras condiciones. Propiedades que solo la ve de una manera el usuario pero es indiferente
a como la pueda ver otro usuario. Imagina que a este usuario no le interesa ver los iconos gestuales por decir algo.

Parece más bien tarea de administradores.

Saludos

"Pero no toques, por qué tocas? - Amador"
    ¡Gracias!
#4

Hola.

Hace tiempo que jugué un poco con el tema de mover un sprite por la pantalla. En mi caso lo que no pude lograr hacer es mapear dos teclas al mismo tiempo, es decir, arriba y derecha para mover el objeto en diagonal. No se si se podrá hacer ahora y como se haría.

Un saludo.
    ¡Gracias!
#5

(23-07-2020, 22:12)guizans escribió:  Hace tiempo que jugué un poco con el tema de mover un sprite por la pantalla. En mi caso lo que no pude lograr hacer es mapear dos teclas al mismo tiempo, es decir, arriba y derecha para mover el objeto en diagonal. No se si se podrá hacer ahora y como se haría.

Realmente lo que estaba interesado es en el uso de una colección para evitar los ifs. Estoy viendo ejemplos con la librería Pygame y los convierto a Gambas.
Aprendo para los dos. Una de ellas fue el mapear los cursores en una colección.

Es probable que no se pueda mapear dos teclas en una colección pero con if's seguro que puedes conseguir el movimiento diagonal.
Repaso el ejemplo y lo modifico a ver si se puede. Wink

Saludos

"Pero no toques, por qué tocas? - Amador"
    ¡Gracias!
#6

Guizans:

Pues listo, conseguido.

En principio no uses un bloque de condicionales, se tienen que ejecutar todas las condiciones para comprobar a donde se mueve el sprite.
Y como en el ejemplo cada movimiento que hacía al pulsar las teclas refrescaba el DrawingArea al ser dos teclas  hay como intervalo de pausa
breve. Es mejor usar directamente para refresco un Timer para suavidad.

Me he centrado solo en el movimiento con teclas del cursor y eliminado la parte de ratón.

GAMBAS
  1. 'Usando Timer para desplazamiento suave
  2.  
  3. Const LADO As Integer = 20
  4.  
  5. Private coordenada As Integer[] = [0, 0]
  6. Private velocidad As Integer[] = [0, 0]
  7. Private unrectangulo As New Rect
  8.  
  9. Public Sub Form_Open()
  10.  
  11.   Me.Title = "Desplazamiento en diagonal"
  12.  
  13.   coordenada[0] = (drw.w - LADO) / 2
  14.   coordenada[1] = (drw.h - LADO) / 2
  15.  
  16.   Timer1.Delay = 16
  17.   Timer1.Start  
  18.  
  19.  
  20. Public Sub Form_KeyPress()
  21.  
  22.   'No usar un bloque de condicionales
  23.   'No es necesario el operador AND
  24.  
  25.   If (key.code = Key.Left) Then velocidad[0] = -5   
  26.   If (Key.Code = Key.Right) Then velocidad[0] = 5  
  27.   If (Key.Code = Key.up) Then velocidad[1] = -5
  28.   If (Key.code = Key.Down) Then velocidad[1] = 5
  29.    
  30.  
  31. Public Sub Form_KeyRelease()
  32.  
  33.   If (key.code = Key.Left) Then velocidad[0] = 0
  34.   If (Key.Code = Key.Right) Then velocidad[0] = 0
  35.   If (Key.Code = Key.up) Then velocidad[1] = 0
  36.   If (Key.code = Key.Down) Then velocidad[1] = 0
  37.     
  38.  
  39. Public Sub drw_Draw()
  40.  
  41.   coordenada[0] += velocidad[0]
  42.   coordenada[1] += velocidad[1]
  43.  
  44.   With unrectangulo
  45.     .X = coordenada[0]
  46.     .y = coordenada[1]
  47.     .W = LADO
  48.     .H = LADO
  49.     
  50.   Paint.FillRect(coordenada[0], coordenada[1], LADO, LADO, Color.Green)
  51.     
  52.  
  53. Public Sub Timer1_Timer()
  54.  
  55.   drw.Refresh
  56.  



Subo ejemplo.

Saludos

Guizans:

Pues listo, conseguido.

En principio no uses un bloque de condicionales, se tienen que ejecutar todas las condiciones para comprobar a donde se mueve el sprite.
Y como en el ejemplo cada movimiento que hacía al pulsar las teclas refrescaba el DrawingArea al ser dos teclas  hay como intervalo de pausa
breve. Es mejor usar directamente para refresco un Timer para suavidad.

Me he centrado solo en el movimiento con teclas del cursor y eliminado la parte de ratón.

GAMBAS
  1. 'Usando Timer para desplazamiento suave
  2.  
  3. Const LADO As Integer = 20
  4.  
  5. Private coordenada As Integer[] = [0, 0]
  6. Private velocidad As Integer[] = [0, 0]
  7. Private unrectangulo As New Rect
  8.  
  9. Public Sub Form_Open()
  10.  
  11.   Me.Title = "Desplazamiento en diagonal"
  12.  
  13.   coordenada[0] = (drw.w - LADO) / 2
  14.   coordenada[1] = (drw.h - LADO) / 2
  15.  
  16.   Timer1.Delay = 16
  17.   Timer1.Start  
  18.  
  19.  
  20. Public Sub Form_KeyPress()
  21.  
  22.   'No usar un bloque de condicionales
  23.   'No es necesario el operador AND
  24.  
  25.   If (key.code = Key.Left) Then velocidad[0] = -5   
  26.   If (Key.Code = Key.Right) Then velocidad[0] = 5  
  27.   If (Key.Code = Key.up) Then velocidad[1] = -5
  28.   If (Key.code = Key.Down) Then velocidad[1] = 5
  29.    
  30.  
  31. Public Sub Form_KeyRelease()
  32.  
  33.   If (key.code = Key.Left) Then velocidad[0] = 0
  34.   If (Key.Code = Key.Right) Then velocidad[0] = 0
  35.   If (Key.Code = Key.up) Then velocidad[1] = 0
  36.   If (Key.code = Key.Down) Then velocidad[1] = 0
  37.     
  38.  
  39. Public Sub drw_Draw()
  40.  
  41.   coordenada[0] += velocidad[0]
  42.   coordenada[1] += velocidad[1]
  43.  
  44.   With unrectangulo
  45.     .X = coordenada[0]
  46.     .y = coordenada[1]
  47.     .W = LADO
  48.     .H = LADO
  49.     
  50.   Paint.FillRect(coordenada[0], coordenada[1], LADO, LADO, Color.Green)
  51.     
  52.  
  53. Public Sub Timer1_Timer()
  54.  
  55.   drw.Refresh
  56.  



Subo ejemplo.

Saludos


Archivos adjuntos
.gz MovimientoTecladoDiagonalesv2-0.0.1.tar.gz Tamaño: 11.92 KB  Descargas: 0

"Pero no toques, por qué tocas? - Amador"
    ¡Gracias!
#7

Hola Shell.

 Pues cuando tenga un hueco voy a probar tu código. Efectivamente yo estaba usando If con condicionales y por más que lo intentara no lo conseguía. No pretendo hacer un video juego con Gambas, cosa que no se si es posible, pero de aquella vez me entrara la curiosidad y después de tanto tiempo ha quedado resuelta. Big Grin

Un saludo.
    ¡Gracias!
#8

(24-07-2020, 17:57)guizans escribió:  No pretendo hacer un video juego con Gambas, cosa que no se si es posible, pero de aquella vez me entrara la curiosidad y después de tanto tiempo ha quedado resuelta.

Claro que se puede. Depende hasta donde quieras llegar. Si son cosas sencillas, todo lo que puedas entender como programador para crear un juego.
Que crear un videojuego no es cosa fácil. A mi me gusta, pero son cosas muy sencillas. Ejemplos pequeños para entender como algo funciona.

Ya entrar en cuestiones muy técnicas, dominar por ejemplo OpenGL, me parece que te puedes encontrar problemas con Gambas, no lo soporta completamente.
Pero no dudo que puedes hacer cosas curiosas.

Hacerlo partiendo de cero me parece que no es lo más adecuado, cuando hoy existen herramientas para los profesionales.
Lo hago por diversión. Por comparación.

En parte es que me gusta el tema de dibujar y llegar a entenderlo usando SDL, Paint y de esto a crear un videojuego simple, van unos pasos.
Pero a todos lados se llega. A veces algo tarde. Big Grin

Saludos

"Pero no toques, por qué tocas? - Amador"
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)