Buenas!.
¿ Se acuerdan que es un bucle ?.
- 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.
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.
Llevo unos días con esto que puede parecer una tontería. En realidad, queriendo controlar otras cosas.
Saludos