AMOS

Merhaba arkadaşlar. Yine her zamanki gibi bir aradayız. Bu ayki yazımda, ilk olarak geçen ay verdiğim programların açıklamasını yapacağım. Daha sonra da kaldığımız yerden AMOS'un komutlarını açıklamaya devam edeceğim.

'HAM DEMO' programının açıklamasından başlayarak bu ayki AMOS tanıtımlarımıza başlayalım. Programın ilk satırında 320'ye 290 büyüklüğünde bir ekran açılır. Daha sonra da ekran monitor'e yerleştirilir. Bundan sonra 'cursor' kapatılır, ekran temizlenir ve renklerin yanıp sönmesi engellenir. Ekrana 'AMOS-HAM' yazısı yazıldıktan sonra, resmin çizilmesine başlanır. Burada üç tane iç içe 'for-next' döngüsü vardır. Ekranda göreceğiniz şekil burada çizilir.

'Colour B,B : Ink B : Bar 32,B* 15+32 To 288,B* 15+47' satırı ile mavi bileşeni B'ye eşit olan bir kutu çizilir. Daha sonraki döngülerde de sırayla kırmızı ve yeşil bileşenleri çizilir.

İkinci program. Mart sayısında yazdığım 'demo 2' programının benzeri. Bu program, açıklamasını gelecek ayki sayıda vereceğim 'rainbow' komutuna örnektir.

Şimdi de ekran komutlarının açıklamasına kaldığım yerden devam ediyorum. Bu sayımızda önce 'dual playfield', 'dual priority', 'screen height', 'screen width', 'screen colour', 'scin' ve 'cls' komutlarını yazacağım. Daha sonra da ekran kaydırma komutları olan 'def scroll' ve 'scroll' komutlarını anlatacağım.

KOMUT: Dual playfield KULLANILIŞ: Dual playfield e1,e2 Bu komut, AMOS'un en güçlü komutlarından biridir. Hepinizin bildiği gibi, AMOS aynı anda birden fazla ekranı gösterebilir. Fakat iki ekran üst üste geldiğinde, önde olan ekran diğerini kapatır. Bundan başka, monitör ekranının bir tarama satırında sadece bir ekran görüntülenebilir. Fakat bu 'The shadow of the beast' oyunundaki gibi, birbiri arkasında kayan ekranlar yaratılmasını engellemez. Bunu nasıl mı yapacağız? Tabii ki 'dual playfield' komutu ile! 'dual playfield' komutu, 'e1' ve 'e2' olarak belirtilen iki ekranın görüntülerini monitörde üst üste gösterir. İşin güzel yanı, bu ekranlara hala birbirinden bağımsız olarak kumanda edilebilmesidir. 'e1' ve 'e2' ekranları, daha önceden 'screen open' komutu ile tanımlanmış olmalıdır.

Ne yazık ki bu komutun da kendine göre kısıtlamaları vardır. Örneğin birleştirilen iki ekranın da aynı çözünürlükte olması gerekir. Bundan başka sadece belirli ekran kombinasyonları mümkündür. Bunlar aşağıdaki gibidir:

BURAK ÖZDEMİR 1.Ekran 2.Ekran renk sayısı renk sayısı 2 2 4 2 4 4 8 4 8 8 Sekiz'e dört ve sekiz'e sekiz'lik ekranlar sadece düşük çözünürlükte mümkündür. Bundan başka renklerin kullanımında da dikkat edilmesi gereken hususlar vardır. İki ekranın renkleri de birinci ekranın renk paletinden alınır. '0' numaralı renk saydamdır. '0' ile '7' arasındaki renkler birinci ekrana, '8' ile 15' arasındaki renkler de ikinci ekrana aittir. Örneğin ikinci ekrana çizim yapıyorsanız, 'Ink 4' komutu birinci ekranın renk paletinden '11' numaralı rengi seçer. Bu komutun kullanılışıyla ilgili bir örneği Mart sayımızda yazmıştım.

KOMUT: Dual priority KULLANILIŞ: Dual priority e1,e2 Normal olarak 'dual playfield' komutu ile birleştirilen iki ekrandan ilki, ikincisinin önünde gösterilir. 'Dual priority' komutu bu durumu tersine çevirmek içindir.

KOMUT: Screen height KULLANILIŞ: y=screen height [n] Bu komut 'n' numaralı ekranın yüksekliğini belirler. Eğer ekran numarası verilmemişse, o an aktif olan ekranın yüksekliği verilir.

KOMUT: Screen width KULLANILIŞ: g=screen width [n] Bu da 'screen height' komutu gibidir. Yalnız bu sefer ekranın genişliğini verir.

