Commodore 64 ile Grafik (6)
Bu ayki konumuz, C64'ün en özelliklerinden biri olan sprite'lar. Geçen ayki noktasal grafik konusuna nazaran daha kolay bir konu. Genel bir tanımlama yaparsak, sprite'lar birbirlerinden ve ekranın o anda bulunduğu durumdan bağımsız olarak varolabilen ve hareket eden sınırlı büyüklükte objelerdir. Toplam
sekiz sprite kullanım imkânı vardır. Sprite'ların renkleri, büyüklükleri, birbirlerine ve ekrandaki görüntüye karşı öncelikleri ayarlanabilir ve gene birbirleri veya ekrandaki diğer şekil ve yazılarla olan çarpışmaları al-
Tuna ERTEMALP gılanabilir. Tıpkı değişik ekran modları gibi, sprite'lar da tekrenkli veya çokrenkli (multicolor) olabilir. Tüm bu işlemleri, daha önce ayrıntılı listesini verdiğimiz, C64'ün grafik işleri sorumlusu VIC'in yazmaçları ile yapabiliyoruz. Bu bölümde, ikili sistemde aritmetik kullanarak VIC'in yazmaçları ile oynayacağımız için, COMMODORE dergisinin dokuzuncu ve onuncu sayılarında çıkan COMMODORE 64 İLE GRAFİK (1) ve COMMODORE 64 İLE GRAFİK (2)
yazılarını da elinizin altında bulundurun.
Demin de belirttiğimiz gibi, sekiz sprite'ı aynı anda ekranda gösterme olanağımız var. Bunları, yazı dizimizin ikinci bölümünde de belirttiğimiz gibi, 0-7 arası sayılarla belirleyeceğiz. Bilgisayar konularında numaralamaların 1'den değil de, 0'dan başlamasına artık alışmış olmamız gerekir. Her normal sprite, ayrı ayrı yakılıp silinebilen 504 noktadan oluşur. Bu noktalar 24'er noktalık 21 sıra halinde dizilmiştir. İşte bu 24 nokta genişlik ve 21 nokta yüksekliğe sahip alanda, ekrandan bağımsız olarak şekiller yaratıp hareket ettirebilirsiniz. Her bir byte 8 bit olduğuna ve her
mmmamm bir noktayı bir bit ile gösterebildiği-
1 |! 8 1 3 1 mize göre (geçen sayıdaki grafik ek-
---------- ranındaki noktaları hatırlayın), top-
176543210! 176543210! 176543210! lam 504/8 — 63 byte'lık bir alana ihti-
yacımız var. Ayrıca her sayıda 24 nok-
Ol... .....!Byte ne. ta olduğunu söylemiştik. Bu da 3 byte
Buka 2) ' eder. Demek ki, 63 byte'ımız, üçer
2lRute 1Bute 1 üçer gruplanmakta ve her bir grup,
4l1Byte 13!........!Byte 141........! sprite'ı oluşturan 21 grafik satırının
SiByte Byte birini oluşturmaktadır. Şimdi, sprite'-
BilByte 18!........ 1Byte 19!........!Byte 20!........! ımızı oluşturan byte'ları 0-62 arası sa-
221........ 1Byte ! yılarla numaralandıralım ve yandaki
8Bl!Byte 241........!Byte 25!........!Ryte 26!........ ! tablo ile deminden beri anlattıklarımı-
diByte 1Byte 28!........!Byte 29!........! zı şekillendirelim...
10!Byte 30!........!Byte 321........ !
111Byte 381........!Byte 341........1Byte Tablomuzdaki her nokta, sprite'ın
121Byte 38!........ 381........! bir noktasına karşılık geliyor. Her se-
13!Byte 3B9!... 1Byte 401........ ! kizlik nokta grubunun solunda, o
141Byte 421........ noktaları saklayan Byte'ın numarasını
15!Byte 45!........ iByte APİ. 1 görmektesiniz. Her biri üç byte'dan
16!Byte 48!........ 1 oluşan 21 satır, açıkça görülüyor. Bu
za a masil sayılar
191Byte 1Byte 58!........l!Byte 59!........! ilerki kısımlarında
BO!........!Byte Bi!........ 1Byte !
Gü ea ÜR Pa etmi a ve İline mea hi ler een amam, Ayrıca, her tekrenkli sprite, bilgi-
1 sayarımızın bize sunduğu 16 renkten birini alabilir. Bunun için, o sprite'a âit renk yazmaçına (VIC'in 39-46 arası yazmaçları), 0-15 arası renk kodunu POKE ile yüklemek gerekir. Artık, o sprite'ı tanımlayan byte'ların 1 durumunda bulunan bütün belirlenen renk ile gösterilecektir. Çokrenkli sprite'lara gelince... Deminden beri anlattığımız sprite'lardan farkı, aynı anda dört değişik renk taşıyabilmeleri. Bunların ikisi, o anda ekranda bulunan tüm çokrenkli sprite'lar için ortak. Üçüncüsü, sprite'ın o anda üstünde bulunduğu ekran bölgesinin sahip olduğu renk. Sonuncusu da, her sprite için ayrı ayrı olabilmekte. Tabii ki, çokrenklilik karşısında kurban edilen şey, tıpkı çokrenkli nokta grafiğinde olduğu gibi, yatay çözünürlük. 24 nokta yerine artık 12 nokta var. Ancak yanlış anlama olmasın; 24 nokta, ikişer ikişer birleşerek bir renk noktası oluşturuyor. Yoksa, 504 nokta (— 504 bit — 63 byte) kullanımı değişmiyor. Aşağıdaki tablo ile bunu kolayca görebiliriz:
2!Byte GBl!lkk..kk..!Byte 3iIByte 1Byte 41Byte İ2!kxk.. 5SiByte 15!kk.. 4k kk 10!Byte 30!4xk.. 111Byte 33!*k.. !Byte 12!Byte 4k 13!Byte 33!kk.. 15!Byte kk 16!Byte 17!Byte 18!Byte kk 13!Byte saptar. Bunu da şu şekilde gösterebi- BİT KAYNAK
74000 Saydam (ekran rengi) 001 VIC'in 37. yazmaçı
7010 VIC'in 38. yazmaçı
VIC'in 39-46 arasını yazmaçları
Bir başka özellik de, ekranda tekrenkli ve çokrenkli sprite'ların aynı anda gösterilebilmesi. Örneğin, 3 çokrenkli ve 5 tekrenkli sprite kullanma
olanağımız var. Bir sprite'ın hangi renklendirme türünde olacağını, VIC'in 28 numaralı yazmaçı saptar. Bu yazmaçın her bir bit'i bir sprite'ı temsil eder. Örneğin 0. bit 0. sprite'a, 6. bit 6. sprite'a karşılık gelir. Eğer bir sprite'a ait bit 1 değerini almışsa, o sprite çokrenkli gösterimi kullanacak demektir. Bir örnek görelim: Diyelim ki 4 numaralı sprite çokrenkli olacak. Vereceğiniz komut, POKE 53248+28,2^4 olacaktır. Veya, daha fazla sprite'ı çokrenkli
.1Byte .1Byte Hk... .1Byte Hk... 20! 231 .1Byte 23!kk.. 4k...
1 1 1 1 1 1 1 ! .!Byte 1 1 1 1
38!kk.. kk... 47! kk... SOlxk.. ka... .1Byte Mk...
Daha önceleri de gördüğümüz gibi, iki bit'in alabileceği değerler 0-3 arası değişmekteydi. İşte yanyana duran ve tablomuzda da gösterdiğimiz ikişerli bit gruplarının alacağı 0-3 arası değer, karşılık geldiği renk noktasının renginin hangi kaynaktan geleceğini yapmak isteyebilirsiniz, örneğin 1, 5 ve 7'yi. Bu durumda da POKE 53248+28, 1 OR 32 OR 128 vereceksiniz. Bir sprite yaratırken, ilk yapılacak iş 63 byte'lık bilgiyi oluşturmak ve bu bilgiyi hafızanın içinde uygun bir yere yerleştirmek. Önce 63 tane byte'ın nasıl oluşturulacağına bakalım. Kolaylık olması amacıyla, sprite'ı oluşturan 21 sıranın sadece ilkini ele alalım. Nasılsa diğerleri de aynı şekilde hesaplanıyor. Ve diyelim ki, sprite'ımızın ilk satırı, bir dolu, iki boş, bir dolu, iki boş... şeklinde olsun. Bu-
nu bir ve sıfır kullanarak gösterirsek:
100100100100100100100100100
Her bir satırımız üç byte'dan oluştuğuna göre bu-satırı üç parçaya ayıralım:
97010010010 9001001001 97000100100
Bunların her birinin onluk sistemdeki karşılıklarını da bulalım:
146 73 36
Demek ki, sprite'ımızı oluşturan 63 byte'ın ilk üçünün değerleri 146, 73 ve 36 olacaktır. Eğer yukarıda verdiğimiz satır, sprite'ımızın 15. satırı olsaydı, bulduğumuz bu değerler, sırasıyla 45, 46 ve 47 numaralı byte'ların içerikleri olacaktı (tablomuza bakınız). Çokrenkli sprite dizaynı biraz daha karmaşık. Bu sefer noktaların dolu veya boş olmasını değil de, hangi renkte olması gerektiğini bilmemiz gerekiyor. Gene diyelim ki sprite'ın ilk satırını oluşturan 12 renk noktasının sırayla, 0, 1,2,3,2,1,0,1,2,3,2, 1 renklerinden oluşmasını istiyoruz. Bu sayıların ikili sistemdeki karşılıklarını yanyana yazarak elde edeceğimiz sıfır-bir dizisi şu şekilde olacaktır:
0001101110001000110111001 Gene üçe ayıralım:
00011011 10010001 10111001
Değerlerini de hesaplayalım:
21 145 185
Demin olduğu gibi, ilk üç byte'ın veya dilediğimiz satırı oluşturan üç byte'ın alacağı değerleri bulmuş ol-
PROGRAM ADI
: SPRIİTE DEMO 2 duk. Bir ufak tavsiyemiz var. Özellikle monitörü olmayıp da normal televizyon ekranı kullanan arkadaşlar için. Tek renkli sprite dizaynı yaparken, sağı ve solu boş olan tek noktalar kullanmaktan kaçının. Bunları ekranda görmeniz çok zor olacaktır. Yanyana iki nokta daima daha iyi görüntü verecektir. Bu tamamen video sinyallerinin teknik özelliğinden kaynaklanan bir sorun. Çokrenkli sprite'ler için böyle bir sorun yok. Nasılsa her renk noktası iki kat genişlikte. Tüm bu işlemleri elde yaptığımızda, bir süre sonra alışkanlık kazanacaksınız. Ancak gene de, ben zahmete girmek istemiyorum derseniz, daha önceki sayılarımızda yayınladığımız sprite editörlerini kullanmanızı tavsiye edebiliriz (Sayı 6, Sayı 9). Sıra geldi bu 63 byte'ı nereye yerleştireceğimize. Bu yerleşim bölgelerinin her biri *blok”' adı ile bilinir ve 64'er byte'lık alanlardır. Tabii bize 63 byte gerektiği için, 64. byte'ın bir anlamı olmayacaktır. VIC'in bir defada hafızanın 16K'lık bölümünü görebildiğini ve C64'ün 64K'lık hafızasının bu nedenle BANKO-BANK3 isimleriyle tanımlanan dört hafıza blokuna bölündüğünü 12. ve 11. sayılarımızda belirtmiştik. 16K'yı, 256 adet 64 byte'lık par-
00010 V>53248:POKE
E V*21,0 <161>
09020 INPUT "<CLROHIİZ
CLR>" <a20>
00030 Alzi1k64 <061>
00040 FOR TO A:POKE AL*I,
XT <033>
20050 POKE 2040,11:POKE <164>
00060 POKE <182>
00078 POKE
20080 POKE Vt*23,144:POKE
90090 POKE V4*21,144 <018>
00100 POKE V*4*37,7 <158)>
00110 POKE V*38,6
00120 POKE <127)>
00138 POKE <853>
90140 POKE V*4*1,100:POKE V4*5,108
09150 X2z255 <a24>
00160 POKE V4*0,0:POKE V*4,X2 <145>
00170 POKE V*4*30,0 <028>
00188 FOR TO 255 STEP HZ <a55>
00190 IF THEN 240 <044>
200200 X2-X2-1:POKE <058>
002106 POKE V*1,40x5IN<X0/30) 41100 <236)>
00220 POKE <114>
00230 NEXT <a240>
90240 FOR TO 255:POKE V*4*33,X:POKE
1,X-1:NEXT <149>
09250 POKE V4*30,0:PRINT "<HOME
631,ASCC"<HOME>"):POKE i
98,1 <113>
0920260 DATA 8,0,128,10,2,128,2,138,0,64,13
'6,5,80,168,21,84,32,93,117,33,1825 <114> “
900270 DATA 125,101,253,127,103,253,123,10 |
“3,173,123,103,173,123,103,173
00280 DATA 1İ23,103,173,123,103,173,123,10“
93,253 <185>
00290 DATA 95,101,253,21,97,117,5,32,84
çalara ayırabilir ve bunları 0-255 arası numaralayabiliriz. Bilgisayar ilk açılışta BANKO'ı kullandığına göre, 64 byte'lik bloklarımızın başlangıç adresleri aşağıdaki gibi olacaktır.- -
BLOK BAŞLANGIÇ ADRESİ
0 80000 (0) 1 $0040 (64) 2 $0080 (128) 3 $00CO0 (192) 4 $0100 (256)
255 $3FCO (16320)
0-1 arası bloklar ve 12. blok, bilgisayar için hayati değeri olan bilgileri saklandığı bölgeye geldiği için kullanılmamaktadır. 16-32 arası bloklar için de bu sözkonusu. 33 ve sonra gelen bloklar, BASIC programlarınızın ve kullandığınız değişkenlerin saklandığı hafızaya denk geliyor. 11, 13, 14, 15 numaralı bloklar boş kaldığına göre onları kullanabiliriz. Yalnız dikkat etmeniz gereken nokta, 13-15 arası aynı zamanda teyp için tampon bölge olarak kullanılmaktadır. Dolayısıyla bu bölgeleri sprite için kullanır, sonra da teyp ile bazı işlemler yaparsanız, sprite tanımlamalarınız bozulacaktır.
Bir başka olanak da, normalde $0801 (2049) adresinde başlayan BA-SIC hafızasının başlangıç adresini, 43/44 numaralı hafızalarda değişiklik yaparak “yukarı' kaydırmaktır. Bilgisayar ilk âçıldığında, bu adreslerin değeri sırasıyla 1 ve 8'dir, 14 8*256- 2049 ettiğine göre, BASIC bölgesi 2049 ($0801) adresinden başlıyor demektir. Eğer biz POKE 44,10 yaparsak bu adresi 1 4 10*256 — 2561 adresine taşımış oluruz ve arada kalan bölge bize 8 yeni blok sağlar. Ancak bu POKE işlemi hafızada herhangi bir BASIC programı yokken yapılmalıyoksa programınız bozulur.
Veya 16K”'nın son kısımlarında yeralan blokları kullanabilirsiniz. Bu durumda dikkat etmeniz gereken şey, BASIC programınızın veya kullandığınız değişkenlerin bu bölgelere kadar uzanabilmesi durumunda tanımlamalarınızın bozulacağıdır. Buna da bir çözüm bulabiliriz. Nasıl ki, 43/44 adreslerinde BASIC başlangıç adresi bulunuyor, 55/56 adreslerinde de BA-SIC hafızasının tavanı tamamlanır. Bunu nasıl kullanabiliriz?.. Diyelim ki, 248-255 numaralı blokları kullanmak istediniz. 248 numaralı blokun başlangıç adresi, 248 x 64 — 15872 ($3E00) olduğuna göre BASIC hafızasının tavanını bu adrese getirip
| tanımlamalarımızı koruyabiliriz. Bu durumda 15872'yi küçük ve büyük byte olarak (bkz. Sayı 13, Süperassembler) ikiye ayırmamız gerekiyor. Bunlar, 62 ($3E) ve 0 ($00) değerleridir. Şimdi de POKE 55,0:POKE56,62 ile sınırı aşağı indirmiş oluruz. Son iki işlemin ortak iki noktası var. Her ikisinde de geri kalan BASIC kullanım alanı 38911 byte'dan daha az oluyor. Çünkü bunun bir kısmını sprite'lara feda ediyoruz. Bir başka nokta da, $1000-$1FFF (4096-8191) arasında bulunan 64-127 numaralı blokların hiç kullanılmaması gerektiği. Çünkü bu bölge, 12. sayımızda da sözünü ettiğimiz bölgedir. Ancak, şunu belirtmek gerekiyor. İki üç sprite kullanmanız gerekiyorsa, 11, 13, 14 ve 15 numaralı blokları kullanmanızda büyük fayda var. Hem kolaylık hem de hafıza kullanımı açısından. Üstelik birazdan da göreceğimiz gibi, iki değişik sprite aynı görüntüye sahip olacaksa, iki ayrı blok yerine tek blok kullanma imkânımız var.
DEMO 2 programımızda olduğu gibi.
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.
SPRITE DEMO |
10: VIC'in temel adresi bir değişke-
ne yükleniyor. Bu, tüm grafik ve spri-
te işlemleriyle uğraşan programların
en başında yapılan standart bir işlem.
20: Çerçeve ve ekran renkleri siyaha
dönüştürülüp, ekranda görünen her-
hangi bir sprite varsa kapatılıyor ve
ekran biliniyor.
30: 13 numaralı blok ilk sprite'ımız
için kullanılacak.
40: İlk sprite'ın DATA'ları okunu-
yor.
50-70: İlk sprite'ın
80: İkinci sprite ise 14. blokta.
90-120: İkinci sprite'ın DATA okun-
ması ve DATA 'ları.
130: Bir numaralı sprite göstergeçi,
13. bloku gösterecek duruma getirili-
yor.
140: 6 numaralı sprite'ın Y koordinatı
belirleniyor.
150: 6 numaralı sprite'in X koordinatı
belirleniyor.
160: X-koordinatlarının 9. bit'leri si-
liniyor.
170: 6 numaralı sprite'ın rengi belir-
leniyor.
180: Tüm sprite'lar ekran karakterle-
rinin önünde görünecek.
190: Tüm sprite'lar tekrenkli.
200: 6 numaralı sprite'ın Y yönünde iki
kat büyük gösterilmesi sağlanıyor.
210: 6 numaralı sprite'ın X yönünde
de iki kat büyük gösterilmesi sağlanı-
yor.
220-230: Ekranda yeşil renkli bir yol
oluşturuluyor.
240: Ve 6 numaralı sprite görünür hale
getiriliyor.
250: Sprite'ın hareket hızı, 3-23 arası
bir sayı olarak saptanıyor.
260: Sprite'ın rengi öncelikle beyaz
olacak.
270: Sprite'ın 1-400 koordinatları ara-
sında verilen hızla hareketini ve de-
vamlı renk değiştirmesini sağlayacak
işlemler başlıyor.
280-290: Sprite'ın renk kodu belli bir
oranda artırılıyor. Eğer 16 olmuşsa
tekrar 1'e döndürülüyor. Burada
F-—16 yerine F , 16'da konulabilir.
300: 6 numaralı sprite'ın rengi değiş-
tiriliyor.
310: 6 numaralı sprite, 14. bloktaki di-
zayna sahip olacak şekilde göstergeç
değiştiriliyor.
320-400: Sprite'ın X-koordinatı 9.
bit'ine göre hesaplanıp gerekli yerle-
re yazılıyor. Bir süre beklendikten
sonra, sprite göstergeçi değiştirilip X-
koordinatı yeniden hesaplanıyor. 410: Hareket devam ediyor. 420: Ekranın sol üst köşesine RUN yazılıyor ve programın çalışmasının bitmesinden sonra cursor'un RUN yazısının üstünde olmasını sağlayacak, tuş tampon bölgesini hedef alan POKE komutları veriliyor. Böylece, programın çalışması durunca, sadece RETURN tuşuna basarak yeniden başlatmanız mümkün olacak.
SPRITE DEMO 2
10: VIC'in temel adresi saptanıp, ekran renkleri sıfırlanıyor ve tüm sprite'lar kapatılıyor.
20: hareketin hızı soruluyor. 30: Sprite'ımız 11. blokta olacak. 40: Sprite DATA'ları okunuyor. 50: 0 ve 2 numaralı sprite'ların dizaynının 11. blokta olduğu bildiriliyor. Yani aynı dizayn, iki sprite için de kullanılıyor. 60: 0 ve 2 numaralı sprite'lar (4+2=6), çokrenkli olarak tanımlanıyor. 70: 0 numaralı sprite ekran karakterlerinin arkasından geçecek. 80: Her iki sprite da X ve Y yönlerinde genişletiliyor. 90: Sprite'ların ikisi de görünür hale sokuluyor. 100-120: Sprite'ların üç rengi belirleniyor. İlk ikisi ortak, üçüncüsü ise her biri için ayrı saptanıyor. 130: X-koordinatlarının 9. bit'leri sıfırlanıyor. 140: Y-koordinatları saptanıyor. 150-160: X-koordinatları belirleniyor. 170: Sprite-sprite çarpışmasını kontrol eden yazmaç sıfırlanıyor. 180: Hareket başlıyor. 190: İki sprite birbirine değiyorsa 240'a atlanıyor. 200: Yeni X-koordinatları hesaplanıyor. 210-230: Y-koordinatları bir sinüs eğrisi üzerinde saptanıp ilgili yazmaçlara konuyor ve hareketlilik ile çarpışma kontrolunun başına dönülüyor. 240: Sprite'ların renkleri ardarda değiştirilip çarpışma olduğu bildiriliyor. 250: İki sprite birbirinden ayrılıp çarpışma yazmaçı sıfırlanıyor. Ekranın sol üst köşesine RUN yazılıyor ve programın çalışmasının bitmesinden sonra cursor'un RUN yazısının üstünde olmasını sağlayacak, tuş tampon bölgesini hedef alan POKE komutları veriliyor. Böylece, programın çalış-
PROGRAM ADI *
Vz532438
POKE V*32,8
Als
FOR
KT
DATA &
20010
00030
20040
Baa5a
;B
aaasa
20108
FOR
XT
Çal
DATA
00110
20138
66140
00150
08168
06178
06188
00218
POKE
PÖKE
POKE
POKE
POKE
POKE
POKE
POKE
PRINT
PRINT
T"
PÜKE V*4*21,64
V4*45,1
V4*29,64
00230
60240
20250
20260 Fzİ
00270 FOR
20280
002398 IF THEN
00300 POKE V445,F
00310 POKE 2046,A1/64
90320
16,64:GOTO 340
00330 PÜKE
20340 POKE V*12çKO
00350 FÜR TI
00360 POKE 2046,A2/6564
00380
00390
00400
00418
20420
POKE
POKE
NEXT
PRİNT
SCC"<HOME>")
ması durunca, sadece RETURN tuşuna basarak yeniden başlatmanız mümkün olacak. 260-290: Çokrenkli sprite'ımızın DATA'ları. Gelecek ay, yazı ekranı ve karakter tanımlamaları ile uğraşacağız. O zamana kadar, hoşçakalın...
SPRITE DEMO 1
Is8 TO 62:READ POKE: A1*41I NE
224,126,
31,204, "55 ie, asa, 36, 7,8 ,14,
DATA © GE
DATA 2,2â,96,3,24,96,127,24,120,188
TO G2:READ AZ*I,
DATA
15,6,8
DATA
220,25,128,36,1,224
Izi TO 18
"<RYSON>"; Izi TO 40:PRIİN
TO 400 STEP HZ
IF X2255 THEN KO-X-255: POKE
40:NEXT
KÜ>255 THEN
POKE V*16,64:6G0TÜ 390
FOR Yzi1i TÜ 40:NEXT
"<HOME RUN" :POKE
198,1
<143>
<026>
<189).
<033>
:POKE Vv433, GBiPÜKE V4*21,0
.<X002>
<232>
<056>
<21e>
<113>
8 <e45>
8
<033>
<234>
<163>
3,
FAN
Das)
ka |
no
v
m OT OO
fan)
A SA A A A
AAAAA
BU
09).
Aa
Çan)
w—
C64'ün üçüncü basketbol oyunu International Basketball hepsinin en iyisi. Two on Two adından da anlaşılabileceği gibi “One on One”a daha çok benziyor. Takımınızın iki oyuncusundan birini kontrol ediyorsunuz ve bir başka oyuncuyu bilgisayar kontrol ediyor. Her takımın ayrı potaya ayrı hücumları var. Sayı attıklarında ya da başaramadıklarında sıra değişiyorsa şut atmakta, top çalmakta olduğu kadar başarılı olup olmadığınız da ortaya çıkacak. Bu oyunda da pek çok seçenek var. Tek oyunculu biçimde sizin bilgisayar denetimindeki takım arkadaşınızın her hareketten sonra hangi bölgeye gitmesi gerektiğini seçmeniz gerekiyor. Sizin ve takım arkadaşınızın ne kadar iyi olduğu baştaki raporla belirleniyor. Sizin yetenek düzeyinizi belirlemek için başka seçimler de yapılmalı -Ayrı 6 kategoride 26 puanın da yerleştirilmesini, dağıtılmasını da içeriyor bunlar. Artık başlayabilirsiniz. Sonra takım adınıza ve basit bir turnuvada mı, yoksa ulusal ligde mi oynayacağınıza karar vermeniz gerekiyor. Bunlar sizi açmıyorsa, sıkıcı bir antrenman maçı yapabilirsiniz. Aslında başarılı sayılabilecek bir grafik düzenlemesi var oyunun. Ancak yalnızca bir adamı kontrol edebiliyorsanız, bu oyunun One on One'dan iyi yanı ne? Yine de bir spor programı birçok savaş programından iyidir, diyerek vakit geçirmeyi deneyebilirsiniz. Bu oyunun en büyük sorunu, bütün bu ön hazırlıklardan sonra çok heyecan verici, hareketli bir basketbol oyunuyla karşılaşmamanız.
Herkesin sokaklarda tornetlerle kaykaylarla gezdiği bir zaman vardı herhalde. Kendine saygı duyan her genç serserinin bir zaman böyle şeylerle dolaşmış olacağını tahmin ediyorum. Mastertronic kaykaycıların boş zamanlarında ne yaptıkları konusunda oldukça idealist bir yaklaşıma sahip. Oyunun amacı yolda gidenler yolun başından mümkün olduğu kadar çok boş Coca Cola şişesi toplamak. Mastertronic'in susamış oyuncuları “Britanya'yı Temiz Tutalım” yasasını hatırlatmaya mı çalıştıklarını bilmiyoruz. Benim tahminim Coca Cola'nın Mastertronic'i reklam kampanyalarına dahil et-
32.0 HİLES
-tiği şeklinde. Belki de Tina Turner'ı tutamadıkları içindir. Önünüzde yol habire sağa sola sapıyor. Amaç mümkün olduğu kadar çok boş Coca Cola şişesi toplamak. Ama bunu engellemeye çalışanlar da var. Dertleri yolda sizi ezip geçmekten ibaret. Kaykayınızı joystick'le denetliyorsunuz. Sağ ve sol yön kontrolleri, öne itince eğiliyor ve hızlanıyorsunuz. Ateş tuşuna basınca havaya zıplayacaksınız, bu tırnaklara takılmaktan kurtulmakta ya da yağ birikintilerinin üzerinde sıçramakta size yararlı olabilir. Yolda karşınıza çıkan tüm arabalar size karşı değil. Bazıları korna çalarak sizi ezmeden önce yollarından çekilmenizi isteyebiliyorlar. Bu da yetmez gibi motor kapakları üzerine bir şişe bira koyuyorlar yanlarından geçerken alıp biraz serinleyebilesiniz diye. Boş şişe de size bonus oluyor. Her düzeyin sonunda bir şişe deposuna geliyorsunuz boşlarınızı doldurup, bonusunuzu alıyorsunuz. Oyunun uzunluğu sağlık (güç) derecenize bağlı ve her vuruluşunuzda sağlığınızın birazını kaybediyorsunuz. Ses ve grafik fena değil, ama oyun bir kez başardıktan sonra ilginçliğini hemen yitireceğe benziyor.
Epyx firması erkek çocukların arabalar konusundaki fantezilerini gerçekleştirmeleri için çıkardığı HOTWHEELS programından sonra bu sefer de biz çocukların bebek oynama fantezilerini tatmin için bir program çıkardı. Barbie bebeklerini bilmeyenler bile son ithalat serbestliğinden sonra öğrendiler. Belli başlı tüm oyuncaklarımızda artık bu bebekler ve bu bebeklerin yardımcı aksesuarları (elbiseler, makyajları, peruklar) bulunuyor. Amerika ve Avrupa'da bu bebeklere kız çocukları kadar büyükler de meraklı. EPYX işte bu merakları düşünerek böyle bir oyun üretmiş. Türkiye'de henüz yeni olan bu bebeklerin fiyatlarına bakınca oyunu tercih etmemek elde değil. Her şeyden önce oyunun grafik ve ses yetenekleri bakımından son derece gelişmiş olduğunu söylemeliyiz. Ekranda birbirinden güzel ve renkli. Gelelim oyuna. Barbie, bizim bildiğimiz bebek Barbie'nin hareket edeni. Oyuna Barbie'nin evinden başlıyoruz. Ev zevkle döşenmiş küçük bir oda aslında. Oyuna başladığımızda telefon çalıyor, Barbie'nin erkek arkadaşı telefon eden Barbie'ye o günkü programda nereye gidileceğini söylüyor. Barbie son derece modern görünmesine rağmen oldukça eski kafalı bir kız galiba, çünkü her söylenene hiç itiraz etmeden uyuyor ve hemen alışveriş yapmaya çıkıyor. (Bundan da Barbie'nin oldukça zengin olduğunu anlıyoruz.)
GÖRE EY ARE & NSS
Oyunda size düşen görev ona göre kıyafet edinmeniz bu telefon konuşmasından gerekiyor. Hemen arabanıza sonra başlıyor. O günkü prog- atlayıp yola koyuluyorsunuz. ramda nereye gidilecekse Ayakkabıcı peruk satan bir dükkân, plaj eşyaları satan ve elbise satan dükkânlardan birinin önünde joystick'in ateş tuşuna basarak duruyorsunuz. Ekran kapanıyor ve tekrar açıldığında hayret dükkânın içine girivermişsiniz. Yine joystick yardımıyla istediğiniz eşyayı (ekranda beliren bir eli eşyanın üzerine getirerek) seçebiliyorsunuz. Ateş düğmesine bastığınızda bir de bakmışsınız o eşyayı giyivermişsiniz. Ekranda renk ve desen seçebileceğiniz panolar yardımıyla giyiminizde her renk uyumu da sağlayabiliyorsunuz. Bu işlemi yapmak için yine ekranda gördüğünüz eli kullanmanız yeterli. Ancak oyun burada bitmiyor. Çünkü Barbie'nin erkek arkadaşı çok sık karar değiştiren biri. Tam siz uygun kıyafeti giymişken tekrar telefon edip programın değiştiğini, örneğin pikniğe gidilecekken tenis oynamaya gitmeye karar verdiğini öğreniyorsunuz. Bu durumda derhal dışarı fırlayıp tekrar yeni giysiler almanız gerekiyor. Bu durum birkaç defa gerçekleşebiliyor tabii. Sizin de bu tempoya ayak uydurup uygun kılıklar seçmeniz gerekli. Eğer toplumsal normlara uygunluk konusunda kendinizi eğitmek istiyorsanız, bundan iyisini bulamazsınız. Ancak gerekli kıyafetleri giyip hazırlanmak sıkıcı olmaya başlandığında gece elbisesiyle tenis oynamaya gitmek gibi küçük eğlencelere başvurmaktan kendinizi alamıyorsunuz. Kısaca oyunun en munis kız çocuğunun bile çabucak sıkılacağı Barbie'yi giydirmek ve sürekli giyim peşinde koşmaktan ibaret. Tüm grafik güzelliğine ve ses özelliğinin iyiliğine rağmen, ancak birkaç kere sıkılmadan oynayabilirsiniz. Değişik program örneği olarak görmenizi öneririz.
Cl
STREE Ol
SCORE OO000Ü
SCORE
STACE Oi
Profesyonel oyun makinesi oyunlarından biri daha Commodore için yazıldı. ELITE firmasının çıkardığı bu oyun, grafik ve ses efektleri açısından oyun makinesinde olan versiyonundan farksız. Oyun hızlı başlıyor. Pilotunuzu sırtında taşıdığı jetler yardımıyla hareket ediyor ve elindeki çok çok güçlü lazeriyle savaşıyor. Lazer süper sesler çıkararak ses chipinde patlayıcı açıyor. Yani kısaca oyunda uzay geminiz filan yok. Oyun bilgisayar çizimi uzay gemileriyle ve yaratıklarla savaştığınız “Dragonland”'de geçiyor. Bu bölge şeytan tarafından ele geçirilmiş. Siz Space Harrier pilotu olarak sayısız hücum dalgalarını atlatıp adım adım burayı tehlikesiz
hale getiriyorsunuz.
Bu çaba sırasında bir seri kaya'ya ya da başka bir şeye çarparsanız ölürsünüz. İlk ekranda ağaçlarla dolu
bir bölgedesiniz. Dev ve mavi yabancı gemilerin
dalgalar halinde gelen saldı-
SCORE 000000 rısına karşı koymanız gerekiyor. Bu düzeyin sonunda ilk
dragon'unuzla karşılaşıyorsunuz. Kıvranan, zıplayan ve dalan bu canavara iki doğrudan isabet oldukça zor. Ancak ikinci düzeye geçmek istiyorsanız bunu başarmalısınız. Her düzeyin sonunda birbirinden tehlikeli sahnelerle karşılaşıyorsunuz. Mesela ikinci düzeyin sonunda dört adet yüzle, üçüncü düzeyin sonunda iki kafalı bir canavarla, dördüncü düzeyde bir robotla karşılaşıyorsunuz. Ve bu böyle sürüp gidiyor.
Her düzeyde cisimlere ateş ettiğinizde lazer metalik bir plink sesi çıkarıyor. Güvenli bir uçuş için bu cisimlere dikkat etmeniz gerekli. Birinci düzeyi geçtiğinizde (birkaç denemeden sonra) yedi yaşamınız kaldığını görüyorsunuz. Ve bu durumda her an bir yabancı cisim size doğrudan ateş edebilir ya da pilotunuzun (yani sizin) acemiliğinizden ötürü bir cisme çarpabilirsiniz ve bir yaşam daha kaybedebilirsiniz... Oyunun ne kadar güzel olduğunu belirtmek için böyle durumlarda “Kahretsin”, “çekilsene be” diye bağırmaktan kendinizi alamıyorsunuz. Çünkü oyun boyunca gidebildiğinizce gitmek gibi bir tutku sarıyor içinizi. En güzel düzeylerden biri üçüncü düzey. Burada tam anlamıyla çarpışacak bir şey
yok. Kristal görünümleri dev mantarlara benzeyen binalar arasında uçmanın keyfini yaşayın. Space Harrier'in en kötü yönlerinden birisi grafiklerinin net ve çok güzel olmaması. Tamamen 3D grafik imajlar yaratılmaya çalışılmış ama yine de ELITE daha güzel grafikler hazırlayabilirdi gibi geliyor. Ancak sürat, heyecan ve ses efektleri mükemmel. Son zamanların en iyi oyunlarından biri diyebiliriz.