Commodore sayı 14, sayfa 24

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 24

Peki bu kadar bilgiyi nasıl kullanacağız? Sprite tanımlamamızı yaptık, kullanacağımız blokları saptadık, gerekli hazırlıkları yaptık ve 63 byte'lık bilgimizi saptadığımız bloklara yerleştirdik. Şimdi ne olacak? 11. sayımızda, sprite göstergeçlerinden bahsetmiştik. Bunlar 2040-2047 arası adreslerde bulunmaktaydı. Örneğin, 15 numaralı bloka (960-1022) bir tanımlama yerleştirdiniz. Ve diyelim ki, 2 ve 6 numaralı sprite'ların bu tanımlama ile belirttiğiniz görüntüye sahip olmasını istediniz. Yapacağınız işlem şu olacaktır:

POKE 20404-2,15 POKE

Kolay, değil mi? Bu yöntemin çok güzel bir özelliği var. Diyelim ki, 14 numaralı blokta da bir tanımlama var. Siz, POKE 2040,14 dediğiniz anda sprite'ınızın görüntüsü değişecektir. Böylece değişik dizaynlar arasında gidip bir tür çizgi film efekti yaratabilirsiniz. SPRITE DEMO 1 programımızda bu özelliği kullandık. Şimdi sıra geldi sprite'ı ekrana çıkartmaya. Bununla ilgili yazmaçın 21 numaralı yazmaç olduğunu 10. sayımızdan biliyoruz. Bu yazmaçın her bir bit'i, bir sprite'a karşılık gelir ve eğer bir bit'in değeri 1 ise, o sprite görünür durumda demektir. Örneğin 2 ve 5 numaralı sprite'lar açılacaksa, POKE 53269,36 komutu verilmelidir. Ancak bu komutu verir vermez sprite'ı ekranda göremeyebilirsiniz. Çünkü sprite'ınız ekranın görünür kısmının dışında olabilir. Demek ki, sıra geldi sprite'ın ekrandaki pozisyonunu değiştirmeye. Sprite'ımızı ekranda X ve Y yönünde belirleyeceğimiz koordinatlar ile yerleştirebiliriz. X-koordinatları için 0-511, Y-koordinatları içinse 0-255 parçası olan görünür ekranı birarada göstermekte ve görünür ekranın köşelerinin sprite koordinatı olarak hangi değerlere karşılık geldiğini belirtmektedir:

bir sprite'ın 9 numaralı X-koordinatı bit'ini temsil eder. Bir örnek verelim: Diyelim ki, sprite'ımızın X-koordinatı 345. 255'ten büyük olduğu için, 16. yazmaçın gerekli bit'i 9. sayımız-

1 ! GÖRÜNÜR EKRAN ! 1 1 arası değerler alabilir. Ekranın görünen kısmının 320*200 nokta olduğunu düşünürsek, sprite hareket alanının görünen ekrandan daha büyük olduğunu kolayca anlarız. Aşağıdaki çizim, sprite hareket alanı ve onun bir

Gene 10. sayımızdaki listemizde göreceğiniz gibi, her sprite'a ait X ve Y koordinatlarını belirleyen yazmaçlar vardır. Y-koordinatları 0-255 arasında olduğuna göre sorun yok. Ancak 0-511 arası X-koordinatlarını göstermek için 1 byte — 8 bit yeterli olmamaktadır. İhtiyaç duyulan 8. bit ise, VIC'in 16 numaralı yazmaçında yeralmaktadır. Bu yazmaçın her bir bit'i, da gördüğümüz yakılacak ve o sprite'a ait X-koordinatı yazmaçına 345-256 = 89 değeri konacaktır. Bir ufak noktayı daha belirtelim. Bir sprite'ı ekranda pozisyonlarken verdiğiniz koordinatlar, o sprite'ın sol üst köşesinin ekranda geleceği koordinattır. Dolayısıyla, sağ alt köşesinin koordinatları, X yönünde 24 nokta, Y yönünde de 21 nokta eklenerek bulunabilecektir. Ancak bu son hesap, normal boyutta gösterilen sprite'lar için geçerli. Normal olmayan boyutlar da ne demek?!

