ışık hızıyla resim çizdirme

punk3r

Yeni üye
23 Haz 2006
10
0
VB6'nın yavaşlığından gına geldiyse BLt API'leri emrinize amade. Hem işi hızlı ve temiz yapıyorlar hem de bir kaç önemli özellikleri var* istediğiniz yerleri çizdirmemeleri gibi...Işık hızıyla resim çizdirme

Tek başına visual basic’i oyun yapımı konusunda kullanışsız kılan şey şaşırtıcı yavaşlığı ve kendi nesne ve fonksiyonlarının yetersizliğinden başka bir şey değildir. Ama çok sevindirici bir biçimde API’lere neredeyse diğer programlama dilleriyle aynı hızda ulaşıp işlem yaptırabilmektedir. O yüzden onları bu kadar seviyoruz zaten* değil mi?
Eğer bir resmi API ile(belli bölümleri şeffaf olacak şekilde) ekranda göstermek istiyorsanız bunun için kullanabileceğiniz EN KISA iki yöntem StretchBlt ve TransparentBlt fonksiyonlarıdır. Burada ikisini de inceleyeceğiz.

1.TransparentBlt

Aşağıdaki şekilde declare edilir:

Private Declare Function TransparentBlt Lib "msimg32" (ByVal hdcDest As Long* ByVal nXOriginDest As Long* ByVal nYOriginDest As Long* ByVal nWidthDest As Long* ByVal nHeightDest As Long* ByVal hdcSrc As Long* ByVal nXOriginSrc As Long* ByVal nYOriginSrc As Long* ByVal nWidthSrc As Long* ByVal nHeightSrc As Long* ByVal crTransparent As Long) As Long

Biraz karışık gibi.

Burada hdcDest “hdcDestination” yani resmin çizdirileceği hedef olan form veya picturebox’dur. hdcSrc ise “hdcSource” yani resmin alınacağı kaynaktır. Bunların değeri long’dur ve bu değerleri sadece bir hDC’ye sahip olabilen kontrollerden(Picturebox*Form*Usercontrol…) alabilirsiniz. Image nesnesinin bir hDC’si yoktur. Aynı bunlar gibi sonunda src olanlar kaynaktan resmin nasıl alınacağını* dest olanlar ise resmin nasıl basılacağını belirtir. crTransparent ise şeffaf kabul edilecek ve yok sayılacak olan renktir.
Tüm Blt fonksiyonları pixel uzunluk birimi üzerinden işlem yaptığından kullanacağınız kaynak ve hedef nesnelerin hepsinin scalemode özelliğini pixel*Auto Redraw özelliğini true yapmayı unutmayın* yoksa “hata nerde* nerede hıııagh” şeklinde kafayı yiyip en yakın ahşap materyale girişebilirsiniz(ya da burası çok sıcak* ondan tahammül edemedim ben).
Şimdi ilk TransparentBlt kodumuzu yazalım:

Private Sub Command1_Click()
TransparentBlt Me.hDC* 0* 0* 100* 100* Picture1.hDC* 0* 0* Picture1.ScaleWidth* Picture1.ScaleHeight* RGB(0* 255* 0)
End Sub

Gördüğünüz gibi kimsenin oyun grafiği hazırlarken kullanmayacağını düşündüğüm “cortlak yeşil” rengini transparent yaparak resmimizi çizdirdik. Burada kaynağın en*boy ve pozisyon değerleri ile çok kullanışlı fonksiyonlar yazabilirsiniz(örneğin 10 karelik bir animasyonu tek bir resim olarak hazırlarsınız o istediğiniz kareyi bulup çizdirir)
(gördüğünüz gibi width ve height yerine scalewidth ve scaleheight kullanıyoruz* unutmayın)

2.StretchBlt

Bu fonksiyonumuz ise şu şekilde:

Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long* ByVal X As Long* ByVal Y As Long* ByVal nWidth As Long* ByVal nHeight As Long* ByVal hSrcDC As Long* ByVal xSrc As Long* ByVal ySrc As Long* ByVal nSrcWidth As Long* ByVal nSrcHeight As Long* ByVal dwRop As Long) As Long

Stretchblt* biraz önce kullandığımız TransparentBlt fonksiyonuyla önemli bir farklılık gösteriyor. Diğer her şey aynı olmasına rağmen* bu fonksiyonda şeffaf göstermek için herhangi bir renk değişkeni yok. Peki bunu nasıl yapacağız? Flash ile uğraştıysanız aşinalığınız vardır* mask yöntemiyle. Yani eğer “Kardeşim benim elimde bir resim var ama ben bunun istediğim bir parçasını göstereceğim* ama mesela bu parça yıldız şeklinde olacak” vs vs diyorsanız* doğru yerdesiniz. Fakat bunu istiyorsanız transparentblt gibi de kullanabilirsiniz* aynı işi görür.
Yeni değişkenimiz olan dwRop* “vbSrcCopy” “vbSrcAnd” “vbSrcPaint” değerlerini alabiliyor. Eğer vbSrcCopy değerini verirseniz resmin bir kopyası aynen çizilecektir. Bizim mask yaparken kullanacağımız And ve Paint değerleri ise resmin renk değerleriyle arka plan değerlerinin üzerinde bazı özel işlemler yapmaktadır* fakat bunları hangi mantıkla yaptıklarını çözmeye çalışmak beynimi acıtmaya başladı* birisi bulursa bana söylesin!
Şimdi ilk stretchblt kodumuzu yazalım. Biraz Paint kullanmamız gerekecek :) ilkönce resime siyah bir top çizin ve çevresini beyaz yapın. İşte bu bizim mask’ımız. Beyaz kısımların görünmemesini sağlayacak. Bunu picture1’e koyun. İkinci resmimiz siyah arkaplan ve istedğiniz renkte bir top yapın(bu bizim görüntülenecek olan resmimiz* o yüzden topu biraz süsleyin ki tam deneme olsun :) ) Bunu da picture2’ye koyun ve aşağıdaki kodu bir deneyin:

Private Sub Command1_Click()
StretchBlt Me.hdc* 0* 0* 100* 100* Picture1.hdc* 0* 0* Picture1.ScaleWidth* Picture1.ScaleHeight* vbSrcAnd
StretchBlt Me.hdc* 0* 0* 100* 100* Picture2.hdc* 0* 0* Picture1.ScaleWidth* Picture1.ScaleHeight* vbSrcPaint
End Sub

Kafa karıştırıcı* değil mi? Şimdi bunu geliştirmek size kalıyor. Umarım istediğiniz bilgiyi elde etmişsinizdir. Eğer bir resmi şeffaf göstermek için daha farklı yollar istiyorsanız yayınlanacağını umduğum UserControl’larda mask yapımıyla ilgili makaleme de bakabilirsiniz
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.