Bu sayfadaki yazılar
Sayfanın metni
Sayfa 42
Program ScreenShuffler;
(Erhan OZTOP & F.Kagan GURKAY- NAK)
uses intuition; const MaxNScr - 41;
type ScrArr — array |1..MaxNScr|) of p screen;
var win : p window; scr :p screen; Pack : SerArr; : integer; begin win :— Open Window $0103,0,0, SCREEN 0,0);
Wscreen;
ifi >> MaxNScrt1 then Halt(5); packli)| :— ser; :— ScrA.NextScreen; Until ser — nil;
Forj:—1toido
begin ser :— MoveScreen(scr,0,k-scrA.topedge);
ScreenToFront(scr); k:— k4*ScrA.Barheight43; if k then k :— 0; end; end.
Hayat ne kadar güzel değil mi? Kullanacağımızı belirtmek. Bu library, Kick Pascal'da tanımlandığından kolayca USES yardımı ile sisteme bağlanıyoruz. Bu library, gerekli tüm include dosyalarını da otomatikman bağlayacaktır. Ekranları bir dizi kullanarak sıralamak istiyoruz. Belki lazım olur diye bunu tip olarak tanımlıyoruz. ARRAY ifadesinde kullandığımız sabit ile, kaç ekran düzenleyebileceğimizi belirtiyoruz (Geleneklerimize bakarak 41 tavanını kullandık.). Daha sonra da birkaç değişken tanımlıyoruz. Hatırlayın ekranların özelliklerine erişebilmek için ilk olarak onlara ait bir pointer bulmamız şart. İlerliyoruz. Bir pencere açıyoruz. Window tanımında Workbench ekranının adresi yer alır (WSCREEN). Bu sayede bir ekrana el atmış oluruz. Gerisi son derece kolay. Yardımı ile tüm ekranları bir dolaşmak. Ekranların bittiğini NextScreen'in Nil olması ile anlayabiliyoruz. Repeat until döngüsü, bu Nil'i sezene dek devam edecektir. Döngü içinde tüm ekran başlangıç adreslerini bir dizide topluyoruz. Hani olmaz ama, 41'den fazla ekran vardır diye de kontrol ediyoruz. Evet böyle bir durum varsa, Halt(5) ile program hemen DOS'a geri dönecek ve 5 hata kodunu verecektir.
Döngünün sonunda i değişkeni toplam ekran sayısını ve PACK dizisi de bu sayıda pointer'i barındıracaktır. Yeni bir döngü ile bu ekranları sıra ile ekrana yazalım. Ekranı hareket ettirebilmek için MoveScreen Library komutunu kullanıyoruz. Bu komut, belirtilen ekranı x (sözde) ve y düzlemlerinde kaydırabiliyor. Kaydırma için ise, kayma miktarı belirtilmeli. Sorun ekran tepelerinin aynı kalınlıkta olmasının gerekmemesi. Bu yüzden k değişkeni ile o an yazılacak olan ekranın y koordinatını belirliyoruz. Bu — eski k değeri ekran tepe kalınlığı kadar pixel (Anlaşılırlık için). Ancak MoveScreen'de fark belirtmek gerekiyor. Bu ama ilk olarak ekranın o anki konumu bulunuyor ve gitmesi gereken yerle arasındaki fark alınıyor. Ekran kaydıktan sonra bu ekran ScreenToFront Intuition emri ile en öne alınıyor. Bu şekilde tüm ekranlar üst üste yazılıyorlar. k değerinin 200'ü aşması durumunda tekrar sıfırlanıyor ki, ekranlar aşağıda kaybolacaklarına öbürlerinin üzerine yansınlar. Programı geliştirmek mümkün: Mesela kolayca bir ekran açıcı yapılabilir veya ekranların özellikleri sıralanabilir. Tüm bunlar, sizin hayal gücünüze bakarak gelişecektir. Bu adımları atarak, bilgisayar programlamanın aslında o kadar öcü bir şey olmadığını, basit adımlarla son derece iyi programlar yapılabileceğini anlamanız, beni son derece sevindirecek. Herkese bol güneşli ve keyifli bir yaz tatili dileyeyim (Tatil diye tembellik etmeyin bakalım).
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 43
C'de önemli olan diğer bir nokta da, esnek alt rutinlerin hazırlanmasıdır. Böylece her yeni bir program hazırlanışında eski rutinlerden de yararlanılır ve programın kısa sürede bitmesi sağlanır. Ayrıca sık sık karşınıza çıkan problemlerle yeniden uğraşmak zorunda kalmazsınız ve kalan zamanı yeni şeyler keşfetmek için kullanabilirsiniz. Bu olayı modüler çalışma olarak tarif etmek de mümkün. Modüler çalışma C'nin getirdiği avantajlardan en büyüğüdür. Bu ayki konumuzu da kısaca açıkladıktan sonra, ilgili örneklere geçebiliriz. İlk olarak, aşağıda hazırlamış olduğum rutinleri yazdıktan sonra bir sefer derleyin. Derleme sonucunda oluşan, uzantısı '.o' olan dosyayı disketinize saklayın. Böylece programı her seferinde derlemenize gerek kalmaz ve zamandan oldukça fazla tasarruf etmiş olursunuz. Buna benzer library'leri kendiniz de oluşturup bir diskette saklayabilirsiniz. Bu library'ler sayesinde program yazmak kolaylaşacaktır. Şimdi örneğimizi bir inceleyelim;
Pa by CENKER OZKURT */ #include <stdio.h> #include #include <graphics/gfxbase.h> #include <intuition/intuitionbase.h> #include <libraries/dos.h> #include <jiff.h>
struct GfxBase *GfxBase; struct DosBase *DosBase; struct İntuitionBase *IntuitionBase; struct ILBM info *info; struct NewScreen scr—(0,0,0,0,0,0,1,NULL, CUSTOMSCREEN,NULL, NULL,NULL );
/*-Screen Structures-*/ struct RastPort *scr rastport|51; struct ViewPort *scr viewport|51; struct Screen e
openlibrary() ionBasezOpenl ibrary("intuition.lib- ( printf("İntuition Error!..."); doselibrary();
| printf('Graphics closelibrary();
ral
&&Ğ
1 if(DosBase) | printf("Dos Error!
/* OK! */
if(DosBase) CloseLibrary(DosBase); CloseLibrary(Intuitioı se); aa
s. rastport(s) Ss; s viewport(s) int s;
opensereen(s,maxx,maxy,color)
int s; /* Screen number */ int color; /* Screen color number */ int maxx,maxy; /* Screen sizes */
int plane; switch(color) (| case 2:
12)) ser. 2001
( ser. ViewModı
ser P* OK! */
closescreen(s)
ints; — /* Screen number */
!
serfront(s) ints; — /* Screen number */
een ToFront(screen|s));
bist #6,Sbfe001
bne.s İm add.
waitmouse()
asm loopl:btst#6,$bfe001 bneloopl #endasm
waitkey()
int a,b; unsigned char *key-0xbfec0l;
a-*tkey; while(a:
plot(s,x,y) int s; Screen number */ intx; — /* x coordinates */ yı /* yeoordinates */
Movef(scer rastportls|,x,y):
ints; /* Screen number */ int x,y; /* Start coordinates */ /* Stop coordinates */
Movefser. rastportls),x,y); Bana
int Screen number */
Mil