Gönderen Konu: Basic bilenler için sinclair basic 101  (Okunma sayısı 12877 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2866
  • Advanced User Simulator
    • ae unutmadan
Basic bilenler için sinclair basic 101
« : 24 Ocak 2012, 18:44:23 »
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 :D 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;score

AT’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:”;o

Fakat 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,30

Bunu 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,2


Ekranda 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 11001100


Yukarı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:

Kod: [Seç]
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

Çevrimdışı Alco

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2127
  • "Kahraman olmak, dürüst olmaktan kolaydır" Luigi P
    • Sizin Amstrad
Ynt: Basic bilenler için sinclair basic 101
« Yanıtla #1 : 24 Ocak 2012, 20:43:26 »
Belki işinize yarar:

Mikroprogram Dergisi'nin 4. sayısında Elektronik Müh. Ufuk ÖZBEN'in "Spectrum'da Grafik Tanımlama ve UDG(User Defined Graphics)" başlıklı bir yazısı yayınlanmış.

Ektedir.


Çevrimdışı doMiNO

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 206
Ynt: Basic bilenler için sinclair basic 101
« Yanıtla #2 : 25 Ocak 2012, 23:19:32 »
Ref, teşekkür ederim dostum. Çok faydalı bir anlatım olmuş.

Bugüne kadar sinclair basic ile ilgili bir çalışmam olmamıştı. Merak da etmedim açıkçası. Ancak crap game competition için bana gerçekten çok faydası olacak olan bu hızlandırılmış sinclair basic dersi için teşekkür ederim. MSX basic'ten daha seksi göründü bana ilk bakışta. Bu kadar bilgi bile bi crap game hazırlamak için yeterli olacaktır ama olur da sonunculuk için yarışmak istersem senden daha fazla bilgi talep edebilirim...

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2866
  • Advanced User Simulator
    • ae unutmadan
Ynt: Basic bilenler için sinclair basic 101
« Yanıtla #3 : 25 Ocak 2012, 23:28:34 »
hay hay efendim, hay hay..

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2866
  • Advanced User Simulator
    • ae unutmadan
Ynt: Basic bilenler için sinclair basic 101
« Yanıtla #4 : 26 Ocak 2012, 16:53:20 »
spectrum'a özgü komutlardan devam edeyim,

Görüntüdeki "şeylerin" kontrolü:

ATTR komutu zx spectrum ekranındaki hücre rengini verir:
örneğin;
10 PRINT ATTR(15,10);
üstteki kod Y=15,x=10 hücresindeki rengi byte cinsinden verir. O değerin o hale gelmesindeki yapı taşlarını vereyim:
INK + (PAPER *8) + (Bright*64)+ (FLASH*128)
Bu durumda örneğin Kırmızı arkaplan üzerine parlak sarı yazı yazıyorsak:
6 (sarı) +  (2*8) (kırmızı) + (1*64) + (0*128)= 86 olacak
Tersten gitmek biraz zor, bu sebepten aradığınız renkleri önceden hesaplayıp kontrol etmek iyi olabilir:
örn. Beyaz ekran üzerindeki oyuncunun çarpmaması gereken alan kırmızı ink ile çizilmiş ise, bu durumda o alan 58 kodunda olacaktır, bu durumda
IF ATTR(y,x)=58 THEN GOTO 500
şeklinde kullanılabilir.

Bir başka komut ise SCREEN$ komutu. Bu komut da o hücre içerisindeki karakter kodunu döndürüyor.
Örneğin ekranın tepesinde SINCLAIR yazıyorsa
10 LET I$=SCREEN$(0,0)
"S" harfini döndürecektir. Bu komutta bir problem var, değişkene almadan kullanılamıyor. Yani IF SCREEN$(0,0)="S" diyemiyorsunuz.  LET I$=SCREEN$(0,0): IF i$="S" şeklinde kullanmanız gerek.


Rastgele sayılar
Sinclair basic'de rastgele sayı üreten RND komutudur. Bu komut 0 ile 1 arasında küsürlü bir rakam üretir. Genellikle bu rakamı istediğiniz bir rakamla çarparak kullanırız.
örneğin
10 BORDER RND*7: GO TO 10
ekran çerçevesini rengarenk yapar.
Oluşan rakamın küsüratlı olacağını unutmayın. Sinclair Basic default olarak floating point bir dildir. Deklare ettiğiniz tüm sayılar küsüratlıdır.

Ses üretmek:

Spectrumda iki ayrı ses komutu var. BEEP ve PLAY.
BEEP komutu spectrum'un beeperından ses üretmeye yarıyor:
10 BEEP 0.5,3
ilk parametre süre, ikinci paremetre nota oluyor. Nota değeri eksilere de iniyor. Yukarıda ise 60-70'lere gidiyor.


Diğer komut ise sadece 128K'da çalışıyor, o da PLAY komutu. AY ses çipinden ses üretmeye yarıyor:
PLAY komutu çok karışık, birsürü özelliği var, 128k kullanma klavuzuna ihtiyacınız var. Ben en basit nota üretme şeklini göstereyim:
10 PLAY "acg"
tırnak içine yazdığınız notaları peş peşe çalar. Süreleri ayarlamak için rakamları kullanabilirsiniz:
PLAY "1a5gc"
rakamlar sonraki çalınacak notaların sürelerini belirliyorlar. Bu süre 1 ile 9 arasında olabilir.

Play aynı anda üç kanal ses çalabilir. Çalınacak kanalları virgülle ayırmamız yeterlidir:
PLAY "abcdef","defgagg","agagagag"



Yukarıda PLAY komutu için oktavlar görünüyor, oktav değiştirmek için Ox kullanabliirsiniz. burada "x" oktav oluyor:
PLAY "O3acgO4acgO5acg"

Çevrimdışı witchdoktor

  • RAAT
  • Normalleşmiş Retroman
  • *
  • İleti: 757
Ynt: Basic bilenler için sinclair basic 101
« Yanıtla #5 : 26 Ocak 2012, 20:44:13 »
@Ref
Kod yazmamız için şu yorgun bedenlerimizi iyice tahrik ediyorsun yahu ;)

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2866
  • Advanced User Simulator
    • ae unutmadan
