Bakkada private bir mesajda benden sprite ve bob konusunu anlatmamı istemiş. Ben de cevap yazdım. Ancak başkaları da yararlanabilir diye buraya da copy&paste ediyorum.
Bakkada'ya attığım mesaj:
Sprite ve bobları tek bir mesajda anlatmak oldukça güç. Onun için bir overview yapıcam sadece.
Spritelar commodore'un VIC chipinin desteklediği özel grafik layerlarıdır (tabakalarıdır). Yani sprite ekranda görünen grafiklerin, yazıların üzerine gelebilir ya da arkasına geçebilir ancak asla onları silmez, değiştirmez. Photoshopta yeni bir layer açmak gibi birşey anlayacağın.
Commodore'da normalde 8 sprite vardır. Çeşitli yöntemlerle (multiplexer) çok daha fazla sprite basılabilir ancak yan yana maksimum 8 sprite basılabilir. Spritelar hafızada $d000 adresinden itibaren bulunan adresler ile ekran belleğinin sonunda kalan bytelar yardımıyla ekranda gösterilirler. Spritelar 0'dan 7'ye kadar numaralandırılırlar. 0.sprite, 1.sprite, 2.sprite, ... , 7.sprite gibi.
$d000 : 0. sprite X pozisyonu.
$d001 : 0. sprite Y pozisyonu.
$d002 : 1. sprite X pozisyonu.
$d003 : 1. sprite Y pozisyonu.
$d004 : 2. sprite X pozisyonu.
$d005 : 2. sprite Y pozisyonu.
.
.
.
$d00e : 7. sprite X pozisyonu.
$d00f : 7. sprite Y pozisyonu.
$d010 : X koordinatı hi-byteı (*)
$d015 : Spriteların açık/kapalı olma durumları (*)
v.s. adresler kullanılır. Şimdi hepsini yazmiicam.
* : $d010, $d015 gibi byteların her biti bir spriteı ifade eder. Önrek olarak $d015'in değeri 5 ise 5'n binary karşılığı
5 = %00000101
olduğuna göre 0. ve 2. spritelar ekranda gösterilecektir.
Spritelarla ilgili tüm detaylar programcının el kitabında mevcuttur.
Spriteların avantajları nedir?
* Ekrana çok hızlı bir şekilde basılıp ekranda hareket ettirilebilirler.
* Sprite-Sprite ve Sprite-Arkaplan çarpışmaları kolayca kontrol edilebilir. Oyunlar için vazgeçilmez bir özelliktir bu.
* Borderlar açıldığı taktirde borderlara basılabilirler.
* Yatay ve dikeyde 2x uzatılabilirler. Dikey'de $d017 stretch tekniğiyle 2x'den fazla da uzatılabilirler.
Spriteların dezavantajları nelerdir?
* Raster zamanlamalarını bozarlar
* Tek satırda maksimum 8 taneyle sınırlıdırlar.
Bob nedir diyecek olursan...
Boblar grafik ekranı ya da karakter set üzerine basılan grafik parçalarıdır. Bir nevi spriteların software emulasyonu diyebiliriz. Boblar her zaman kare ya da dikdörtgen biçiminde hafızada saklanırlar. Ancak ekrana basılırken genellikle ORlanarak basıldıkları için, boş kısımlarından arkaplan gözükür yani arkaplanı bozmazlar.
Eğer bir bob birebir sprite gibi kullanılmak istenirse arkaplanı bozmamasının iki yolu vardır.
1) Arkaplan her framede baştan çizdirilsin. Bu metod PC'de sıkça kullanılır. Ancak C64'de genellikle hız yetersizliğinden dolayı kullanılmamaktadır.
2) 64 kullanılan yol ikinci yoldur. Yalnızca bobun basılacağı alan hafızada bir yere (bir buffera) kopyalanır ve bob basılıp ekranda gösterildikten sonra bir sonraki frame için yalnızca bu alan geri kopyalanır.
Ancak boblar her zaman arkaplanlar üzerine basılmaz elbette ki. Bazı efektlerde her defasında ekran temizlenerek boblar basılırken bazı efektlerde ise (örneğin unlimited bob) ekran hiç silinmeden boblar basılır.
Peki bob basmak ne demektir? Bob basmanın nesi zordur?
Bob dediğimiz grafik parçasını biz hafızada 8x8'lik karakterler içinde tutarız. x,y koordinatı olarak 16,24 koordinatına bob basmak kolaydır. 2 karakter sağa, 3 karakter aşağıya bas... Buraya kadar tamam. Ancak 19, 28 koordinatında olay biraz daha karmaşık hale geliyor. Bu sefer yine 2 karakter sağa ve 3 karakter aşağıya basıyoruz ancak bir de karakterin içindeki dataları 19-16 = 3 bit sağa ve 28 - 24 = 4 bit ağağıya kaydırmamız gerekiyor. Yani 8'in katları olmayan durumlar için özel çözümler düşünmek gerekiyor.
Bir gün benim evime gelirsen sana detaylı olarak BOB olayını anlatabilirim. Spritelar çok daha kolaydır, kendin çözersin. Ama BOB bir parça matematik ister.
Yazmaktan yoruldum. Bunu bir tutorial haline getirip dergiye yazarım belki de kim bilir
Bakkada'ya attığım mesajda atladığım bir noktayı tamamlayayım. Bobların boyutları 8x8 ile sınırlı değil elbette ki ancak 8'in katları olarak hafızada saklanırlar genellikle. Örnek olarak boblar:
8x8
16x8
8x16
16x16
24x16
16x24
24x24
32x32
48x48
gibi boyutlatda hafızada saklanırlar. Ekrana basarken ise bit shift edildiklerinde taşma yapacakları için hep bir karakter daha fazla alan da işin içine girer. Örnek olarak
24x24 pixellik yani 3x3 karakterlik bir bob ekrana basılırken 32x32 pixellik yani 4x4 karakterlik bir alan üzerinden işlem yapılır.