當前位置:編程學習大全網 - 源碼破解 - 用VB設計壹個蝴蝶飛動的程序

用VB設計壹個蝴蝶飛動的程序

因為這裏只能上傳壹張圖片,所以寫了壹個單張圖片的。裝載系列圖片的我也寫了,只是窗體初始化會很麻煩。以下代碼是實現單張圖片的隨意飛舞程序,能做到:

1、碰到窗體邊緣時,圖片會自動改變飛舞的方向(題意中要求的“返回”,只能是在壹條線上來回移動,本程序實現蝴蝶出發位置隨意,能在窗體內四處飛舞),而且頭部也會跟著改變方向

2、窗體改變大小時,蝴蝶不會消失不見,會立即在新的窗體內繼續飛舞

'建壹個Picture1控件,在它的屬性對話框內設置Appearance=0?AutoRedraw=True?AutoSize=True?BorderStyle=0,然後在它的Picture中加載蝴蝶圖片

'再建壹個Picture2控件,在它的屬性對話框內設置Appearance=0?AutoRedraw=False?AutoSize=False?BorderStyle=0,其他默認屬性都不得改變

'Form的BackColor設為與蝴蝶圖片的背景色壹致,本程序中,即&H80000009&

'再加壹個Timer1控件

Private?Const?Pi?=?3.1415926535

Private?Declare?Function?SetPixel?Lib?"gdi32"?(ByVal?hdc?As?Long,?ByVal?x?As?Long,?ByVal?y?As?Long,?ByVal?crColor?As?Long)?As?Long

Private?Declare?Function?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和y0是圖片框長高,(x1,y1)-(x2,y2)是窗體坐標系,foot是蝴蝶移動步長,zt是蝴蝶飛舞的線路標記

Dim?k!?'k或1/k是飛行軌跡的斜率

Dim?flag?As?Boolean?'flag判斷是順時針還是逆時針飛舞

Private?Sub?bmp_rotate(pic1?As?PictureBox,?pic2?As?PictureBox,?ByVal?theta?As?Single)?'自定義角度旋轉圖片

Dim?c1x?As?Integer,?c1y?As?Integer

Dim?c2x?As?Integer,?c2y?As?Integer

Dim?a?As?Single

Dim?p1x?As?Integer,?p1y?As?Integer

Dim?p2x?As?Integer,?p2y?As?Integer

Dim?n?As?Integer,?r?As?Integer

c1x?=?pic1.ScaleWidth?/?2

c1y?=?pic1.ScaleHeight?/?2

c2x?=?pic2.ScaleWidth?/?2

c2y?=?pic2.ScaleHeight?/?2

If?c2x?<?c2y?Then?n?=?c2y?Else?n?=?c2x

n?=?n?-?1

pic1hDC&?=?pic1.hdc

pic2hDC&?=?pic2.hdc

For?p2x?=?0?To?n

For?p2y?=?0?To?n

If?p2x?=?0?Then?a?=?Pi?/?2?Else?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)

If?c0&?<>?-1?Then?xret&?=?SetPixel(pic2hDC,?c2x?+?p2x,?c2y?+?p2y,?c0&)

If?c1&?<>?-1?Then?xret&?=?SetPixel(pic2hDC,?c2x?-?p2x,?c2y?-?p2y,?c1&)

If?c2&?<>?-1?Then?xret&?=?SetPixel(pic2hDC,?c2x?+?p2y,?c2y?-?p2x,?c2&)

If?c3&?<>?-1?Then?xret&?=?SetPixel(pic2hDC,?c2x?-?p2y,?c2y?+?p2x,?c3&)

Next

t%?=?DoEvents()

Next

End?Sub

Private?Sub?Place(ByVal?picnum?As?Integer,?ByVal?x?As?Single,?ByVal?y?As?Single)?'控制兩個圖片框的位置

If?picnum?=?1?Then

Picture1.Left?=?x

Picture1.Top?=?y

Else

Picture2.Left?=?x

Picture2.Top?=?y

End?If

End?Sub

Private?Sub?Direct(ByVal?angle?As?Integer)?'按指定角度旋轉圖片,angle是角度

angle?=?angle?Mod?360