Şimdi sıra geldi bu özelliğe: Sprite'ımızı genişletip daraltmaya. VIC'in 23 ve 29 numaralı yazmaçlarını kullanarak, X ve Y yönlerinde sprite'ın genişliğini normal ile iki katı arasında değiştirebiliyoruz. Daha önce gördüğümüz çokrenklilik, X-yönü 9. bit'i gibi özellikleri kontrol eden yazmaçlar gibi 23 ve 29 numaralı yazmaçların da yapısı, her bir bit bir sprite'ı temsil edecek şekildedir. Örneğin 23. yazmaçın 5. bit'i 1 ise, 5 numaralı sprite Y yönünde iki kat daha büyük görünecektir. Tıpkı ince uzun bir cisim gibi. Eğer aynı zamanda 29. yazmaçın da 5. bit'i 1 ise, sonuç 5 numaralı sprite'ın iki kat büyük görünmesi olacaktır. 23. yazmaçın 5. bit'ini tekrar 0 yaparsak, bu sefer sprite'ımız sadece yatay yönde uzamış görünecektir. Artık sıra son iki özelliğe geldi: Sprite-sprite ve ekran-sprite önceliği, sprite-sprite ve ekran-sprite çarpışmaları. Diyelim ki ekranda birden fazla sprite'ınız var ve ekranda da birtakım yazılar yazıyor. Bunlar üstüste gelindiğinde ne olur? Hangi sprite hangi sprite'ın önüne geçer? Yazılar mı sprite'ların arkasında kalır, sprite'lar mı yazıların arkasından geçer? Önce sprite'lar arasındaki öncelik ilişkisine bir bakalım. Aslında çok kolay. Bildiğiniz gibi sprite'ları 0-7 arası numaralarla çağırıyorduk. Buna göre, daha küçük numaraya sahip sprite'ın diğerlerine göre üstünlüğü vardır. Örneğin 3 ve 6 numara üstüste gelirse, 3 numara 6 numarayı örtecektir. Ancak üstlerine bir de 0 numara gelirse, o hepsinin üstünü kapatacaktır. Ekran karakterleriyle olan öncelik durumuna gelince... Bunun için de bir yazmaç ayrılmış durumda. Sprite-sprite ilişkisinde olduğu gibi önceden saptanmış bir durum yok. 27 numaralı VIC yazmaçının her bir bit'i bir sprite'ı temsil eder. Eğer bir bit 0 ise (ki bilgisayar açıldığındaki durum budur), o bit'in temsil ettiği sprite ekrandaki her karakterin üzerinde bulunacaktır. Eğer bit'in değeri 1 olursa, bu sefer sprite ekrandaki yazı, grafik ve her türlü şeklin arkasına saklanacaktır. İşte bu özelliği kullanarak üç boyutlu izlenimini veren programlar hazırlayabilirsiniz. Piyasadaki birçok oyun programı bu özelliği sonuna kadar kullanır. Örneğin bir sprite, ekranın bir kısmındayken karakterlerin üstünde görünür, bir başka kısmında da ona ait bit program tarafından 1 yapılınca, grafiklerin altından geçer. Hayal gücünün sonu yok... Hazır söz oyunlardan açılmışken, son sprite özelliğine geçelim. Sprite'lar ve ekran arasında ortaya çıkacak temasların veya çarpışmaların algılanamaması, C64'ün sonu olurdu herhalde. Ancak durum bunun tam tersi. VIC'in 30 ve 31 numaralı iki yazmaçı bu işlemi gerçekleştiriyor. 30 numaralı yazmaç, sprite-sprite çarpışmasından sorumlu. Gene her bir bit'in bir sprite'ı temsil ettiğini söylemeye gerek yok sanırız... Neyse, bir örnek verelim. Diyelim ki, ekranda 3 ve 5 numaralı sprite'lar birbirine değdi. Bu durumda 30. yazmaçın 3 ve 5 numaralı bit'leri 1 halini alacaktır (0000101000) ve bu değerini silininceye kadar koruyacaktır. DİKKAT! Eğer ekranda sprite'lar çarpıştıktan sonra birbirlerinden ayrılırlarsa, 30. yazmaçın değeri kendiliğinden sıfırlanmayacaktır. Programın önceden varolmuş bir çarpışmayı, çarpışma bittikten sonra da algılayabilmesi için değerini koruyacaktır. Ancak POKE 53278,0 ile silinebilecektir. 31 numaralı yazmaç da buna benzer bir işlem görür. Eğer sprite, ekrandaki yazı veya grafiklerden birine değerse, ona ait bit 1 değerini alır ve program onu sıfırlayıncaya kadar 1 değerini korur. Artık sıra geldi bunca bilgiyi pratikte kullanmaya. Daha önce de belirttiğimiz gibi, dizayn işlemlerini evvelki sayılarımızda verdiğimiz sprite editörlerinden biriyle yapabilirsiniz. Diğer programlama işlemlerini de, mümkün olduğunca iki örnek programda toparlamaya çalıştık. Grafik olarak hiçbir iddiamız olmadığını ve göreceğiniz sprite'ların daha kabiliyetli arkadaşlar tarafından çok daha güzel çizilebileceğini itiraf ediyoruz. Biz daha çok hangi komutların nasıl kullanılacağını esprili bir hava içinde sunmaya çalıştık. Birinci programımız animasyona (çizgi film efekti), ikinci programımız da çokrenkli durumda sprite-sprite çarpışmasına küçük birer örnek teşkil ediyor. Şimdi satır satır açıklamalarına geçelim.

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