Amiga Dünyası sayı 23, sayfa 36

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 36

Selam! İşte yine sizlerle beraberiz. Bu ay, sprite'ları biraz daha karıştıracağız. Geçen ay bir sprite'ı ekranda nasıl göstereceğimizi öğrenmiştik. Bu ay ise aynı şekilde 8 sprite'ı birden ekranda göstermek için yapılması gerekenleri inceleyeceğiz. Aynı zamanda da sprite'ları hareket ettirmeyi de göreceğiz. Dilerseniz vermiş olduğum programı hemen yazıp kaydedin.

Programı incelemeye başlamadan önce, size yine biraz teorik bilgi vermemde fayda var. Aslında burada yeni bilgiler yerine, geçen ay kazandığınız bilgileri biraz tazeleyeceğim. Hatırlarsanız sprite koordinatları sprite datalarının ilk üç byte'ında bulunmaktaydı. Bunlar sırayla VSTART, HSTART ve VSTOP idi. İstediğimiz bir sprite'ı hareket ettirmek aslında gayet basit. Örneğin sprite'ı sağa doğru hareket ettirmek istediğimizi varsayalım. Bunun için her ekran taramada sprite datalarındaki ikinci byte'ı bir artırmamız yetmekte. Bu şekilde HSTART'ın aldığı değer her ekran taranmasında 1 artacak. Sprite'lar da her ekran taramasında tekrar çizildiğinden sprite'ımız ekran tarama ışınına senkron olarak sağa doğru hareket edecektir. Sprite hızını artırmak için her seferinde 1 değil de başka bir sayı eklememiz yeterli. Fakat yüksek bir sayı kullanırsanız bu sefer de sprite titremeye başlayacak. Yavaşlatmak için de her seferinde HSTART'a 1/2 ya da 1/4 değer eklemek gerekmekte. Fakat Assembler'da sadece tam sayıları hiçbir uğraş olmadan kullanabildiğimizden 1/2 ya da 1/4 değerlikli bir sayı elde etmek için değişik bir yöntem uyguluyoruz: HSTART değerini ekran tarama ışını 2 ya da 4 defa ekranı tam olarak taradığında 1 artırıyoruz. Nasıl, basit değil mi? Tarama ışınıyla senkronizasyonu karıştırmamak için sprite hız değerini 2'nin katları (2, 4, 8, 16, ...) ya da askatları (1/2, 1/4, 1/8, 1/16, ...) olarak seçmemizde fayda var.

