Comunidad Gambas-es
Repetir una rutina indefinidaménte - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: Repetir una rutina indefinidaménte (/thread-1611.html)



Repetir una rutina indefinidaménte - Shell - 19-02-2024

Buenas!.

¿ Se acuerdan que es un bucle ?. Big Grin

- Mediante el ratón y la pulsación del botón izquierdo de este voy creando sprites/imágenes por un control DrawingArea.

Encontré dos formas de hacerlo:

- Mediante un bucle While que comprueba constantemente si se ha pulsado el botón izquierdo del ratón

Pero eso tiene un problema. Un bucle While que está constantemente comprobando y comprobando parece
algo como un bucle sin fin. Tiene que haber algo que lo frene un poco..

Primera versión, con el bucle While.

Código:
Public Sub CrearSprites(ix As Integer, iy As Integer)

  Dim asprite As Sprite
  Dim aimage As Image

  While botonpulsado
    aimage = Image.Load("Imagenes/" & anomimagenes[Rand(0, anomimagenes.max)])
    asprite = New Sprite([ix, iy], [Rnd(-1, 1), Rnd(-1, 1)], Rand(0, 360), Deg(Rnd(-0.1, 0.1)), aimage)
    asprites.Add(asprite)
    Wait 0.01 'Obligatorio dentro del bucle. Cada Sprite se crea según este tiempo, no lo que diga el reloj
  Wend

End

Ese bucle recibe la coordenada del ratón y en la zona de dibujar del control DrawingArea no se controla si se ha pulsado o no
el botón izquierdo del ratón. Ese DrawingArea es refrescado por un Timer.

Código:
Public Sub Ventana_Draw()

  Dim asprite As Sprite

  For Each asprite In asprites
    asprite.Dibujar()
    asprite.Update()
    asprite.vel = colisionBordes([VENTANA_ANCHO, VENTANA_ALTO], asprite)
  Next

End

Segunda versión. Se evita el uso del bucle while.

Código:
Public Sub CrearSprites(ix As Integer, iy As Integer)

  Dim asprite As Sprite
  Dim aimage As Image

  aimage = Image.Load("Imagenes/" & anomimagenes[Rand(0, anomimagenes.max)])
  asprite = New Sprite([ix, iy], [Rnd(-1, 1), Rnd(-1, 1)], Rand(0, 360), Deg(Rnd(-0.1, 0.1)), aimage)
  asprites.Add(asprite)

End

Tuve que añadir dos variables comunes a todo el formulario para saber en "todo" momento donde se ha hecho clic
con el ratón.

Código:
Public Sub Ventana_Draw()

  Dim asprite As Sprite

  If botonpulsado Then CrearSprites(mx, my)
  For Each asprite In asprites
    asprite.Dibujar()
    asprite.Update()
    asprite.vel = colisionBordes([VENTANA_ANCHO, VENTANA_ALTO], asprite)
  Next

End

botonpulsado se produce naturalmente cuando hacemos click con el ratón en algún lugar de la ventana de dibujo.
Al usar esas variables globales (por llamarlas de alguna forma, común a toda la clase). Carece de importancia
llamar a crear el sprite en los eventos del ratón.

Uso dos:

- Uno para dibujar en el mismo lugar. MouseDown
- Para crear una estela de sprites por la zona de dibujo. MouseMove.

Código:
Public Sub Ventana_MouseDown()

  If Mouse.Left Then
    botonpulsado = True
    mx = Mouse.X
    my = Mouse.Y
    'CrearSprites(mx, my)
  Endif

End

Public Sub Ventana_MouseMove()

  mx = Mouse.X
  my = Mouse.Y
  'If Mouse.Left Then CrearSprites(mx, my)

End

Voy a subiros el proyecto ejemplo. FormEjemplo1 usa el bucle While y FormEjemplo2, no.
El área de dibujo es de 1600x900. No creo que haya problema en reducirla, podéis hacerlo en las dos constantes del principio
del código.

No subo la imagen de la demo entero ya que es un poco grande. Subo una parte. Solo objetos por todos lados
creados con el ratón.

[Imagen: nmntXnn.png]

Recordar , debéis dejar pulsado el botón izquierdo. También podéis dejado pulsado el botón y mover el ratón.
Ejecutar un form u otro. Y ojo, a más imágenes , mas se calienta la computadora. Rolleyes

Llevo unos días con esto que puede parecer una tontería. En realidad, queriendo controlar otras cosas.

Saludos


RE: Repetir una rutina indefinidaménte - guizans - 19-02-2024

¡Qué bueno! Me ha resultado muy curioso, está genial.

Un saludo.