Ynt: Basic bilenler için sinclair basic 101
« Yanıtla #6 : 27 Ocak 2012, 20:24:00 »
@Ref
Kod yazmamız için şu yorgun bedenlerimizi iyice tahrik ediyorsun yahu ;)
Valla yazsanız ne şukela olur, ne kadar fazla program o kadar fazla eğlence benim için :D Kod yazmasanız bile sinclair basic'e bir bakmış olursunuz, neler var neler yok diye.  Neyse ben bir örnek program koyayım şuraya hemen:

ATTR, INKEY$, RND ve RENK komutları kullanımda.
Kod: [Seç]
10 LET e1=270: LET e2=50
20 LET px=10: LET py=21: LET pf=10: LET my=-1: LET mx=-1: LET toplam=0
30 PAPER 7: INK 0: BRIGHT 0: FLASH 0: CLS : PAPER 2: FOR x=0 TO e1: PRINT AT RND*20,RND*30;"##": NEXT x
40 BRIGHT 1: FOR x=0 TO e2: PRINT AT RND*21,RND*31;"#": NEXT x
50 PAPER 4: BRIGHT 0: PRINT AT 1,15;"E": PAPER 7
60 BORDER 2: PRINT AT py,px;"O"
70 LET i$=INKEY$
80 IF i$="" THEN GO TO 70
90 LET bx=px: LET by=py
100 IF i$="o" THEN LET mx=-1: LET my=0: LET px=px-1: IF px<1 THEN LET px=1
110 IF i$="p" THEN LET my=0: LET mx=1: LET px=px+1: IF px>30 THEN LET px=30
120 IF i$="a" THEN LET mx=0: LET my=1: LET py=py+1: IF py>20 THEN LET py=20
130 IF i$="q" THEN LET py=py-1: LET mx=0: LET my=-1: IF py<1 THEN LET py=1
140 IF i$=" " AND pf>0 THEN PRINT AT py+my,px+mx;" ": LET pf=pf-1
150 LET a=ATTR (py,px)
160 IF a=16 THEN LET px=bx: LET py=by
170 PRINT AT by,bx;" ";AT py,px;"O"
180 IF a=32 THEN GO TO 210
190 LET toplam=toplam+1
200 GO TO 70
210 BORDER 7: CLS : PRINT "Tebrikler labirentten ciktiniz!"'"Toplam hareket:";toplam
(Dikkat 140 numaralı satırda tırnak içine bir boşluk bırakın.)

Oyunun amacı QAOP ve BOŞLUK tuşunu kullanarak labirentte (E) noktasına ulaşmak. Delik açmak için 10 adet bombanız var. Açık renkli tuğlaların içinden geçebilirsiniz. Bittiğinde skorunuz görüntülenecek (daha küçük daha iyi). Yapılabilecek en iyi skor 19 dur.