• Sonuç bulunamadı

Shape Kontrolü ile Canlandırma

Belgede Bilgisayarla Otomasyon Kontrolü 2 (sayfa 126-132)

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ı

Belgede Bilgisayarla Otomasyon Kontrolü 2 (sayfa 126-132)

Benzer Belgeler