Amiga Dünyası sayı 22, sayfa 32

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 32

Selam! İşte yine beraberiz. Eh, artık bu yılın sonuna kadar vereceğim bilgiler, sizi bir hayli ileriye götürecektir. Geçen aya kadar copper renk çubuklarını nasıl yaratabileceğimizi görmüştük. Bu ay ise bir adım daha ileri giderek sprite konusuna gireceğiz.

Herkesin bildiği gibi sprite'lar, bir oyunda bob'lardan sonra gelen en önemli grafik parçalarıdır. Bob kullanmadan sadece sprite'lar ile de oyun yapmak mümkün. Sprite'ların bob'lara karşı büyük bir avantajları vardır. Hardware kontrol elektroniğinde sprite'lar için ayrı bir kanal açılmıştır. Biz bu kanallara DMA (Direct Memory Access-hafızaya direkt erişim) adını veriyoruz. Bu, sprite'ların kullanımında hız farkının pek olmayacağı anlamına gelir. İster 1, isterseniz de tüm 8 sprite'ı da kullanın; hiçbiri yavaşlamaz. Bunun kazandırdığı dezavantajlardan biri (ve en önemlisi), sprite'ların adetlerinin 8 ile sınırlı olması.

Avantajlardan bir diğeri de, sprite'ların çarpışma dedektörünün bulunması. Bunun yardımıyla hangi sprite'ın bir diğer sprite ya da grafik ile çarpıştığını algılayabilir ve buna göre işlemlerde bulunabiliriz. Bob'larda bu işlemi yapmak için değişik teknikler kullanmamız gerekecek. Fakat bunu daha ilerde göreceğiz.

Diğer bir dezavantaj ise sprite genişliğinin ve renginin sınırlı olması. Sprite'lar, biri zemin rengi olmak üzere 4 renge sahip olabilirler. Genişlikleri de 16 pikselle sınırlıdır. Fakat buna karşı yükseklikleri ekran yüksekliği kadar olabilmekte. Değişik bir kullanım şekliyle sprite renklerini 16 renge kadar çıkarmak mümkün. Bu şekilde sprite genişliğimiz de 32 piksele yükselecektir. Bunun getirdiği dezavantaj ise sprite sayısının 4'e inmesi. Nedeni de, bu geliştirilmiş sprite'ların iki normal sprite'ın birleştirilmesiyle oluşturulduğundan olsa gerek.

Sprite'ların piksel boyutları ekran modunu değiştirdiğimizde değişmez. Interlace ya da Hi-res ekranda normal grafik pikselinin boyutu yarılanırken, sprite'ı oluşturan piksel boyutu aynı kalır.

Sprite'lar hafızada aynı ekranlarda olduğu gibi bitplane datası olarak saklıdır. Zaten sprite piksellerinin rengini de bu bitplane'lerdeki bitlerin durumları belirler. Bunun için Şekil 1'e bakınız. Burada bir uzay gemisinin renkler olarak görüntüsü yer almakta. Burada 0, 1, 2 ve 3 sayılarıyla renk pikselleri tanımlanmıştır. Bunu bitplane'lere çevirmemiz gerekmekte. Bildiğiniz gibi, her bir bitplane'deki tek bir pikselin değeri 0 ya da 1 olabilmekte. Eğer iki bitplane kullanırsak, 2^n formülüne göre 4 renk elde edebiliriz. Bu da bizim için yeterli olur. Şekil 2'de uzay gemimizin bitplane'lerini bulabiliriz. Bu bitplane'lerde bir pikselin renk değerini öğrenmek için her iki bitplane'deki pikselimize denk gelen biti yanyana getirmemiz yeterli olur. Bu şekilde elde edeceğimiz sayı, rengin binary olarak kodlanmış halidir. Bu binary sayıda soldaki hane ilk bitplane'deki bit, sağdaki hane de ikinci bitplane'de pikselimize denk gelen bitdir.

Sprite dizayn ederken zahmete katlanmak istemeyenler için ufak bir tiyo: Dilerseniz sprite'ınızı Deluxe Paint ile de hazırla-

6880888886888888 8888881111688888 6861111111111688 8822211111122286 8833333333333388 8822211111122288 8881111111111888 0000001111000000 0000000000000000