KOMUT: Screen colour KULLANILIŞ: r=screen colour [n] Bu komut, seçilen ekranda gösterilebilecek olan maksimum renk sayısını 'r' değişkenine atar.

KOMUT: Scin KULLANILIŞ: e=scin(x,y) 'scin' komutu, 'x' ve 'y' koordinatlarının hangi ekrana ait olduğunu bildirir. Burada 'x' ve 'y' değişkenleri 'hardware' koordinatları cinsindendir. Yani monitör ekranının koordinatlarıdır. Şimdi aşağıdaki kısa örneğe bakalım:

e=scin(X mouse.Y mouse)

Bu satır, 'e' değişkenine mouse'un o anda üzerinde olduğu ekranın numarasını verir.

KOMUT: Cls

KULLANILIŞ: Cls

Cls renk Cls renk x1,y1 to x2,y2 Bu komut, o an aktif olan ekranın tamamını ya da bir bölümünü silmek için kullanılır. Üç değişik kullanılış şekli vardır. Tek başına kullanıldığında, bütün ekranı siler. 'Cls renk' ile ekran silinir ve 'renk' değişkeni ile belirtilen renk ile doldurulur. Üçüncü kullanılış şeklinde ise, ekranın istenen bir bölgesi silinir ve renklendirilir.

Şimdi sıra geldi ekran kaydırma komutlarına. Daha önce hardware scrolling'in nasıl yapıldığını görmüştük. Aslında ekran içerikleri değiştirilmiyor, ekranın monitörde gösterildiği yer değiştiriliyordu. Bu sefer direkt olarak ekranın içeriği üzerinde oynama yapacağız. Buna software scrolling de denir.

AMOS yorumlayıcısı, 16'ya kadar kaydırma bölgesi tanımlanmasına izin verir. Her bölgeyi ayrı ayrı programlayabilirsiniz. Seçtiğiniz herhangi bir dikdörtgen bölgenin içerikleri yine sizin istediğiniz şekilde kaydırılabilir.

KOMUT: Def scroll KULLANILIŞ: Def scroll n,x1,y1 to x2,y2,dx,dy Bu komut, kaydıracağınız bölgeyi tanımlamak için kullanılır. 'n', bölge numarasıdır. '0' ile '15' arasında değerler alır. 'x1', 'y1', 'x2' ve 'y2' dikdörtgen bölgenin sınırlarını belirler. 'dx' ve 'dy' ise, bu bölgenin ne şekilde kaydırılacağını belirler. dx'e verilen değer pozitif ise, bölge içerisindeki alan o kadar piksel sağa, negatif ise sola doğru kayacaktır. Aynı olay, dikey hareketi tanımlayan 'dy' için de geçerlidir. Burada dikkat edilmesi gereken ve çoğunlukla hata yapılmasına sebep olan olay şudur: Tanımlanan bölgenin yeri kesinlikle değişmez. Sadece bu bölgenin içi hareket eder. Bunu birazdan aşağıda vereceğim örneği çalıştırarak görebilirsiniz.

KOMUT: Scroll KULLANILIŞ: scroll n Bu komut, 'n' numarası ile tanımlanmış olan kaydırma işlemini gerçekleştirir.

ÖRNEK PROGRAM 1: 
Rem **************************************** 
Rem ** 
** 
Rem ** 
AMIGA DÜNYASI 
** 
Rem ** 
AMOS Scroll Demo 
** 
Rem ** 
** 
Rem ** 
writtten by 
** 
Rem ** 
Burak Ozdemir 
** 
Rem** 
using AMOS 
** 
Rem ** 
** 
Rem** 
AMOS Copyright 1990 
** 
Rem ** 
Mandarin/Jawx 
** 
Rem **************************************** 
Flash Off 
Curs Off 
For 1=1 To 200 Step 10 
InkRnd(15) 
Draw 0,1 To 320,1 
Draw 1,0 To 1,200 
Next I 
For 1=1 To 2 
X=Rnd(200) 
Y=Rnd(100) 
W=Rnd(120) 
H=Rnd(100) 
DX=Rnd(4)-2 
DY=Rnd(4)-2 
Def Scroll I,X,YTo X+W,Y+H,DX,DY 
Next I 
For 1=1 To 20 
For N=l To2 
Scroll N 
Wait 5 
Next N 
Next I

Tabii AMOS'un ekran komutları bu kadarla kalmıyor. Fakat hepsini bu bölümde bitirmemiz mümkün değil. Ama yine de birkaç komut daha yazabilirim. Bunlardan ilki 'Screen copy' komutu.

