Bu sayfadaki yazılar
Sayfanın metni
Sayfa 60
Şekil 8.
Oyuncu ve Füzeler'in Hafıza Adresleri
$02C0 : Oyuncu 0 ve Füze 0'ın rengi.
$02C1 : Oyuncu 1 ve Füze 1'in rengi.
$02C2 : Oyuncu 2 ve Füze 2'nin rengi. $02C3 : Oyuncu 3 ve Füze 3'ün rengi.
$D000 : Yazarken; Oyuncu 0'ın X koordinatı. Okurken; Füze 0'ın oyun alanı çarpışma kontrolü.
$D00A : Yazarken; Oyuncu 1'in X koordinatı. Okurken; Füze 1'in oyun alanı çarpışma kontrolü.
$D002 : Yazarken; Oyuncu 2'nin X koordinatı. Okurken; Füze 2'nin oyun alanı çarpışma kontrolü.
$D003 : Yazarken; Oyuncu 3'ün X koordinatı. Okurken; Füze 3'ün oyun alanı çarpışma kontrolü.
$D004 : Yazarken; Füze 0'ın X koordinatı. Okurken; Oyuncu 0'ın oyun alanı çarpışma kontrolü.
$D005 : Yazarken; Füze 1'in X koordinatı. Okurken; Oyuncu 1'in oyun alanı çarpışma kontrolü.
$D006 : Yazarken; Füze 2'nin X koordinatı. Okurken; Oyuncu 2'nin oyun alanı çarpışma kontrolü.
$D007 : Yazarken; Füze 3'ün X koordinatı. Okurken; Oyuncu 3'ün oyun alanı çarpışma kontrolü.
$D008 : Yazarken; Oyuncu 0'ın yatay genişliği (0-normal, 1-iki kat, 3-dört kat). Okurken; Füze 0'ın oyuncu çarpışma kontrolü (0, 1, 2, 3-Oyuncu 3).
$D009 : Yazarken; Oyuncu 1'in yatay genişliği (0-normal, 1-iki kat, 3-dört kat). Okurken; Füze 1'in oyuncu çarpışma kontrolü (0, 1, 2, 3-Oyuncu 3).
$D00A : Yazarken; Oyuncu 2'nin yatay genişliği (0-normal, 1-iki kat, 3-dört kat). Okurken; Füze 2'nin oyuncu çarpışma kontrolü (0, 1, 2, 3-Oyuncu 3).
$D00B : Yazarken; Oyuncu 3'ün yatay genişliği (0-normal, 1-iki kat, 3-dört kat). Okurken; Füze 3'ün oyuncu çarpışma kontrolü (0, 1, 2, 3-Oyuncu 3).
$D00C : Yazarken; Füze 0'ın yatay genişliği (0-normal, 1-iki kat, 3-dört kat). Okurken; Oyuncu 0'ın oyuncu çarpışma kontrolü (2-Oyuncu 1, 3).
$D00D : Yazarken; Füze 1'in yatay genişliği (0-normal, 1-iki kat, 3-dört kat). Okurken; Oyuncu 1'in oyuncu çarpışma kontrolü (1-Oyuncu 0, 3).
$DOOE : Yazarken; Füze 2'nin yatay genişliği kat, kat). Okurken; Oyuncu 2'nin oyuncu çarpışma kontrolü (15Oyuncu 0, 1, 3).
$DOOF : Yazarken; Füze 3'ün yatay genişliği kat, kat). Okurken; Oyuncu 3'ün oyuncu çarpışma kontrolü (15Oyuncu 0, 1).
Bu adres açıklamalarında bazı kurala ya da mantığa uymayan noktalar bulabilirsiniz. Örneğin oyuncuların diğer tüm oyuncularla çarpışma kontrollerinin olmaması gibi. Bunlar hata değil Atari'nin bazı kuralları ya da donanımsal sınırlandırmalar olarak değerlendirilmelidirler.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 61
Oyuncu ve Füzeler'in Ekranda Gösterilmesi
Şu ana kadar öğrendiklerimizin bir işe yaraması için öncelikle bu yaratıkları ekranda nasıl göstereceğimizi bilmemiz gerekiyor. Aslında bu oldukça basit bir işlem. Bu işi gerçekleştirebilmemiz için yukarıda öğrendiğimiz adreslere Antic ve GTIA çipleri arasında bir köprü gibi çalışan iki tane daha adres eklememiz gerekiyor.
$022F (DMACTL): Bu adres oyuncu ve füzelerin haricinde diğer grafik ekranı ile ilgili bayrakları da taşıyan bir adrestir. Yazı dizimizin birinci sayısında (Plazma #5'de) grafik ekranı açma ve görüntü listeleri konularında da bu adresi görmüş ve kullanmıştık. Şimdi bu adresteki bitlerin anlamlarını inceleyelim.
Bit 0 (değer 1): Dar oyun alanını aç. Bit 1 (değer 2): Normal oyun alanını aç. Bit 2 (değer 4): Füzeleri aç. Bit 3 (değer 8): Oyuncuları aç. Bit 4 (değer 16): Yaratıklar için tek satır çözünürlüğünü aç. Bit 5 (değer 32): DMA'yı aç. Bit 0 + Bit 1 (değer 3): Geniş oyun alanını aç. $022F adresine örnek olarak $1f değeri verdiğimiz durumda;
$1f = 00011111 - Geniş oyun alanı + füzeler + oyuncular + tek satır çözünürlüğü açık anlamına gelecektir. Ancak bu işlem henüz yaratıkları görüntülememiz için yeterli değildir. Çünkü yaratıkların görüntülenmesini kontrol eden anahtarları içeren bir adres daha vardır.
$D01C (GRACTL) : Bu adres grafik kontrol adresidir. Oyuncular ve füzelerin ikisinden birinin ya da her ikisinin gösterilip gösterilmeyeceğine karar verir.
Bit 0 (değer 1): Füzeler görünür. Bit 1 (değer 2): Oyuncular görünür. Bit 0 + Bit 1 (değer 3): Hem füzeler hem oyuncular görünür.
Bu adresin değeri 0 olduğunda oyuncular ve füzeler görüntülenemezken, 3 değeri verildiğinde her ikisi de görüntülenebilir.
Oyuncu ve füzeleri görüntüleme örneği:
lda sta lda sta
#Ş1£ $022f ; #$03 #d0lc ;
DMACTL
GRAGTL
Bu iki adrese doğru değerler verildiğinde oyuncular ve füzeler artık görüntülenebilirler. Ancak elbette ki grafik haritaları ve pozisyonlarının da düzgün bir biçimde ayarlanması gerekmektedir.
Her İki Düzlemde Hareket Eden Oyuncu Örneği
Şimdi ilk çalışan örneğimizde ekranda daire çizen bir X yaratığı görelim. Bu yaratık için 0 numaralı oyuncuyu kullanacağız.
Dairesel hareketi elde etmek için yatayda kosinüs, dikeyde sinüs fonksiyonu kullanmamız gerekir. Kosinüs tablosu sinüs tablosundan elde edilebildiği için yalnızca sinüs tablosu oluşturmamız yeterli olacaktır. Kosinüs tablosu sinüs tablosunun 90 derece, yani ilerisindeki değerleri okuyarak elde edilebilir. Ancak bu durumda sinüs tablosunun sonunu geçeceği için sinüs tablosu hafızada peş peşe iki kez tekrar ettirilerek bu problem çözülebilir.
Sinüs tablosunu hesaplatmanın birçok yolu vardır. Bunu doğrudan assemblerdan da hesaplatabiliriz. Ancak ben genellikle çapraz geliştirmenin gücüne olan inancımdan bu tür hesaplamaları PC'de yapmayı tercih ediyorum (Bkz: Test Platformu köşesi, Plazma #1, #2, #3, #4). Şimdi kısa bir JavaScript koduyla internet tarayıcı ekranımıza sinüs tablosunu yazdıralım.
sinus.htm
<script> for(i - O;
(
2567 84 * Math.floor(83.9 * Math.sinl(i / 128 ız 0) document.write(","); document .writela);
a - 1£(i
) </script>
Bu programın çıktısını aşağıdaki kodun sonlarında
(sinus şeklinde işaretlenmiş iki alana kopyalamamız gerekiyor. Kopyaladığımızda görüntü 84,86,88,90, .... , 75,77,79,81" şeklinde olmalı. Eğer bu işlem size zor geliyorsa Plazma #6'nın yanında gelen ek dosyalardan hazır kaynak koda erişebilirsiniz.
Şekil 9.
oyuncu hareketi.a
* Math.PI));