Amiga Dünyası sayı 19, sayfa 18

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 18

Bir sonraki satırdaki ScrollRaster, isminden de anlaşılacağı gibi, herhangi bir yöne, herhangi bir bloğu kaydırmaya yarıyor. Oldukça kullanışlı bir komut. Biz de zaten kullandık! Ayrıca bu komut, işlemlerini blitter yardımıyla yapıyor. Kullanımı şöyle:

struct RastPort *rastport; int dx,dy,minx,miny,maxx,maxy;

ScrollRaster(rastport,dx,dy,minx,miny,maxx,maxy); Burada dx ve dy kaydırılacak olan yönün, pixel olarak kaydırma miktarını belirtiyor. dx pozitif bir sayı ise, sola, negatif ise sağa kaydırmaya sebep oluyor. dy pozitif bir sayı ise yukarı, negatif ise aşağı kaydırmayı sağlıyor. Aynı anda hem sağa ya da sola veya herhangi bir yönde scroll yapılabiliyor. Kullanımda dikkat edilecek konu, ekran rastport değişkeninin doğru verilmesi. Aksi takdirde programınız **crash** edebilir.

Evet, sıra geldi ClipBlit fonksiyonuna. Bu fonksiyon (ya da komut) Amiga'nın başlıca grafik komutlarından. Yaptığı işlem, hafızanın belirli bir bloğunu başka bir bloğa taşımak. Bu işlemi yaparken de blitter çipini kullanır. Eğer bu blok ekran olursa, yaptığımız işlemler de ekranda görülüyor. Amiga oyun ve demolarında bu tür blok taşımaları çok kullanılır. Mesela bir oyundaki arka plan resimleri bu fonksiyon ile ekrana getirilir ve kaydırılır. Şimdi bu komutun kullanımını inceleyelim:

ClipBlit(rastport1,x1,y1,rastport2,x2,y2,dx,dy,minterm); x1 ve y1, 1. bloğun başlangıcını; x2 ve y2, 2. bloğun başlangıcını belirtir. 1. blok kaynak, 2. blok ise hedeftir. dx ve dy ise taşınacak olan bloğun genişliğini belirtir, rastport1 ve rastport2 blokları temsil eder. rastport'lar aynı bloğu temsil edebilir. Bizim programımızda da böyle kullanılmıştır. Yani kaynak ve hedef aynı rastport'tan (bizim programımızdaki ekran'dan) alınmıştır. minterm ise, yerleştirmenin mantığını gösterir. 0xc0 kaynak bloğu hedef bloğa aynen taşır, minterm OR, AND, XOR ya da INVERT olabilir, minterm'lerin başlıcaları şunlardır: mode minterm(decimal) invert 48 and 128 or 224 xor 96 replace 192 Biz programımızda replace modunu yani hex olarak 0xc0 (decimal olarak 192) minterm'ini kullandık.

Ana program kısmımız burada bitiyor. Daha sonra screen ve library'lerimiz kapanarak programdan çıkılıyor. Programı.

CC +L prog.c ile compile;

LN prog.o -lc32 ile link edin. prog yazarak çalıştırın. Hoşlanacağınızdan eminim. Şimdi de bu ayki yeni örneğimiz: /* Amiga Dünyası */ /* Program : Cenker Özkurt */

#include <stdio.h> #include <exec/memory.h> #include <graphics/gfxbase.h> #include <intuition/intuitionbase.h>

struct NewScreen ns={ 0,0,320,200,2,0,1,0,CUSTOMSCREEN,0,0.0.0 };

struct RastPort *rp; struct Screen *scr; struct GfxBase *GfxBase; struct IntuitionBase *IntuitionBase; struct RastPort rpx; struct BitMap bmx; int x,y;

UBYTE*m=0xbfe001;

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"); CIoseLibrary(GfxBase); CloseLibrary(IntuitionBase); return(0);

} rp=&scr->RastPort;

InitBitMap(&bmx,2,64,20); bmx.Planes[0]=AllocMem( 160,MEMF_CHIPIMEMF_CLEAR); if(bmx.Planes[0]==NULL) {

printf("memory 7\n"); CloseLibrary(GfxBase); CloseLibrary(IntuitionBase); return(0); } bmx. Planes[1]=AllocMem( 160,MEMF_CHIPIMEMF_CLEAR); if(bmx.Planes[0]==NULL) {

printf("memory 7\n"); FreeMem(bmx.Planes[0], 160); CloseLibrary(GfxBase); CloseLibrary(IntuitionBase); return(0);

} InitRastPort(&rpx); rpx.BitMap=&bmx;

DrawEllipse(&rpx,32,10,30,8); for(x=0;x<320;x+=64) { for(y=0;y<200;y+=20) | ClipBlit(&rpx,0,0,rp,x,y,64,20,0xc0);

} } while(*m!=188);

FreeMem(bmx.Planes[0], 160); FreeMem(bmx.Planes[1], 160); CloseScreen(scr); CloseLibrary(GfxBase);

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