3. CANLANDIRMA(ANİMASYON)
3.5. Shape Kontrolü ile Canlandırma
Bazen form üzerine kontroller çalışma anında konulur. Kontrollerin hepsi programı derleme anında hafızaya yüklenmez, ihtiyaç duyuldukça sahneye davet edilir. Bu örnekte bununla ilgili olarak timer ve shape kontrolleri çalışma anında dinamik olarak programa dahil edilecektir.Kendine ait olayları olan bir kontrol, WithEvents deyimi ile tanıtılır. Sadece özellikleri ve metotları olan kontroller ise değişkenmiş gibi tanıtılır.
Programda bir timer ve shape bileşeni olduğundan;
Dim WithEvents timer1 As Timer Dim shape1 As Shape
Burada timer1 ve shape1 adında bileşenler tanıtıldı. Kodu yazar yazmaz ismi, nesneleri gösteren kutuda görüldü.
Şekil 3.25: Bileşen kutusu
Dinamik kontroller ya Form_Activate olayında ya da daha sonra herhangi bir olaya bağlı olarak oluşturulurlar. Bunun için ilgili olduğu yerde
Set timer1 = Controls.Add("VB.Timer", "timer1")
satırını yazmak gerekir. Form_Activate olayı Form_Load olayından önce geldiğinden önce kontrol oluşturulur arkasından buna ait özellikler belirlenir. Fakat Form_Load olayı altında da kullanılmadan önce oluşturulursa bir sakınca olmaz. Ama ilki, daha iyi bir yoldur.
Burada ikincisi tercih edilecektir. Form_Load kod listesi:
Private Sub Form_Load() Randomize
Form1.ScaleMode = 3 Form1.AutoRedraw = False Form1.Caption = "Shapes"
Form1.Show DoEvents
'Timer kontrolu oluştur
Set timer1 = Controls.Add("VB.Timer", "timer1") timer1.Interval = 1
timer1.Enabled = True 'Shape kontrolu oluştur
Set shape1 = Controls.Add("VB.Shape", "shape1") ShapeDegistir
shape1.Visible = True End Sub
Form_Load olayında ShapeDegistir adında bir yordam vardır. Bu yordamda shape nesnesine ait özellikler rastgele değerlere göre ayarlanacaktır. Form_Load() kodunun başındaki Randomize, her program başlangıcında elde edilen rasgele sayının değişik olmasını sağlar.
Private Sub ShapeDegistir() shape1.BackStyle = Rastgele(1) shape1.BorderStyle = Rastgele(6)
shape1.BorderColor = RGB(Rastgele(256), Rastgele(256), Rastgele(256)) shape1.BorderWidth = 2
shape1.DrawMode = Rastgele(15) shape1.FillColor = shape1.BorderColor shape1.FillStyle = Rastgele(7)
shape1.Shape = Rastgele(5) End Sub
Burada Rastgele rumuzlu fonksiyon rastgele sayı üretimi için kullanılmıştır.
Private Function Rastgele(ByVal AzamiDeger As Long) As Long Rasgele = CLng(Rnd * AzamiDeger)
End Function
Harekete renk katacak işler ShapeDegistir yordamında yapılmasına rağmen onu sahneye çağıracak olan, daha önce oluşturulan timer1 bileşenidir.
Private Sub timer1_Timer() Static XHareket As Long Static YHareket As Long 'Başlangıç hareket değerleri
If XHareket = 0 Then XHareket = 5 If YHareket = 0 Then YHareket = 5 'Shape yatay olarak hareket etsin shape1.Left = shape1.Left + XHareket If shape1.Left < 1 Then
shape1.Left = 1
XHareket = Rasgele(5) + 1 ShapeDegistir
ElseIf shape1.Left + shape1.Width > Form1.ScaleWidth Then shape1.Left = Form1.ScaleWidth - shape1.Width - 1
XHareket = Rasgele(5) - 5 ShapeDegistir
End If
'Shape dikey olarak hareket etsin shape1.Top = shape1.Top + YHareket If shape1.Top < 1 Then
shape1.Top = 1
YHareket = Rasgele(5) + 1 ShapeDegistir
ElseIf shape1.Top + shape1.Height > Form1.ScaleHeight Then shape1.Top = Form1.ScaleHeight - shape1.Height - 1
YHareket = Rasgele(5) - 5 ShapeDegistir
End If End Sub
Program kodunun sonuna geldik. Farenin bir tuşuna basıldığı zaman çıkalım.
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single)
End End Sub
Artık program çalıştırabilir. Gezindikçe şekil değiştiren, şekil değiştirdikçe renk değiştiren bir animasyon ortaya çıktı.
Şekil 3.26: Programın çalışması ÖRNEK 3.10: Sprite resminin gezinmesi.
Şeffaf resimlerin nasıl çizileceği daha önce BitBlt fonksiyonunu kullanarak görülmüştü. Hatta onlara hareket verildi. Bu sefer de alışılan yolun tersine giderek bunu PaintPicture metodu ile yaparak arkasına bir manzara resmi eklenmesi istenirse yapılacaklar aşağıda anlatılmıştır. Bilindiği gibi, önce eskisi anlatılıp yenisi ve iyisi daha sonra anlatılıyordu.
Bir kere daha hatırlatmak gerekirse şeffaf resimler çizmek için öncelikle kaynak resimdeki göz alıcı renklerin negatifini alan maske resimlerinin çizilmesi gerekir.
Şekil 3.27: Kaynak ve maske resmi
Şekilde sarı ve yeşil olan renklerin kalıcı olması ve aralarından arkadaki fon resminin görünmesi isteniyor. Nerede renkli kalacak bir bölge varsa onun karşılığı maske resimlerinde orası siyaha boyanır. Şeffaflaşması yani kaybolması istenilen alan ise beyaz yapılır. Önce maske resmi vbSrcAnd işlemi ile arka plan üzerine kopyalanır. Arkasından kaynak resim vbSrcPaint ile aynı yere yapıştırılır.
Öncelikle aynı ölçüde olan maske ve kaynak isimli iki resim çizilerek çalışma klasörüne kaydedilir. Arka plan olarak Çanakkale Boğazı’nın fotoğrafı seçildi. Buna benzer bir resim de aynı klasöre kopyalanır
Kod listesi aşağıdadır.
Option Explicit
Dim WithEvents timer1 As Timer Dim ImageK As Image
Dim Maske As Image Private Sub Form_Load() Randomize
Form1.ScaleMode = 3 Form1.AutoRedraw = True
Form1.Caption = "Gezinen Şeffaf Resim"
Form1.Picture = LoadPicture(App.Path & "\arkaplan.bmp") Form1.Show
DoEvents
'Zamanlayıcıyı oluştur
Set timer1 = Controls.Add("VB.Timer", "timer1") timer1.Interval = 10
timer1.Enabled = True 'Image Kontrolu oluştur
Set ImageK = Controls.Add("VB.Image", "ImageK") ImageK.Picture = LoadPicture(App.Path & "\kaynak.bmp") ImageK.Left = Rasgele(Form1.ScaleWidth - ImageK.Width - 1) ImageK.Top = Rasgele(Form1.ScaleHeight - ImageK.Height - 1) ImageK.Visible = False
'Maske için image kontrolü oluştur.
Set Maske = Controls.Add("VB.Image", "Maske") Maske.Picture = LoadPicture(App.Path & "\maske.bmp") Maske.Visible = False
End Sub
Private Sub timer1_Timer() Static XHareketi As Long Static YHareketi As Long 'Hareket başlangıç değerleri
If XHareketi = 0 Then XHareketi = 5 If YHareketi = 0 Then YHareketi = 5
'Yatay hareket
ImageK.Left = ImageK.Left + XHareketi If ImageK.Left < 1 Then
ImageK.Left = 1
XHareketi = Rasgele(5) + 1
ElseIf ImageK.Left + ImageK.Width > Form1.ScaleWidth Then ImageK.Left = Form1.ScaleWidth - ImageK.Width - 1
XHareketi = Rasgele(5) - 5 End If
'Dikey olarak gezinsin
ImageK.Top = ImageK.Top + YHareketi If ImageK.Top < 1 Then
ImageK.Top = 1
YHareketi = Rasgele(5) + 1
ElseIf ImageK.Top + ImageK.Height > Form1.ScaleHeight Then ImageK.Top = Form1.ScaleHeight - ImageK.Height - 1
YHareketi = Rasgele(5) - 5 End If
'Arkaplanı bir daha çiz
Form1.Picture = LoadPicture(App.Path & "\arkaplan.bmp") 'Maskeleme resmini çiz
Form1.PaintPicture Maske.Picture, ImageK.Left, ImageK.Top, _ ImageK.Width, ImageK.Height, 0, 0, _
ImageK.Width, ImageK.Height, vbSrcAnd 'Kaynak resmini çiz
Form1.PaintPicture ImageK.Picture, ImageK.Left, ImageK.Top, _ ImageK.Width, ImageK.Height, 0, 0, _
ImageK.Width, ImageK.Height, vbSrcPaint End Sub
Private Function Rasgele(ByVal AzamiDeger As Long) As Long Rasgele = CLng(Rnd * AzamiDeger)
End Function
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) End
End Sub
Program çalıştırılır.
Şekil 3.28: Programın çalışması