Bu sayfadaki yazılar
Sayfanın metni
Sayfa 35
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 34
AMOS:
Merhaba! Ne yazık ki güzelim yaz bitti. Yaklaşan kışla birlikte hayatın tüm kötü yönleri de yaşamımızı işgal etmeye başlıyor. Okullar açıldı. Her sabah mavi takım elbise ile okullarına koşan lise halkı yine saçlarını kısalttı. Benim gibi üniversiteli insanlar ise kayıt yenileme gibi ızdırap verici işlerle uğraşmak zorunda. Havalar ise bunalım takılıyor. Bir saat sıcak, yarım saat soğuk, on salise fırtınalı geçiyor. Ne giyeceğimi şaşırdım ve sonunda hasta oldum. Bütün bu berbat şartlara rağmen, kasım ayında Amos Pro.'nuz yine karşınızda. 6. sayıda yazmaya başladığımız EFEKT inatla sürmekte. Bu sayıda programa yeni efektler eklendi. Artık, program ikonlarının tamamı çalışıyor. Şimdiden dört efekt hazır, aralık ayında ise program tamamlanacak. Efekt göndermek isteyenler acele etseler iyi olur. Bu sayıda EFEKT'in geniş bir açıklamasına yer vereceğim. Kullanımından, program içindeki rutinlerin açıklamasına kadar her şeyi açıklayacağım. İşte EFEKT. Program listesi global değişkenlerin tanımlanması ve değişkenlere ait açıklamalar ile başlıyor. İlk çalışan procedure ise İNİTPROG. Bu rutin içinde, global değişkenlerin ilk değer atamaları yapılmakta. Hazır GLOBAL değişkenlerden bahsederken, bilmeyenler için bu komutu açıklamak istiyorum. Amos'ta, herhangi bir procedure içinde tanımlanan bir değişken, diğer bir procedure'e sıçrandığında değerini kaybeder. Global tanımlanan değişkenler ise tüm procedure'ler içinde değerlerini kaybetmeden kullanılabilen değişkenlerdir. Değişken tanımlamalarından sonra programa ait ekran tanımlamaları gelmekte. Bu rutin içinde daha önce açıklamadığım tek komut Set Text. Komut, Text komutu ile yazılan yazıların, yazım stilini ayarlamakta kullanılır. Kullanımı, Set Text n şeklindedir. N parametresine verilebilecek değerler ve karşılıkları şöyle sıralanır.
N Stil 0 Plain (Normal) 1 Underline 2 Bold 4 Italic
Bu yazım tiplerinin yanında, örneğin Italic ve Bold yazmak için N değerine, Italic ve Bold tiplerinin kod toplamları yazılır. Yani 'Set Text 6' yazdığınızda, yazı tipi italik ve bold olacaktır. Diğer karışım türlerini de elde etmek için kod toplamlarını parametre olarak vermeniz gerekir. Ekran tanımlamaları bittikten sonra İNİTPROG rutini, İNİTİKON ve BASIKON rutinlerini çağırmakta. İNİTİKON, program içinde kullanılan ikonların tanımlandığı, BASIKON ise ikonların ekrana basıldığı rutindir. İkon tanımlamaları, İKONT(), İKONB() ve İKONCOL() değişkenlerinde saklanmaktadır. İKONT() içinde, ikonun sol üst köşesinin X ve Y koordinatları, İKONB() içinde, sağ alt köşenin X ve Y koordinatları, İKONTEX$() içinde, ikon üzerine basılacak yazı ve İKONCOL içinde de yazının rengi verilmekte. Data satırlarını incelediğinizde ikon isimleri tanımlanırken bazı isimlerin başına '*' işaretinin konulduğunu göreceksiniz. Bu işaret, konulduğu ikonun kullanıcı tarafından seçilmesini engeller. Bu yüzden, efekt başlıklarının yazılı olduğu ikonlar programda '*' ile tanımlanmıştır. BASIKON rutini ise SHADEBOX rutini yardımıyla ikonları ekrana basar. SHADEBOX parametrelerini rutin içindeki açıklamalardan öğrenebilirsiniz. Rutin içerisinde kullanılan Text fonksiyonu aktif fontla yazılan bir yazının kaç piksel uzunluğunda olduğunu bulur. Text Base fonksiyonu ise fontun y uzunluğunu verir. Bu iki komut yardımıyla ikon yazısı, ikona ortalanarak basılır.
INITPROG rutini çalıştıktan sonra, ana döngünün yazılı olduğu MAIN rutini çalıştırılır. Mouse kontrolü ve basılan ikona göre dallanma işlemleri bu rutin içinde yapılır. Sıra programın kullandığı fonksiyonlara geldi. İlk fonksiyon, LODIFF.
Fonksiyon FSEL$ komutu yardımıyla kullanıcıdan IFF resim seçmesini bekler. Ve seçilen resmi yükler. FSEL$ komutunun kullanımı ise şu şekildedir.
FSEL$(drv$,dos$,tit1$,tit2$)
Drv$, dosyanın seçileceği öncelikli directory veya sürücü ismi. Dos$, bu parametre ile kullanıcının belli isim tipinde dosyaları seçmesini sağlayabilirsiniz. Yani '*.IFF' parametre olarak verirseniz sadece .IFF dosyaları listelenir. Tit1$, dosya seçim penceresinin ilk satırına bu parametreyle tanımlanan yazı basılır. Tit2$, pencerenin ikinci satırına yazılacak yazı. FSEL$() komutu kendi açtığı pencere içinde kullanıcıdan dosya ismini alır ve directory ismiyle birlikte geri gönderir. Kullanıcı herhangi bir dosya seçmez ise FSEL$() komutu geriye boş string değeri (NULL) gönderir. Program içinde FILE$ değişkeni ile kullanıcının seçtiği IFF resmin ismi tutulur. LODIFF rutini seçilen resmi dört nolu ekrana yükler ve SCRES rutinini çalıştırarak yüklenen resimle ilgili tanımlamaları okur. Burada SCRES rutinini açıklamak gereği duyuyorum. Rutinin ilk satırında Screen Base komutunu göreceksiniz. Screen Base, açılan ekranla ilgili tanımlamaların tutulduğu hafıza adresini geri gönderir. Bu adresten 72 byte ilerde, EFEKT programının ihtiyacı olan değerlerin saklandığı bölge başlar. M=Peek(A) komutu yardımıyla M değişkeninin içine A ile adresi belirtilen WORD okunur. Bu word'ün 15. bit'i Hires, 11. bit'i Ham, 2. bit'i Lace modunu aktif hale getirir. Yani açılan ekran (ki bu yüklenen IFF'in konulduğu ekrandır) bu modlardan hangisini destekliyorsa, o moda ait bit 1 değerini alacaktır. BTST komutu yardımıyla bu bitler test edilir ve yüklenen resim hangi modda çizildiği bulunur. Bu kadar derine inmişken BTST komutunu da açıklayayım. BTST(bitno,dgr) şeklinde kullanılır. Ve dgr ile belirtilen değer içinden bitno ile belirtilen bit'in 1 olup olmadığını kontrol eder. Umarım yeterince açıklayabilmişimdir. Bu rutin çalıştıktan sonra LODIFF rutini ekran düzenlemelerini yapar. Ve TMPSCR rutinini çalıştırır. Bu rutin 4 nolu ekranla aynı tanımlamalara sahip, 5 nolu ekran açar. Daha sonra LODIFF rutini içinde 4 nolu ekran 5 nolu ekrana kopyalanır. 5 nolu ekranın açılma sebebi, herhangi bir işlem öncesinde 4 nolu ekranın kopyasını almaktır. UNDO ikonu seçildiğinde ise 5 nolu ekran 4 nolu ekrana kopyalanır. Bu sayede en son yapılan işlem iptal edilir. SAVEDIFF rutini de tahmin edeceğiniz gibi 4 nolu ekrandaki resmi diske saklar. Saklamak işlemi sırasında yine FSEL$() komutundan yararlanılır. RULO ve FLOOD henüz program tarafından kullanılmayan rutinler. SCOPY Y, rutini grafik üzerinde efekt yapan ilk rutin. Bu sayıda ilk kez karşılaştığınız bu rutin, parametreleri kullanıcı tarafından verilen sinüs tablosuna göre ekranı büker. Kullanıcıdan parametre okuyan fonksiyon ise GETSINPAR rutini. Rutine parametre olarak axis y veya axis x terimlerini gönderiyorsunuz. Gönderilen terimlere göre, SCOPY Y veya SCOPY X rutinlerine değer okunuyor. Okunan değerler global tanımlanan PARSINY() ve PARSINX() dimension'larında saklanmakta. GETSINPAR rutini, parametre okumak için 2 nolu ekranı kullanıyor. Ekran tanımlamaları ve palet değişiklikleri yabancı olmadığınız konular. Ekrana çıkan pencereden 5 farklı değeri girmeniz mümkün. Bunlar; ALT SINIR, UST SINIR, BAŞLANGIÇ, ARTIŞ ve PİXEL DERİNLİĞİ. Bu değerler sırayla, sinüs tablosunun ilk açısı, tablonun son açısı, ekran bükme işleminin başlayacağı açı, her adımda kaç açı ilerleneceği ve ekranın en fazla kaç piksel itileceğini belirlemekte. Örneğin, Alt Sınır'a 0, Üst Sınır'a 360, Başlangıç'a 180, Artış'a 5 ve Piksel Derinliği'ne 10 verecek olursanız, rutin 0 ile 360 arasında bir tablo üretir. Ve bükme işlemi (SCOPY Y veya SCOPY X işlemleri) 180 dereceden başlayıp ve 5'er 5'er artarak 360'a kadar gider. Açı değeri 360'ı geçince, 0 dereceye dönülür ve buradan itibaren işlem devam ettirilir. Girdiğiniz bu değerlere göre, ekranın tamamına bükme işlemi uygulanır. Açılan pencerede, henüz herhangi bir işlevi olmayan GRAB ikonu bulunmakta. Bu ikon sayesinde, işlemleri ekranda seçeceğiniz bir alana uygulayabileceksiniz. SCOPY X rutini de SCOPY Y gibi GETPARSIN rutininden yararlanmakta. Çalışma prensipleri her ikisinde de aynı. SCOPY Y rutininden farklı olarak bükme işlemi X ekseninde uygulanmakta. Üçüncü efekt ise BULANIK1. Geçen sayıda yayınlanan bu rutin iki farklı şekilde çalışıyor. İlki, Pixel Derinliğinin verildiği tanımlama kısmı. Tanımlama yapabilmek için ikonunun, sağ tuş ile seçilmesi gerekiyor. Pixel derinliği, GETVAL rutini tarafından alınmakta. GETVAL rutinine parametre olarak pencere başlığı, default değer ve kaç hanelik sayı alınacağı verilmekte. Bu rutin sadece BULANIK1 veya BULANIK2 rutinlerine değil istenilen herhangi bir rutine sayı okumakta kullanılabilir. Alınan değer End Proc DEGER$ satırı kullanılarak geri gönderilmekte. Amos'ta yazılan herhangi bir procedure'nin değer gönderebilmesi için End Proc komutundan sonra parantez içinde geri gönderilecek değeri verilmeli. Geri gönderilen değerin cinsine göre PARAM$, PARAM veya PARAM# değişkenlerine bu değer atılır. BULANIK1 rutininde GETVAL satırından sonra PİXKAY=Val(Param$) komutuna, Pixkay değişkenine kullanıcının girdiği değer atılır. Rutinin efekt kısmı ise, kullanıcıdan alınan piksel derinliğine göre resmin her satırının rastgele kaydırılmasından ibaret. Örneğin piksel derinliği 20 verildiyse, her satır -20 ile 20 arasında itilmekte. BULANIK2 efekti ise ilk kez bu ay yayınlanan efektlerden biri. BULANIK1 rutininin X ekseninde yaptığı işlemi Y ekseninde gerçekleştirmekte. Bu iki rutinin de UĞUR YILDIRIM tarafından yazıldığını bir kez daha belirtmek istiyorum. Ekranında bulunan en son ikonda, ekranın sağ üst köşesindeki ikon. İkonun üzerine bastığınızda resim ekranı ön plana geçer. Mouse tuşuna bir kez daha kliklediğinizde ise ikon ekranı yeniden ön plana çıkar. Program içinde kullanılan ve açıklayacağım son rutin de HATA procedure'ı. Rutin kullanıcıya mesaj vermekte veya bir işlemi onaylatmakta kullanılır. İki adet parametre ile çalışır. İlki yazılacak mesaj, ikincisi ise mesaj ekranına basılacak gadget sayısı. Eğer bir gadget basarsanız, gadget Ok yazısıyla ekrana ortalanarak basılır, eğer iki gadget basacak olursanız, ilki Ok ikincisi ise Vazgeç yazısıyla ekranda belirecektir. Kullanıcı çıkan gadgetlardan hangisini seçerse, seçilen gadget'a göre 1 veya 2 geri gönderilir. Program listesi bu kadar. Eksik kalan rutinleri program içinde kullandıkça açıklayacağım. Anlayamadığınız bir rutin varsa dergiyi arayıp veya mektup yazıp cevap alabilirsiniz. Gelecek ay yine birlikte olacağız. Hoşçakalın. Bu arada benimle bağlantı kurmak isteyen ve problemi çok acil çözüm gerektirmeyenlere telefon etmektense mektup yazmalarını tavsiye ederim (genelde dergide bulunmuyorum). Fakat probleminiz acilse dergideki diğer insanlar da sizinle ilgilenecektir. Mektup yazmak isteyenler için adresimi vermek istiyorum. Ayrıca mektupların üstüne AMOS Köşesi ibaresini bulundurursanız bana ulaşması daha çabuk olur.