hudu?=?(Pi?*?angle?*?1#)?/?(180?*?1#)?'弧度

bmp_rotate?Picture1,?Picture2,?hudu

End?Sub

Private?Sub?Form_Activate()

x1?=?0!

x2?=?10000!

y1?=?0!

y2?=?10000!

Me.Scale?(x1,?y1)-(x2,?y2)

Randomize

Picture1.ScaleMode?=?3

Picture2.ScaleMode?=?3

x0?=?Picture1.Width

Picture2.Width?=?x0

y0?=?Picture1.Height

Picture2.Height?=?y0

Picture1.Visible?=?True

Picture2.Visible?=?False

x?=?Int(1000?+?(x2?-?x1?-?x0?-?1000)?*?Rnd)?'蝴蝶出發處的橫坐標

y?=?Int(1000?+?(y2?-?y1?-?y0?-?1000)?*?Rnd)?'蝴蝶出發處的縱坐標

k?=?y?/?x?'k為撞向水平邊框或離開豎直邊框的斜率,1/k則為撞向豎直邊框或離開水平邊框的斜率

Place?1,?-x2,?y2?-?y0?'將圖片框的復制源移出窗體的可見範圍,但Visible屬性又必須是True,否則復制圖片會失敗

Place?2,?x,?y?'初始化蝴蝶的出發位置

Timer1.Enabled?=?True

Timer1.Interval?=?100?'定義移動周期

zt?=?0

End?Sub

Private?Sub?Form_Click()

Timer1.Enabled?=?Not?Timer1.Enabled

End?Sub

Private?Sub?Form_Resize()?'窗體改變大小時,坐標系需要重新定義

x1?=?0!

x2?=?10000!

y1?=?0!

y2?=?10000!

Me.Scale?(x1,?y1)-(x2,?y2)

Cls

x0?=?Picture1.Width

Picture2.Width?=?x0

y0?=?Picture1.Height

Picture2.Height?=?y0

'如果蝴蝶在窗體外,則立即召回

If?Picture2.Left?<?x1?Then?Place?2,?x1,?Picture2.Top

If?Picture2.Top?<?y1?Then?Place?2,?Picture2.Left,?y1

If?Picture2.Left?>?x2?-?x1?-?x0?Then?Place?2,?x2?-?x1?-?x0,?Picture2.Top

If?Picture2.Top?>?y2?-?y1?-?y0?Then?Place?2,?Picture2.Left,?y2?-?y1?-?y0

End?Sub

Private?Sub?Form_Unload(Cancel?As?Integer)

End

End?Sub

'zt=0,1,2,3時,分別表示順時針向右上(簡稱順右上)或逆左下,順右下或逆左上,順左下或逆右上,順左上或逆右下

Private?Sub?Timer1_Timer()

foot?=?100

x?=?Picture2.Left:?y?=?Picture2.Top

Select?Case?True

Case?(flag?=?True?And?zt?=?0)?Or?(flag?=?False?And?zt?=?2)

Place?2,?x?+?foot,?y?-?k?*?foot

'Line?(x,?y)-(x?+?foot,?y?-?k?*?foot)

Direct?360

If?Picture2.Left?>?x2?-?x1?-?x0?-?foot?Then?zt?=?1:?flag?=?False?'撞到垂直邊框,將逆左上

If?Picture2.Top?<?foot?Then?zt?=?1:?flag?=?True?'撞到水平邊框,將順右下

Case?(flag?=?True?And?zt?=?1)?Or?(flag?=?False?And?zt?=?3)

Place?2,?x?+?foot,?y?+?foot?/?k

'Line?(x,?y)-(x?+?foot,?y?+?foot?/?k)

Direct?270

If?Picture2.Left?>?x2?-?x1?-?x0?-?foot?Then?zt?=?2:?flag?=?True?'撞到垂直邊框,將順左下

If?Picture2.Top?>?y2?-?y1?-?y0?-?foot?Then?zt?=?2:?flag?=?False?'撞到水平邊框,將逆右上

Case?(flag?=?True?And?zt?=?2)?Or?(flag?=?False?And?zt?=?0)

Place?2,?x?-?foot,?y?+?k?*?foot

'Line?(x,?y)-(x?-?foot,?y?+?k?*?foot)

Direct?180

If?Picture2.Left?<?foot?Then?zt?=?3:?flag?=?False?'撞到垂直邊框,將逆右下

If?Picture2.Top?>?y2?-?y1?-?y0?-?foot?Then?zt?=?3:?flag?=?True?'撞到水平邊框,將順左上

Case?(flag?=?True?And?zt?=?3)?Or?(flag?=?False?And?zt?=?1)

Place?2,?x?-?foot,?y?-?foot?/?k

'Line?(x,?y)-(x?-?foot,?y?-?foot?/?k)

Direct?90

If?Picture2.Left?<?foot?Then?zt?=?0:?flag?=?True?'撞到垂直邊框,將順右上

If?Picture2.Top?<?foot?Then?zt?=?0:?flag?=?False?'撞到水平邊框,將逆左下

End?Select

Picture2.Visible?=?True

End?Sub

  • 上一篇:有關遊戲的群名字
  • 下一篇:皮膚出現了暗沈的情況,會顯得面部肌膚看起來粗糙,皮膚應該如何去除角質?
  • copyright 2024編程學習大全網