KOMUT: Screen copy KULLANILIŞ:

Screen copy e1 to e2 Screen copy e1,x1,y1,x2,y2 to e2,x3,y3[,mod] Bu komut, bir ekranın bir bölümünü başka bir yere taşımak için kullanılır. Komutun birinci kullanılış şekli bir ekranın tamamını diğer bir ekrana kopyalamak içindir. Görüntü, 'e1' ekranından 'e2' ekranına kopyalanır. Bu arada ilk ekrandaki görüntünün de silinmeyeceğini unutmamak gerekir. Eğer bunu yeterli bulmuyorsanız, AMOS'un yaratıcıları daha etkili bir kullanım şeklini de mümkün kılmışlar. Bu sefer ekranın herhangi dikdörtgen bir bölümü diğer bir bölgeye taşınabilir. Üstelik isteğinize bağlı olarak belirtebileceğiniz 'mod' değişkeni ile bunu değişik şekillerde gerçekleştirmeniz mümkün. Ekim sayımızdaki 'Blitter'i tanıyor musunuz?' yazımızı okuduysanız, Blitter'in sadece hafızanın belirli bölümlerini bir yerden diğer bir yere taşımakla kalmayıp, aynı zamanda bunları birleştirebilmeyi ve bunlar üzerinde mantıksal işlemler yapabilmeyi becerdiğini de öğrenmişsinizdir. AMOS, blitter'in tüm bu özelliklerinden faydalanabilir, 'mod' parametresi, blitter'in gerçekleştirebileceği 255 değişik mantıksal işlemden herhangi biri olabilir. Bu konuda henüz çok derinlere girmeyeceğim; çünkü eğer ikili sayı sistemi veya mantıksal devreler ile aranız iyi değilse, kolay kaybolabilirsiniz. Yine de çok kullanılan birkaç modu açıklamakta yarar görüyorum. Bunlardan ilki, 'Replace' modu'dur. Bu mod'da, seçilen bölge aynen kopyalanır. Eğer 'mod' seçeneğini boş bırakmışsanız, otomatik olarak bu seçenek aktif hale geçer. Aynı olay 'mod'=192 iken de geçerlidir. Diğer bir mod, 'Invert' modudur. Bu sefer şeklin tersi kopyalanır. 'Tersi' demekle başaşağı olduğunu söylemek istemiyorum. Mantıksal olarak tersini kastediyorum. Örneğin bir piksele karşılık düşen 'bit pattern' '11011' ise, bu diğer tarafa '00100' şeklinde geçirilir. Bu seçenek için 'mod' değişkeninin değerini, '48' yapmalısınız. Bundan başka en çok kullanılan modlar 'and', 'or' ve 'xor' modlarıdır. Bunlara karşılık düşen değerler ise sırasıyla 128, 224 ve 96'dır. İşte yine bu komutun kullanılışıyla ilgili bir örnek:

ÖRNEK PROGRAM 2: 
Rem********************************************* 
Rem********************************************* 
Rem**** 
*** 
Rem****  
AMIGA DÜNYASI 
*** 
Rem**** 
*** 
Rem**** 
AMOS COPY DEMO 
*** 
Rem**** 
*** 
Rem**** 
written by Burak OZDEMİR 
*** 
Rem**** 
***
Rem**** 
using AMOS                        **** 
Rem**** 
**** 
Rem**** 
AMOS Copyright 1990                **** 
Rem**** 
**** 
Rem**** 
Mandarin Software                    **** 
Rem**** 
**** 
Rem**** 
  **** 
Rem****************** ************* ************ 
Screen Open 0,320,20(),32,Lowres 
Flash Off 
Load Iff "df0:resim" 
Rem ****** kopyalanacak yer burada seçilir ******* 
Repeat 
Until Mouse Click=l 
XS=X Screen(0,X Mouse) 
YS=Y Scrccn((),Y Mouse) 
Gr Writing 2
Repeat 
X=X Screen(0,X Mouse) 
Y=Y Screen(0,Y Mouse) 
Box XS,YS To X,Y 
BoxXS,YSToX,Y 
Until Mouse Click=1 
DX=Abs(XS-X) 
DY=Abs(YS-Y) 
Screen Open 1,320,200,32,Lowres 
Get Palette 0
Flash OH 
For 1=0 To 200 Step 5 
Draw 1,0 To 1,200 
Draw 0,1 To 320,1 
Next I 
Screen To Front 1 
Repeat 
PX=X Screen(1,X Mouse) 
PY=YScrecn(l,Y Mouse) 
Until Mouse Click=l 
Input "mod= ";M 
Screen Copy O.XS,YS,XS+DX,YS+DY To 1,PX,PY,M 
Screen 1 
Repeat 
For 1=0 To I 
Screen To Front I 
Wait 50 
Next I 
Until Mouse Click=l