yabilirsiniz. Bunun için sprite'ı Deluxe Paint ile çizip resim olarak diskete kaydedin. Unutmayın; 2 bitplane kullanabilirsiniz. Şimdi Deluxe IFF Converter'in Save Sprite altmenüsünü kullanarak çizdiğiniz sprite görüntüsünü data tablosu şeklinde kaydedebilirsiniz. Bu altmenüde iki seçenek vardır: 4 ve 16. 4 ile normal sprite, 16 ile de genişletilmiş sprite olarak kayıt yapabilirsiniz. Artık yarattığınız sprite tablosunu text olarak Seka'dan okuyabilir ve programınızda kolaylıkla kullanabilirsiniz. Bu converter satırları da uygun olarak dizip az aşağıda göreceğimiz sprite koordinat bilgilerini de ekleyeceğinden kullanmanızı özellikle tavsiye ederim. Size kalan artık sadece koordinat bilgilerini uygun şekilde değiştirmek olacaktır.

Şimdiye kadar gayet iyi gittik; fakat hala sprite renklerini nasıl belirleyeceğimizi bilmiyoruz. Sprite'ın piksellerinin rengi copper'da renk register'lerinin üst 16'sı ile belirlenir. Bunun en büyük dezavantajı bazı renkleri sabitlememiz gerektiğidir. Bu yüzden yazdığınız programlarda sprite kullanıyorsanız, grafiğin paletini uygun olarak dizayn etmeniz gerekmekte. Ya grafiğinizi 16 renkle sınırlandıracaksınız, ya da grafikteki üst 16 rengin sprite renkleri olmalarına dikkat edeceksiniz. İkinci yöntemi kullandığınızda da çıkan tek sorun, sprite rengini program içinde değiştirmeye kalktığınızda (mesela cycle yapmak için) grafikte aynı renkte bir piksel varsa, bunun da renginin değişeceğidir. Şimdi dilerseniz Tablo I'e bir göz atalım. Burada, copper renk register'lerinin hangilerinin hangi sprite renkleri olarak kullanıldığını görebilirsiniz.

Sprite hazırlarken data olarak demin hazırladığımız bitplane'lerdeki bitleri kullanacağız. Her bir sprite satırı 16 bitten oluştuğundan, bunu word olarak yazabilmemiz mümkün. Burada dikkat edilecek tek konu satırların düzeni olacak. Data tablomuzda ilk satırda yer alan word sprite'ın ilk bitplane'inin ilk satırıdır. Ardından ikinci bitplane'deki ilk satırın karşılığı olan word gelmekte. Diğer sprite satırları da aynı şekilde sıralanarak data tablomuzu oluşturabiliriz. Data tablosunun sonuna word olarak iki adet 0 değeri eklemeyi unutmayın. Bu iki 0 sayesinde copper cipi sprite datalarının bittiğini anlar.

Fakat hala eksik olan bir şey var: Sprite'ın ekran koordinatlarını gösteren değerler. Bu değerleri nasıl kullanacağımızı görelim.

Sprite koordinatlarını oluşturmak için, sistem bize sadece iki byte ayırmış durumda. Fakat ekran boyutları birer byte'dan fazla yer kaplamakta. Bize, her iki koordinat için de fazladan birer bit daha gereklidir. Jay Miner, cipleri yaratırken bu iki bit yüzünden iki byte'ı fazladan harcamak istememiştir. Bu yüzden bu iki bit sprite koordinat taşma bitleri olarak başka bir byte içinde yer alırlar. Sprite koordinatı 256'yı geçmiyorsa, bu bitlerden uygun olanı 0 değerini alır. Fakat iki koordinattan biri 256 sınırını aşı-

8888888888888888 8000080808888888 8888888888800000 6000001111000000 8011188888611100 0806611111188868 0011111111111188 0011111111111100 0011100000011108 0000011111100000 0000000000000000 0000001111000000 0000000000000000 0000000000000000

Şekil 1 - Renk kodları olarak bir uzay gemisi Şekil 2 - Uzay gemisinin bitplane

olarak görüntüsü.

ASSEMBLER'da YENİ UFUKLAR

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