Shell   23-07-2020, 11:49
#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:

Código:
Public Sub Form_KeyPress()

  Dim colores As Collection = ["r": Color.red, "a": Color.yellow, "b": Color.blue, "v": Color.Green]
    
  If colores.Exist(Lower(Key.text)) Then drw.Background = colores[Lower(Key.text)]
 
End

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.

Código:
Const LADO As Integer = 20

Private coordenada As Integer[] = [0, 0]
Private unrectangulo As New Rect
Private movimiento As Boolean

Public Sub Form_Open()
 
  Me.Title = "Movimiento por mapeado de teclas"
 
  coordenada[0] = (drw.w - LADO) / 2
  coordenada[1] = (drw.h - LADO) / 2
 
End

Public Sub Form_KeyPress()
 
  Dim direccion As Collection = [Str(Key.Left): [-5, 0], Str(Key.Right): [5, 0], Str(Key.up): [0, -5], Str(Key.Down): [0, 5]]
 
  If direccion.Exist(Str(Key.code)) Then
    coordenada[0] += direccion[Key.code][0]
    coordenada[1] += direccion[Key.code][1]
    drw.Refresh
  Endif
 
End

Public Sub drw_Draw()
 
  With unrectangulo
    .X = coordenada[0]
    .y = coordenada[1]
    .W = LADO
    .H = LADO
  End With
 
  Paint.LineWidth = 2
  Paint.Brush = Paint.Color(Color.Green)
  Paint.Rectangle(coordenada[0], coordenada[1], LADO, LADO)
  Paint.Stroke
 
End

Public Sub drw_MouseDown()
 
  If unrectangulo.Contains(Mouse.x, Mouse.Y) Then movimiento = True    
 
End

Public Sub drw_MouseMove()
 
  If movimiento Then
    coordenada[0] = Mouse.x - LADO / 2
    coordenada[1] = Mouse.y - LADO / 2
  Endif
  drw.Refresh
 
End

Public Sub drw_MouseUp()
 
  movimiento = False
 
End

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)
Última modificación: 23-07-2020, 12:21 por jguardon.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
jguardon   23-07-2020, 12:24
#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'
Shell   23-07-2020, 13:00
#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

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
guizans   23-07-2020, 22:12
#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.
Shell   24-07-2020, 10:52
#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

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   24-07-2020, 16:13
#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.

Código:
'Usando Timer para desplazamiento suave

Const LADO As Integer = 20

Private coordenada As Integer[] = [0, 0]
Private velocidad As Integer[] = [0, 0]
Private unrectangulo As New Rect

Public Sub Form_Open()
 
  Me.Title = "Desplazamiento en diagonal"
 
  coordenada[0] = (drw.w - LADO) / 2
  coordenada[1] = (drw.h - LADO) / 2
 
  Timer1.Delay = 16
  Timer1.Start  
 
End

Public Sub Form_KeyPress()
 
  'No usar un bloque de condicionales
  'No es necesario el operador AND
 
  If (key.code = Key.Left) Then velocidad[0] = -5   
  If (Key.Code = Key.Right) Then velocidad[0] = 5  
  If (Key.Code = Key.up) Then velocidad[1] = -5
  If (Key.code = Key.Down) Then velocidad[1] = 5
   
End

Public Sub Form_KeyRelease()
 
  If (key.code = Key.Left) Then velocidad[0] = 0
  If (Key.Code = Key.Right) Then velocidad[0] = 0
  If (Key.Code = Key.up) Then velocidad[1] = 0
  If (Key.code = Key.Down) Then velocidad[1] = 0
    
End

Public Sub drw_Draw()
 
  coordenada[0] += velocidad[0]
  coordenada[1] += velocidad[1]
 
  With unrectangulo
    .X = coordenada[0]
    .y = coordenada[1]
    .W = LADO
    .H = LADO
  End With
    
  Paint.FillRect(coordenada[0], coordenada[1], LADO, LADO, Color.Green)
    
End

Public Sub Timer1_Timer()
 
  drw.Refresh

End

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.

Código:
'Usando Timer para desplazamiento suave

Const LADO As Integer = 20

Private coordenada As Integer[] = [0, 0]
Private velocidad As Integer[] = [0, 0]
Private unrectangulo As New Rect

Public Sub Form_Open()
 
  Me.Title = "Desplazamiento en diagonal"
 
  coordenada[0] = (drw.w - LADO) / 2
  coordenada[1] = (drw.h - LADO) / 2
 
  Timer1.Delay = 16
  Timer1.Start  
 
End

Public Sub Form_KeyPress()
 
  'No usar un bloque de condicionales
  'No es necesario el operador AND
 
  If (key.code = Key.Left) Then velocidad[0] = -5   
  If (Key.Code = Key.Right) Then velocidad[0] = 5  
  If (Key.Code = Key.up) Then velocidad[1] = -5
  If (Key.code = Key.Down) Then velocidad[1] = 5
   
End

Public Sub Form_KeyRelease()
 
  If (key.code = Key.Left) Then velocidad[0] = 0
  If (Key.Code = Key.Right) Then velocidad[0] = 0
  If (Key.Code = Key.up) Then velocidad[1] = 0
  If (Key.code = Key.Down) Then velocidad[1] = 0
    
End

Public Sub drw_Draw()
 
  coordenada[0] += velocidad[0]
  coordenada[1] += velocidad[1]
 
  With unrectangulo
    .X = coordenada[0]
    .y = coordenada[1]
    .W = LADO
    .H = LADO
  End With
    
  Paint.FillRect(coordenada[0], coordenada[1], LADO, LADO, Color.Green)
    
End

Public Sub Timer1_Timer()
 
  drw.Refresh

End

Subo ejemplo.

Saludos
Archivos adjuntos
.gz
MovimientoTecladoDiagonalesv2-0.0.1.tar.gz (Tamaño: 11.92 KB Descargas: 0)
Última modificación: 24-07-2020, 17:33 por jguardon.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
guizans   24-07-2020, 17:57
#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.
Shell   24-07-2020, 18:49
#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

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 5 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.