Programación VB como hacer volar mariposas
El siguiente código es un programa para realizar el vuelo aleatorio de una sola imagen. Puede hacer lo siguiente:
1. cambiar la dirección de vuelo (como implica la pregunta) El "retorno" requerido solo se puede mover hacia adelante y hacia atrás en una línea. Este programa permite que la mariposa comience en cualquier posición y vuele alrededor de la ventana), y la cabeza también lo hará. cambiar de dirección
2. Cuando el formulario cambia de tamaño, la mariposa no desaparecerá, pero continuará volando en el nuevo formulario inmediatamente
'Cree un control Imagen1 y establezca Apariencia=0. AutoRedraw=True AutoSize en su cuadro de diálogo de propiedades =True BorderStyle=0, y luego cargue la imagen de la mariposa en su Imagen
'Cree un control Picture2 y establezca Appearance=0 AutoRedraw=False AutoSize=False BorderStyle=0 en su cuadro de diálogo de propiedades, otras Las propiedades predeterminadas no deben cambiarse
'El color de fondo del formulario está configurado para que sea consistente con el color de fondo de la imagen de la mariposa en este programa, es decir &H80000009&
'Agregar un control Timer1
Private Const Pi = 3.1415926535
Función de declaración privada SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Función de declaración privada GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Dim x0!, y0!, x1!, x2!, y1!, y2!, foot!, zt% 'x0 e y0 son la longitud y la altura del marco de la imagen, (x1, y1)-(x2, y2) es En el sistema de coordenadas de la ventana, pie es la longitud del paso en movimiento de la mariposa y zt es la marca de línea de la mariposa volando.
Dim k o 1/k es la pendiente de la trayectoria de vuelo. /p>
Bandera tenue Como bandera booleana 'determina si volar en sentido horario o antihorario
Private Sub bmp_rotate(pic1 Como PictureBox, pic2 Como PictureBox, ByVal theta As Single) 'Gira la imagen en un modo personalizado ángulo
Atenuar c1x como entero, c1y como entero
Atenuar c2x como entero, c2y como entero
Atenuar a como único
Atenuar p1x como entero, p1y como entero
Dim p2x como entero, p2y como entero
Dim n como entero, r como entero
c1x = pic1.ScaleWidth / 2
c1y = pic1.ScaleHeight / 2
c2x = pic2.ScaleWidth / 2
c2y = pic2.ScaleHeight / 2
Si c2x < c2y Entonces n = c2y Si no n = c2x
n = n - 1
pic1hDC& = pic1.hdc
>pic2hDC& = pic2.hdc
Para p2x = 0 a n
Para p2y = 0 a n
Si p2x = 0 Entonces a = Pi / 2 De lo contrario a = Atn(p2y / p2x)
r = Sqr(1& * p2x * p2x + 1& * p2y * p2y)
p1x = r * Cos(a + theta) p>
p1y = r * Sin(a + theta)
c0& = GetPixel(pic1hDC, c1x + p1x, c1y + p1y)
c1& = GetPixel(pic1hDC, c1x - p1x, c1y - p1y)
c2& = GetPixel(pic1hDC, c1x + p1y, c1y - p1x)
c3& = GetPixel(pic1hDC, c1x - p1y, c1y + p1x)
Si c0& <> -1 Entonces xret& = SetPixel(pic2hDC, c2x + p2x, c2y + p2y, c0&)
Si c1& <> -1 Entonces xret& = SetPixel(pic2hDC, c2x - p2x, c2y - p2y, c1&)
Si c2& <> -1 Entonces xret& = SetPixel(pic2hDC, c2x + p2y, c2y - p2x, c2&)
Si c3& <> -1 Entonces xret& = SetPixel(pic2hDC, c2x - p2y, c2y + p2x, c3&)
Siguiente
t% = DoEvents()
Siguiente p>
End Sub
Private Sub Place(ByVal picnum As Integer, ByVal x As Single, ByVal y As Single) 'Controla la posición de los dos cuadros de imagen
Si picnum = 1 Entonces
Imagen1.Left = x
Imagen1.Top = y
Si no
Imagen2.Left = x p >
Picture2.Top = y
End If
End Sub
Private Sub Direct(ByVal angle As Integer) 'Gira la imagen según el ángulo especificado, el ángulo es el ángulo
ángulo = ángulo Mod 360
hudu = (Pi * ángulo * 1#) / (180 * 1#) 'radian
bmp_rotate Imagen1, Imagen2, hudu
Fin Sub
Sub privado Form_Activ
comió()
x1 = 0!
x2 = 10000!
y1 = 0!
y2 = 10000!
Me.Scale (x1, y1)-(x2, y2)
Aleatorio
Imagen1.ScaleMode = 3
Imagen2.ScaleMode = 3
x0 = Imagen1.Ancho
Imagen2.Ancho = x0
y0 = Imagen1.Alto
Imagen2.Alto = y0 p> p>
Imagen1.Visible = Verdadero
Imagen2.Visible = Falso
x = Int(1000 + (x2 - x1 - x0 - 1000) * Rnd) ' La mariposa sale La abscisa del punto inicial
y = Int(1000 + (y2 - y1 - y0 - 1000) * Rnd) 'La ordenada del punto inicial de la mariposa
k = y / x 'k es la pendiente de tocar el borde horizontal o salir del borde vertical, 1/k es la pendiente de tocar el borde vertical o salir del borde horizontal
Lugar 1, -x2, y2 - y0 'Cambiar el marco de la imagen La fuente de la copia sale del rango visible del formulario, pero la propiedad Visible debe ser Verdadera, de lo contrario la copia de la imagen fallará
Coloque 2, x, y 'Inicializar la posición inicial de la mariposa
Timer1 Enabled = True
Timer1.Interval = 100 'Definir período de movimiento
zt = 0
Fin Sub
Sub privado Form_Click()
Timer1.Enabled = No Timer1.Enabled
Fin Sub
Sub privado Form_Resize() 'Cuando el formulario cambia de tamaño, es necesario redefinir el sistema de coordenadas
p>
x1 = 0!
x2 = 10000!
y1 = 0!
y2 = 10000!
Me .Escala (x1, y1)-(x2, y2)
Cls
x0 = Imagen1.Ancho
Imagen2.Ancho = x0
y0 = Imagen1.Alto
Imagen2.Alto = y0
'Si la mariposa está fuera de la ventana, recuérdela inmediatamente
Si Imagen2.Izquierda < x1 Entonces coloque 2, x1, Imagen2.Arriba
Si Imagen2.Arriba < y1 Luego coloque 2, Imagen2.Izquierda, y1
Si Imagen2.Izquierda > x2 - x1 - x0 Luego coloque 2, x2 - x1 - x0, Imagen2.Arriba
Si Imagen2.Arriba > y2 - y1 - y0 Luego coloque 2, Imagen2.Izquierda, y2 - y1 - y0
End Sub
Sub privado Form_Unload(Cancelar como entero)
Fin
End Sub
'zt=0,1,2,3, respectivamente, indicando que en el sentido de las agujas del reloj hacia la esquina superior derecha
(Abreviado como arriba-derecha) o abajo-izquierda, abajo-derecha o arriba-izquierda, abajo-izquierda o arriba-derecha, arriba-izquierda o abajo-derecha
Private Sub Timer1_Timer()
pie = 100
x = Imagen2.Izquierda: y = Imagen2.Top
Seleccione Caso Verdadero
Caso (bandera = Verdadero Y zt = 0) O (flag = False And zt = 2)
Coloque 2, x + pie, y - k * pie
'Línea (x, y)-(x + pie , y - k * pie)
Direct 360
Si Imagen2.Izquierda > x2 - x1 - x0 - pie Entonces zt = 1: flag = False 'Golpea el borde vertical y muévete hacia la parte superior izquierda
If Picture2.Top < foot Entonces zt = 1: flag = True 'Golpea el borde horizontal y muévelo hacia la parte inferior derecha
Case (flag = True Y zt = 1) O (flag = False And zt = 3)
Colocar 2, x + pie, y + pie / k
'Línea (x, y)-( x + pie, y + pie / k) p>
Directo 270
Si Imagen2.Izquierda > x2 - x1 - x0 - pie Entonces zt = 2: flag = True 'Golpea la vertical borde y muévalo hacia la parte inferior izquierda
If Picture2.Top > y2 - y1 - y0 - foot Entonces zt = 2: flag = False 'Golpea el borde horizontal y se invertirá hacia la parte superior derecha p>
Caso (flag = True Y zt = 2) O (flag = False Y zt = 0)
Coloque 2, x - pie, y + k * pie
'Línea (x, y)-(x - pie, y + k * pie )
Directo 180
Si Imagen2.Izquierda < pie Entonces zt = 3: bandera = Falso 'Presiona el borde vertical y se invertirá hacia la parte inferior derecha
Si Imagen2 .Top > y2 - y1 - y0 - foot Entonces zt = 3: flag = True 'Presiona el borde horizontal y muévelo hacia la arriba a la izquierda
Caso (flag = True Y zt = 3) O (flag = False Y zt = 1)
Coloque 2, x - pie, y - pie/k p>
'Línea (x, y)-(x - pie, y - pie / k)
Directo 90
Si Imagen2.Izquierda < pie Entonces zt = 0 : flag = True 'Presiona el borde vertical y muévelo hacia la parte superior derecha
If Picture2.Top < foot Then zt = 0: flag = False 'Presiona el borde horizontal y muévelo hacia la parte inferior izquierda
Finalizar selección
Imagen2.Visible = Verdadero
Fin Sub
p>