Cgc başlığından hareketle, özellikle domino için olmakla beraber sinclair kullanabilen ama basic ile arası olmayanlar için temel sinclair basic komutlarını tanıtmak istiyorum. Yanlış anlamayın, oyunları compo'ya sokmanz için değil, zaten böyle birkaç başlık oluşturmak istiyordum, basic ile başlıyım dedim. Sonra C ve en son asm başlıkları açacağım.
Elbette buradaki örneklerden yola çıkarak yaptığınız oyun büyük olasılıkla bir crap game olacaktır
Bu ileri basic kursu değil, basic bilenler için sinclair basic kursudur.
Bu başlığın yanında Basin isimli emülatörü kullanarak kolaylıkla deneyebilirsiniz. Hemen başlayalım.
Nasıl yazı yazdırılır?
PRINT komutu bu işi üstleniyor. Belirli bir konuma yazdırmak için ise AT y,x belirtecini kullanabiliriz.
Örneğin:
10 PRINT “retrojen”yazdığımızda en son imleç pozisyonundan başlayarak retrojen yazarsınız. Fakat yüksek skor güncellemesi gibi sürekli olarak belirli bir pozisyona yazdırmak istiyorsanız AT komutunu print ile birlikte kullanıyoruz:
10 PRINT AT 11,10;”retrojen”Zx Spectrumda Print komutu ile ulaşılabilen 32 sütun (0-31) ve 22 satır (0-21) vardır. Birden fazla at komutunu bir arada kullanmak mümkündür:
10 PRINT AT 0,0;”Hi Score:”; AT 0,15;”Level:”
20 PRINT AT 0,10;scoreAT’de dikkat etmeniz gereken şey, önce Y sonra X parametresini alması.
Nasıl klavye girişi yapılır?INPUT komutu standard bir giriş yöntemi sunuyor.
10 INPUT ”Adınız?”;a$;”Soyadınız”;s$;”Okul no:”;oFakat daha aksiyonlu bir oyunda yön tuşlarını kontrol etmemiz gerekebilir. Bu durumda INKEY$ komutunu kullanıyoruz:
10 LET i$=INKEY$Burada o anda basılı olan tuşu i$ değişkenine atıyoruz. Eğer basılı tuş yok ise i$ boş yani “” dönecektir.
Genellikle bir işlem yapmadan önce gerçekten bir tuşun basılıp basılmadığını if ile kontrol etmemiz doğru olacaktır.
10 GOSUB ai
20 LET i$=INKEY$
30 IF i$=”” THEN GOTO 10
40 … (oyuncunun hareketleri uygulanır)Yukarıdaki satırda bilgisayarın kontrol ettiği karakterlerin hareketi için bir sub rutine girilip geri dönülüyor. sonra oyuncunun bir tuşa basıp basmadığı kontrol ediliyor.
Bazıları bu komutu direkt kullanmayı tercih edebilir.
10 IF INKEY$=”a” THEN PRINT “a”;Fakat bu durumda peşpeşe basılan tuşlar çift sonuç verebilir. Bu gibi durumlara Race Condition deniyor.
INKEY$ tuşu sadece tek bir tuşu okumak için kullanılıyor. Aynı anda basılan tuşlar için bir sistem değişkenini kontrol etmeniz gerekiyor.
Renkler nasıl ayarlanır?Temel renk komutları PAPER (0-7), INK(0-7), BRIGHT(0-1) ve FLASH(0-1) olarak belirlenmiş.
Bunları ekranda görüntü oluşturan tüm komutlara ekleyebileceğimiz gibi kendi başlarına da kullanabiliyoruz.
10 INK 7: PAPER 0Üstteki satır bundan sonra olacak tüm grafik işlemlerini siyah üzerine beyaz ile yapılmasını sağlayacaktır. Eğer ekranı tamamen siyah yapmak isterseniz sonuna CLS komutu vererek tüm ekranın bu şekilde doldurulmasını sağlayabilirsiniz.
Ya da geçici olarak belirli bir renk kullanabilirsiniz:
10 PRINT PAPER 0; INK 5; “ MAVI ”;INK 3;” PEMBE ”;BRIGHT1;PAPER7;” PARLAK ”;FLASH 1;” FLASH “Bu komutlar sadece o satır için geçerli olacaktır.
Bunların dışında renkle ilgili olmasa da görünümü modifiye eden OVER ve INVERSE komutları da mevcur. INVERSE komutu bit görünümünü ters çeviren bir komut. Yani
PAPER7;INK3;INVERSE1;”TEST” yazdığınızda pembe üzerine beyaz bir test yazısı görürsünüz. Burada inverse’in yaptığı iş renkleri ters çevirmek değil, basılan grafiğin bitlerini ters çevirmektir.
OVER komutu ise grafiklerin üst üste basılabilmesini sağlar. Örn:
10 PRINT AT 0,0;”TEST”;OVER1;AT 0,0;”____” yazdığınızda altı çizili bir test yazısı görünür.
Son olarak sadece tek başına kullanılan BORDER komutu var, onu da çerçeve rengini ayarlamak için kullanabilirsiniz.
Çizim nasıl yapılır?Spectruma özgü kullanımı olan PLOT ve DRAW komutları ile çizim yapabilirsiniz.
PLOT X,Y ile ekrandaki bir pikseli boyayabilirsiniz. Bunlara renkleri verebilirsiniz:
10 PLOT INK2; 10,30Bunu takiben DRAW x,y komutu ile düz ve eğri çizgiler çizebilirsiniz
10 PLOT 10,10
20 DRAW 20,20
DRAW komutu son piksellenen noktadan itibaren çizim yapar. Yani yukarıdaki çizgi 10,10 noktasından 30,30 noktasına çizilecektir. Aynı şekilde renk kontrol komutlarını draw ile birlikte kullanabilirsiniz.
Eğer eğri çizmek istiorsanız DRAW’a üçüncü bir parametre vermeliyiz.
20 DRAW 20,20,2Ekranda bir eğri göreceksiniz. Ama bu eğri biraz yavaş olduğu için ben henüz bir işe yaradığını görmedim.
Grafikler nasıl ayarlanır?Spectrumda özel bir grafik işlemcisi olmadığı için donanım destekli sprite'lar yok. Böyle olunca basic'de sprite üretmek çok zor bir iş haline geliyor. Fakat bunun yerine spraytımsılar var, onlara udg diyoruz. Aslında bunlar bildiğimiz karakterler.
Yani size UDG’lerden bahsetmek istiyorum. Zx Spectrumda fontlar ROM’da tutuluyor elbette ama isterseniz tüm fontları değiştirebilirsiniz. Fakat buna üşenenler için karakter tablosundan 21 adet karakter RAM’de tutuluyor ve bunlara UDG (user defined graphics) deniyor. Bu karakterleri oyunlarınızda sprite olarak kullanmanız mümkün. Bunları iki şekilde düzenleyebilirsiniz, biri oldskool yöntem olan kod ile, ikincisi ise basin’in grafik editörü ile.
Kod ile düzenlemek için normalde uygun adresi modifiye etmek gerekiyor. Bu adresi USR “A” şeklinde A’dan U’ya kadar olan harflerle edinebilirsiniz (örn. LET adres=USR “a”).
1 POKE USR "P"+0,BIN 00110011
2 POKE USR "P"+1,BIN 11001100
3 POKE USR "P"+2,BIN 00110011
4 POKE USR "P"+3,BIN 11001100
5 POKE USR "P"+4,BIN 00110011
6 POKE USR "P"+5,BIN 11001100
7 POKE USR "P"+6,BIN 00110011
8 POKE USR "P"+7,BIN 11001100Yukarıda görüldüğü gibi, POKE komutu ile USR “P” adresindeki bitmap verisini BIN komutun çevrimi ile düzenliyoruz.
Daha sonra bu ürettiğimiz grafiği CHR$(x) ile kullanabiliriz. x 144’den başlıyor, ve 164’e kadar gidiyor. Yukarıdaki örnekde P düzenlendiği için PRINT CHR$(159) kullanmak gerek. Alternatif olarak grafik moduna geçip uygun harfe de basabiliriz.
Diğer yöntem ise basin editörünü kullanmak, Tools menüsünden Graphics/Sprite editör seçeneğini seçmeniz gerekiyor. İşiniz bitince grafik editöründe File>export>ok seçmeniz gerek yoksa düzenlediğiniz grafikleri göremezsiniz.
Son olarak bütün bunları birleştiren kısa bir program yapalım:
1 POKE USR "P"+0,BIN 00011000
2 POKE USR "P"+1,BIN 00011001
3 POKE USR "P"+2,BIN 10001010
4 POKE USR "P"+3,BIN 01111100
5 POKE USR "P"+4,BIN 00011000
6 POKE USR "P"+5,BIN 00100100
7 POKE USR "P"+6,BIN 00100100
8 POKE USR "P"+7,BIN 01101100
10 BORDER 5: PAPER 5: INK 1: CLS
15 LET px=15: LET py=18: LET ex=2+INT (RND*27): LET ey=0: LET skor=0: LET hak=5
19 PRINT "R A I N M A N"
20 PRINT "Baslamak icin bir tusa basin"
30 PAUSE 0
40 CLS
52 GO SUB 120: IF hak=-1 THEN PRINT AT 11,8; INK 2;"OYUN BITTI": PAUSE 0: PAUSE 0: GO TO 10
53 LET i$=INKEY$
54 IF i$="" THEN GO TO 50
55 PRINT AT py,px;" "
60 IF i$="o" THEN LET px=px-1: IF px<1 THEN LET px=1
70 IF i$="p" THEN LET px=px+1: IF px>30 THEN LET px=30
100 PRINT AT py,px;CHR$ (159)
110 GO TO 50
120 PRINT AT ey,ex;" "
125 IF ex=px THEN LET skor=skor+1: BEEP 0.01,1
130 LET ey=ey+0.7
140 IF ey>18 THEN LET ey=1: LET ex=2+INT (RND*27): LET hak=hak-1: PRINT AT 0,20;"Skor:";skor,"Hak:";hak
160 PRINT AT ey,ex;"|"
170 RETURN
Eğer basin kullanıyorsanız kaydederken mutlaka *.bas formatını seçin.
Bu programı kopyalayıp emülatöre yapıştırabilirsiniz, aşağıdaki başlıktaki Basin programını windows tabanlı bilgisayarınıza kurun:
http://retrojen.org/pano/index.php?topic=178.msg1032#msg1032