Red de conocimiento informático - Problemas con los teléfonos móviles - Programación VB como hacer volar mariposas

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)

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

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

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>

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)

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

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

'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>