Sprite'ı yukarıya ya da aşağı doğru hareket ettirmek için de aynı yöntemi uyguluyoruz. Fakat burada sadece VSTART değerini değiştirmiyoruz. Aynı zamanda VSTOP'u da VSTART'la aynı oranda artırmalı ya da azaltmalıyız. Aksi halde sprite'ımız bazen bozuk gözükebilir, bazen de ekranda sprite'ın altında bir sürü pislik oluşabilir. Bu pislikler aslında sprite datalarından hemen sonra gelen bilgilerdir. Sprite yüksekliği (VSTOP-VSTART) her seferinde değişik olacağından sprite'ın altındaki pisliklerin de yüksekliği otomatik olarak değişecektir. Bazen de negatif değere ulaşılacağından (VSTART, VSTOP'dan büyük olduğu durumlarda) ekranda sprite yerine sadece pislik gözükebilir.

Şimdi biraz da sprite'ların değişik bir özelliği hakkında bilgi vermek istiyorum: Extended (attached) sprite. Bunun hakkında detaylı bilgiyi aşağıda bulabilirsiniz.

Bildiğiniz gibi sprite'lar normalde 4 renk ve 16 piksel genişlikle sınırlıdırlar. Fakat bazı durumlarda 32 piksel genişliğinde ya da 16 renkli sprite'lar da olmasını isteriz. Programımızda sprite'ların hepsini kullanmadığımız durumlarda bu mümkün olmakta. 32 piksel genişlikli sprite'lar için iki sprite'ı yanyana kullanmamız yeterli olabilir. Sprite koordinatlarını da değiştirirken her iki sprite'ın koordinatlarını da aynı anda değiştirmemiz gerekmekte. Fakat hala 16 rengi nasıl oluşturabileceğimizi bilmiyoruz.

Copper çipi sprite'ları ikili gruplar halinde işlemekte. Bu yüzden de sprite renkleri 4 grup olarak sınırlıdır. Her bir renk grubu ardarda gelen iki sprite'ın rengini gösterir. Renk register'lerinin üst yarısı ($dff1a0-$dff1be) aynı zamanda sprite'ların da renklerini taşıdığını düşünürsek her sprite renginin aşağıdaki listede yer alan renk register'lerinde bulunması gerektiğini de kabul etmişiz demektir.

Grup 0 : Sprite 0, 1 - $dff1a0, $dff1a2, $dff1a4, $dff1a6 Grup 1 : Sprite 2, 3 - $dff1a8, $dff1aa, $dff1ac, $dff1ae Grup 2 : Sprite 4, 5 - $dff1b0, $dff1b2, $dff1b4, $dff1b6

Grup 3 : Sprite 6, 7 - $dff1b8, $dff1ba, $dff1bc, $dff1be

Extended sprite modunda renk register'lerinin üst yarısı komple bu genişletilmiş sprite için kullanılmakta. Ne de olsa genişletilmiş sprite 16 renkten oluşmakta. Dilerseniz tüm sprite'ları genişletilmiş sprite olarak gösterebilirsiniz. Fakat bu durumda sprite sayısı 4 ile sınırlı kalacaktır. Ya da sadece bir-iki genişletilmiş sprite kullanıp gerisini normal sprite olarak da kullanabilirsiniz. Fakat bu durumda tüm renk register'lerini birbirleriyle çakışmayacak şekilde ayarlamalısınız.

Peki extended sprite'ı nasıl mı kullanacağız? Gayet basit; extended sprite'ı oluşturan grubun sprite'larını her zaman üstüste gelecek şekilde koordinatlarını belirlememiz gerekmekte. Ayrıca extended sprite'ı oluşturan ikinci sprite'ın dördüncü byte'ındaki (SPRxCTL) ATTACH bitini (7. bit) de set etmemiz gerekmekte. Renkleri oluşturmak için de her iki sprite'ın bitplane'lerini üstüste getirmemiz gerekmekte. Renk kodunu aşağıdaki tablodan rahatlıkla bulabiliriz.

Renk no Spr0 Spr1 Renk register'i

0 00 00 $dff1a0 1 01 00 $dff1a2 2 10 00 $dff1a4 3 11 00 $dff1a6 4 00 01 $dff1a8 5 01 01 $dff1aa 6 10 01 $dff1ac 7 11 01 $dff1ae 8 00 10 $dff1b0 9 01 10 $dff1b2 10 10 10 $dff1b4 11 11 10 $dff1b6 12 00 11 $dff1b8 13 01 11 $dff1ba 14 10 11 $dff1bc 15 11 11 $dff1be

Ne yazık ki bu aylık yerim dolmaya başladığından ancak gelecek ay size extended sprite ile ilgili bir örnek verebileceğim. Şimdilik bu ay vermiş olduğum örneği incelemeye başlayalım. Programın genelini anlamanız o kadar zor değil. Hemen göze çarpan kısımlar arasında ekran tarama ışınını kontrol etmediğimdir. Sprite hareket ettirme rutinini işlemek biraz zaman aldığından bir de ekran tarama ışınını bekletseydim ekrandaki tüm sprite'lar titremeye başlıyordu. Fakat hiç bekleme olmadan da sprite'ları hareket ettirmeye kalkıştığımda sprite'lar epey yüksek bir hızla hareket ediyordu. Bu yüzden ben de ekran tarama ışınını bekleteceğim yerde boş bir döngü yaratarak 800'den -1'e kadar saydırma rutini ekledim. Bu şekilde sprite'lar tam istediğim bir hızla hareket etmekteler. Sprite'ları biraz daha hızlandırmak için bu değeri azaltmanız kafi olacaktır. Aynı şekilde yavaşlatmak için de bu değeri artırmanız gerekmekte. Fakat bu değeri fazla düşük ya da yüksek seçerseniz sprite'lar ya titrer, ya da çok hızlı hareket eder.

ASSEMBLER'da YENİ UFUKLAR

Klavyeyle gezinmek için ← ve → tuşları.