Amiga Dünyası sayı 19, sayfa 17

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 17

Amiga'da, C ve grafik iyi bir ikili oluşturuyor. İsterseniz bunu bir inceleyelim ve gerçekleştirelim. Bu ayki konumuz bu olsun ne dersiniz?

Programımız, vermiş olduğumuz bir yazı dizisini, ekranın belirli bir satırında, pixel pixel scroll yaparak kaydırmak olsun. Her programcının ilk demosu aşağı yukarı böyle başlar. İçinizde bunu denemek isteyenlerin olduğunu tahmin ediyorum. Ayrıca bu program, sizler için iyi bir grafik alıştırması olacak. Daha önce görmüş olduğunuz ve zevkle seyrettiğiniz intro ve demolardaki kayan yazıların basit bir örneği olan programımızı şöyle bir gözden geçirelim:

/* Amiga Dunyasi */ /* Program : Cenker Ozkurt */

#include <stdio.h> #ınclude <exec/types.h> #include <graphics/gfxbase.h> #include <intuition/intuitionbase.h>

struct NewScreen ns={ 0,0,320,256,5,0,1,0,CUSTOMSCREEN,0,0,0,0 };

struct RastPort *rp; struct Screen *scr; struct GfxBase *GfxBase; struct IntuitionBase *IntuitionBase;

int f,s; UBYTE*m=0xbfe001; char *string="Amiga Dunyasi'dan. Yazan: Cenker Ozkurt. ";

main()

{ IntuitionBase=(struct IntuitionBase *) OpenLibrary( "intuition.library",0); if(IntuitionBase==NULL) {

printf("intuition library error!\n"); return(0);- } GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0); if(GfxBase==NULL) {

printf("graphics library error!\n"); CloseLibrary( IntuitionBase); return(0);

} scr=(struct Screen *)OpenScreen(&ns); if(scr==NULL) {

printf( "screen error!\n"); CloseLibrary(GfxBase); CloseLibrary( IntuitionBase); return(0); } rp=&scr->RastPort; /* Screen rastport */

SetAPen(rp,1L); /* Kalem rengi */ while( 1) { /* Sonsuz dongu */

for(f=0;f<strlen(string);f++) { /* Yazi dizisi kadar */

Move(rp,310L, 100); /* Yazi koordinati */ Text(rp,string+f, 1L); /* Bir harf yaziliyor */ for(s=0;s<9;s++) j /* 8 pixel sola kaydirma */ WaitTOF(); /* Ekran taramasini bekle */ /* 1 pixel sola kaydır */ ScrollRaster(rp, 1,0,0,90,320,110); WaitTOF(); /* Yazi satirini kopyala */ ClipBlit(rp,0,90,rp,0,150,320,20,0xc0); /* Sol mouse tusu kontrolü */ if(*m==188) goto quit; } }

A} quit: CloseScreen(scr); CloseLibrary(GfxBase); CloseLibrary(Intuitionfiase); return( I); } Evet şimdi programımızı compile edelim. İlk satırlardaki #include komutları;

#include <stdio.h> #include <exec/types.h> #include <graphics/gfxbase.h> #include <intuition/intuitionbase.h> standart input/output, veri tipleri, grafik ve intuition macrolarını tanımlıyorlar.

struct NewScreen ns={ 0,0,320,256,5,0,1,0,CUSTOMSCREEN,0,0,0,0 }; komutlarıyla, ekran yapı değişkenine, bizim ekranımızın özelliklerini veriyoruz. 320x256 ekran boyu, 5 bitplane sayısı, CUSTOMSCREEN Workbench ekranına bağımsız olduğumuzu belirtiyor.

struct RastPort *rp; struct Screen *scr; struct GfxBase *GfxBase; struct IntuitionBase *IntuitionBase; RastPort, ekran özelliklerini taşıyan önemli bir yapı değişkenimiz. Bu değişken vasıtasıyla, diğer grafik komutları, çalışacakları ekranı tanıyorlar.

Screen, ekranımızın bütün özelliklerini taşıyan yapı değişken adresi.

GfxBase ve IntuitionBase, grafik ve intuition library adresinin saklandığı değişkenleri oluşturuyor.

Daha sonra programda kullanacağımız diğer değişkenler tanımlanıyor. Burada string değişkeni, bizim yazı dizimizin saklandığı değişken oluyor.

main() ana fonksiyonu içerisinde library'ler açılıyor ve kontrol ediliyorlar. Eğer açılamazlarsa, hata mesajı ile programdan geri çıkılıyor.

Sonraki satırlarda ana programa giriyoruz. Burada iç içe üç tane döngü bulunuyor. Birinci while döngüsü, sonsuz döngüyü oluşturuyor. Sol mouse tuşunu kontrol ederek bu döngüden çıkıyoruz. İkinci döngü, yazılacak olan yazı dizisi kadar devam ediyor. Bu arada,

Move(rp, 310L, 100); /* Yazi koordinati */ Text(rp, string+i, 1L); /* Bir harf yaziliyor */ ile, ekranda vermiş olduğumuz pozisyona yazı karakterimizi yazıyoruz. Daha sonra üçüncü döngüde, sekiz pixel kadar sola kaydırma yapılıyor. Burada ise, WaitTOF();

ScrollRaster(rp, 1, 0, 0, 90, 320, 110); WaitTOF(); ClipBlit(rp, 0, 90, rp, 0, 150, 320, 20, 0xc0); satırları bulunuyor. Amiga'da, ekran satır taramasının tamamlanıp tamamlanmadığını kontrol eden bir komut mevcut, WaitTOF(). Bu komut, daha çok Blitter kullanan komut işlemlerinde gerekiyor. Aksi takdirde, mesela bizim programımızda scroll sırasında bir titreme oluşuyor. Çünkü tarama tamamlanmadan yapılan bir kaydırma işlemi, senkron bozukluğuna sebep olabiliyor. Bu nedenle bu tür komutların özellikle başına WaitTOF komutunu yerleştirmek bozuklukları engelleyebiliyor.

Klavyeyle gezinmek için ← ve → tuşları.