Herhalde bu program gözünüze pek yabancı gelmedi. Bunun sebebi temelde geçen ay yazdığım demo programlarından birine benzemesi. O programda da 'screen copy' komutunu kullanmıştım. Bu seferki program, biraz daha farklı. İlk olarak yine yüklenen resmin neresinin kopyalanacağını belirliyorsunuz. Bu kısımda hiçbir yenilik yok. Bundan sonra yeni bir ekran açılır ve bu ekrana basit bir pattern çizilir. Bunu, değişik kopyalama modlarının birbirinden farkını görmeniz için yaptım. Seçtiğiniz şeklin kopyalanacağı yeri belirlemek için, resmin sol üst köşesinin bulunacağı noktaya mouse'u getirip kliklemeniz yeterli. Bunu yaptıktan sonra program size kopyalama modunu soruyor. Değişik modlar girerek, birbirinden ilginç efektler elde etmeniz mümkün. Her bilgiyi verdikten sonra kopyalama işlemi gerçekleşir (İşlem tamam!). Resimler arasındaki farkı görebilmeniz için her iki ekran da birer saniye ara ile gösterilir. Programı durdurmak için bir süre mouse'un sol tuşuna basmanız yeterli.

'Screen copy' ile kopyaladığınız bölgelerin büyüklüğünü değiştiremezsiniz. Ancak bunu 'zoom' komutuyla yapmanız mümkün.

KOMUT: Zoom KULLANILIŞ: zoom e1,x1,y1,x2,y2 to e2,x3,y3,x4,y4 Bu sefer de 'e1,x1,y1,x2,y2' ve 'e2' parametreleri deminki gibidir. 'x3,y3,x4' ve 'y4' parametreleri şeklin yeni boyutlarını belirler. Şimdi tekrar yukarıdaki gibi bir örnek veriyorum. Programın nasıl çalıştığını herhalde anlayabilirsiniz.

ÖRNEK PROGRAM 3:

Rem******************************************* 
Rem******************************************* 
Rem**** 
**** 
Rem**** 
AMIGA DÜNYASI                       **** 
Rem**** 
**** 
Rem **** 
AMOS ZOOM DEMO             **** 
Rem**** 
**** 
Rem**** 
written by Burak OZDEMIR          **** 
Rem**** 
**** 
Rem****                 using AMOS                                **** 
Rem**** 
**** 
Rem****              AMOS Copyright 1990                **** 
Rem **** 
Mandarin Software                     **** 
Rem**** 
**** 
Rem******************************************* 
Screen Open (U20.2(X).32.Lowres 
Flash Off 
Load Iff "d0:resim" 
Repeat 
Until Mouse Click=l 
XSI=XSercen(0,X Mouse) 
YSI=Y Sereen(0.Y Mouse) 
Gr Writing 2 
Repeat 
Xl=XScreen(0,X Mouse) 
Yl=YScreen(0.Y Mouse) 
Box XS1,YS1 To Xl,Y1 
Box XS1,YSl ToX1,Yl 
Until Mouse Click=l 
DXI=Abs(XS1-X1) 
DYl=Abs(YS1-Y1) 
Screen Open 1.320.200.32.Lowres 
Get Palette 0 
Flash Off 
Screen To Front I 
Screen I 
Repeat 
Until Mouse Click=l 
XS2=XScreen(l.X Mouse) 
YS2=Y Screen! 1 .Y Mouse) 
Gr Writing 2 
Repeat 
X2=XScreen(l.X Mouse) 
Y2=Y Screen( 1 .Y Mouse)
Box XS2,YS2 To X2,Y2 
Box XS2,YS2 To X2,Y2 
Until Mouse Click=l 
DX2=Abs(XS2-X2) 
DY2=Abs(YS2-Y2) 
Zoom 0,XS1,YS1,XS1+DX1,YS1,DY1 To 1 ,XS2,YS2,XS2+DX2,YS2+DY2 
Repeat 
For 1=0 To 1 
Screen To Front I 
Wait 50 
Next I 
Until Mouse Click=l

Şu ana kadar bir sürü ekran komutu gördük. Fakat bunların hiçbiri, ekran renklerine direkt olarak kumanda etmiyordu. Gelin şimdi AMOS dünyamızı biraz daha renklendirelim ve ekran renklerinin ayarlanmasına geçelim.

Daha önce 'colour' komutunu görmüştük. Şimdi ilk olarak daha kuvvetli bir komut olan 'palette' komutunu göreceğiz. Bunu sizi bir sürü satırı tekrarlamak zahmetinden kurtaracak olan 'Default palette' ve 'Get palette' komutları izleyecek.

KOMUT: Palette KULLANILIŞ: palette renk listesi 'colour' komutu, teker teker renkleri ayarlamak için kullanılıyordu, 'palette' ise, bir ekranda kullanılan renklerin hepsini veya bir kısmını tek bir seferde ayarlamak içindir. Aşağıdaki örnek satırlarda bunu daha iyi anlayabilirsiniz:

Palette $ABC,$FFF,$B08 ilk üç rengi set eder. Palette $AAA,$BCC,$007,$011 ise '0,1,5' ve '7' numaralı renkleri değiştirir. Diğerleri aynı kalır.

KOMUT: Default palette KULLANILIŞ: Default palette renk listesi Eğer birden fazla ekran açacaksanız ve bunların hepsinin aynı renklere sahip olmalarını arzu ediyorsanız, bunu 'default palette' komutu ile gerçekleştirebilirsiniz. Kullanımı az önceki gibidir. Farkı fiyatı değildir, yaptığı iştir. Bu komutu kullandıktan sonra açacağınız bütün ekranlar aynı renklere sahip olur.

KOMUT: Get palette KULLANILIŞ: Get palette n[,maske] Bu komut sayesinde bir ekranın renklerini diğer bir ekranda da kullanabilirsiniz. İsteğe bağlı olarak tanımlayabileceğiniz bir maske ile renklerin sadece bir kısmını almak mümkündür. İleride bununla ilgili daha fazla bilgi vereceğim. Konuyla ilgili örnek vermiyorum, çünkü daha evvel yazdığım programların hemen hemen hepsinde kullandığım bir komut. Hiçbir sorun çıkarmayacağından eminim.

Artık ekranların renklerini istediğimiz gibi ayarlayabiliyoruz. Ama daha bitmedi. Bunlar sadece normal komutlar. Daha sırada Deluxe Paint'in 'cycle' efektlerinden tutun da, çok az rastlanan özel renk değiştirme komutlarına kadar bir sürü komutlarımız var.

Aşağıda bunlardan biriyle ilgili bir örnek veriyorum. Bu programa AMOS disketlerimin 'Manual' directory'sinde rastladım. Fakat ya bendeki program bozuktu ya da program hazırlanırken bazı eksiklikler yapılmıştı ki, program pek iyi bir sonuç vermiyordu. Bunun üzerine gerekli değişiklikleri yaptım. Açıklamasını yine gelecek ay vereceğim.

ÖRNEK PROGRAM 4:

Rem******************************************* 
Rem******************************************* 
Rem**** 
**** 
Rem**** 
AMIGA DÜNYASI 
**** 
Rem**** 
AMOS APPEAR DEMO 
**** 
Rem**** 
**** 
Rem****       Modified by Burak OZDEMIR 
**** 
Rem**** 
**** 
Rem**** 
using AMOS 
**** 
Rem**** 
**** 
Rem**** 
AMOS Copyright 1990 
**** 
Rem**** 
**** 
Rem**** 
Mandarin Software 
**** 
Rem**** 
**** 
Rem******************************************* 
Rem******************************************* 
Screen Open 1,320,200,32,Lowres 
Load Iff "df0:resim" 
If Screen Width>600 Then REZ=Hires Else REZ=Lowres 
Screen Open 0.Screen Width,Screen Height,Screen Colour,REZ 
Screen Open 2,320,50,2,Lowres 
Screen Display 2„250„50 
Screen Open 3,320,10,2,Lowres 
Screen Display 3„40„ 10 
Screen 3 : Colour 1 ,$0: Curs Off: Cls: Locate 0,0: Centre "Appear" 
Set Rainbow 0,1,16;'(1,2,16)","( 1,2,16)", "(1,2,16)" : Rainbow 0,0,36,10 
Screen 0 : Screen To Front 0 : Get Palette(1): Screen To Front 2 
Screen To Front 3 
Flash Off 
Rem Main loop 
Do 
Screen 2 : Input "effekt ";E 
If E>0 
Cls : Screen 0 : Cls 
Appear 1 To 0,E 
End If 
Loop

Gelecek sayıya kadar hoşçakalın. Daha yeni komutlar ve programlarla buluşmak üzere...