AMIGA BASIC

Merhaba... Geçen ay OBJECT komutlarına başlamış ve devamı gelecek ay demiştik. Şimdi hemen komutlarımızı açıklayıp örneklerimizi inceleyelim.

OBJECT.HIT KOMUTU: Kullanım Şekli: OBJECT.HIT Obje-no,[değer1][,değer2]

Bu komut, hangi objenin, hangi objelerle çarpışacağını tespit etmek için kullanılır. Bu komutla objenin diğer objeler ya da ekran çerçevesi ile çarpışmasını da önleyebilirsiniz.

Obje-no ile belirtilen obje, bir OBJECT.SHAPE yönergesindeki objeye karşılıktır.

Tüm objeler tanımlı olarak diğer objeler ve çerçeve ile çarpışır. OBJECT.HIT yönergesi ile tanımlanarak bazı objelerin diğer objeler içinden çarpışmaya neden olmadan geçmesine izin vermek için kullanılabilir.

değer1, 16 bitlik bir maskedir ve obje-no ile belirtilen objeyi tanımlar, değer2 de 16 bitlik bir maskedir ve onunla çarpışacak objeyi tanımlar, değer2'de en küçük bit set edilirse, obje-no ile belirtilen obje ekran çerçevesi ile çarpışabilir. Set edilmezse, obje görünen alanın dışına uçar.

Değer1’de belirtilen objenin bitleri değer2’de belirtilen diğer objenin bitleri mantıksal olarak AND'lenir. Sonuç sıfırdan farklı olursa, obje-no ile belirtilen obje, değer2’de belirtilen bir obje ile çarpışır ve bir COLLISION durumu ortaya çıkar.

Şimdi asıl obje (değeri) ve diğer objeleri (değeri) tanımlayan aşağıdaki tabloya bakın, üzerinde örnekler yapalım.

Değer 1 Bit Değeri 128 64 32 16 8 4 2 1 Uzay Gemisi 0 0 0 0 0 0 1 0 = 2 Roket 0 0 0 0 0 0 1 0 = 2 Yıldız 0 0 0 0 0 1 0 0 = 4 Değer 1 Bit Değeri 128 64 32 16 8 4 2 1 Uzay Gemisi 0 0 0 0 0 0 1 1 = 3

Roket 0 0 0 0 0 0 1 0 = 2 Yıldız 0 0 0 0 0 1 0 0 = 4 OBJECTSHAPE yönergesi ile uzay gemisinin obje-no'su, 1; roketin, 2 ve yıldızların da 3'ten 10'a kadar obje-no ile tanımlanırlar:

OBJECTSHAPE 1,Uzaygemisi$ OBJECTSHAPE 2,Roket$ OBJECTSHAPE 3,Yıldız$ Karşılaştırmalarının kolay olması için ikili sayıları kullandık. OBJECT.HIT komutunu kullanacağınızda, değerlerin ondalık karşılıklarını kullanacaksınız. Mesela uzaygemisi için bir komut verelim:

OBJECT.HIT 1,2,3 Şimdi bitlere bakacağız. Uzaygemisinin değer1'inde en küçük yani birinci bit set edilmiş. Uzaygemisi, ekran çerçevesi dışına çıkamıyor. Roket ve yıldız ise herhangi bir yönde ekran dışına çıkabiliyor.

Uzaygemisinin değer1’i ve roketin değer2'si iki olarak set edilmiş: çarpışabilirler. Bunun anlamı roket uzay gemisi ile karşılaşırsa bir çarpışma ortaya çıkacak demektir.

Uzay gemisinin değer2'sindeki ikinci biti ve roketin değer2'sindeki ikinci biti set ettik; böylece ters durumda olduklarında bir çarpışma olacak. Yalnızca yıldız için üçüncü bit set edilmiş: bu yüzden yıldız çarpışma içine alınmayacak.

OBJECT.ON OBJECT.OFF KOMUTLARI:

Kullanım Şekli: OBJECT.ON [obje-no][,obje-no...] OBJECT.OFF [obje-no][,obje-no...]

Bu iki yönerge bir ya da daha çok objeyi görüntülenir duruma getirir veya görüntülenen objeleri kaldırırlar.

obje-no, OBJECTSHAPE yönergesindeki obje-no'ya karşılık gelir. OBJECT.OFF komutunda obje-no parametresi kullanılmazsa, o anki çıktı penceresindeki tüm objeler görüntüden kaldırılır.

OBJECT.ON komutunda obje-no kullanılmadığında ise, tüm objeler o anki çıktı penceresi içinde görüntülenir. Objelerin harekete başlaması için, OBJECTSTART komutu kullanılır.

OBJECT.PLANES KOMUTU: Kullanım Şekli: OBJECT.PLANES Obje-no [,bitplane] [,plane-değeri]

Obje-no ile belirtilen objenin set edilen bitplane bit'iyle hangi bitplane'de görüneceği tanımlanır. Obje-no, OBJECTSHAPE yönergesindeki obje-no'ya karşılıktır. bitplane, 8 bitlik, 0 ile 255 arasında bir değerdir.

Diyelim ki 4 bitplane'iniz mevcut ve objenin birinci ile üçüncü plane'de görünmesini istiyorsunuz (0 ve 2. düzey). Bu işlem için, komutun bitplane argümanını, 2^0+2^2 = 1+4 = 5 olarak girmelisiniz. plane-değeri, yine 8 bit'lik bir sayıdır ve diğer bitplane'lere neyin koyulacağını belirler.

OBJECT.PRIORITY KOMUTU: Kullanım Şekli: OBJECT.PRIORITY Obje-no,Öncelik-no

Bu komutla tek tek objelerin öncelik değerleri tanımlanabilir. Aynı ekran yerleşiminde birçok obje olduğu zaman, hangi objenin görüntüleneceğini tespit etmek için kullanılır. Yönerge, sadece bob'lar için geçerlidir, sprite'larda etkili değildir. Aynı öncelik-no ile iki obje tanımlandığında, çizim, rasgele sırayla yapılır.

Obje-no, yine OBJECTSHAPE yönergesinde belirtilen objeye karşılık gelir. öncelik-no, -32768 ile 32767 arasında bir değerle tanımlanır; belirtilen en yüksek değer, en yüksek önceliği tanımlar. Öncelik-no'su 8 olan bir obje, 0'dan 7'ye kadar öncelik numarası verilen tüm objelerin önünde görüntülenecektir.

OBJECT.SHAPE KOMUTU: Kullanım Şekli: Format 1- OBJECT.SHAPE obje-no,tanımlama dizisi

Bu komut bir objenin şeklini, büyüklüğünü, rengini, yerleşimini ve diğer özelliklerini tanımlamak için kullanılır.

Tanımlanan obje, obje-no ile belirtilir; özellikleri ise tanımlama dizisi içerisine yerleştirilir. Bu obje ile ilgili komutlarda da istenen obje buradaki obje-no ile belirtilir ve 1 ile n arasında bir sayıdır, n, sadece bellek miktarı ile sınırlıdır, tanımlama dizisi içerisinde verilen özellik tanımları, aşağıdaki gibi bir sırasal dosya içinden okunabilir: OPEN "(obje dosyası)" FOR INPUT AS 1 OBJECT.SHAPE obje-no, INPUT(LOF(1), 1) CLOSE 1

Bu sırasal dosya içindeki data kalemleri de Extras disketindeki BASICDemos çekmecesinde bulunan ObjectEditor programı ile yaratılır.

Format 2- OBJECT.SHAPE obje-no1, obje-no2

Komutun bu kullanım şekli, obje-no2’yi obje-no1’e kopyalayarak yeni bir obje yaratılmasına yarar. Mevcut bellek o anda bellekteki iki obje tarafından paylaşıldığı için, yeni obje yaratıldığında bellek yeniden düzenlenir.

OBJECT.START OBJECT.STOP KOMUTLARI: Kullanım Şekli: OBJECT.START [obje-no][,obje-no ... ] OBJECT.STOP [obje-no][,obje-no.....]

OBJECT.START komutu, bir ya da daha çok objenin hareketini başlatır; OBJECT.STOP ise hareketi durdurur. Aynı anda pek çok objenin hareketi başlatılıp durdurulabilir. Objenin hareket hızı ile hız anısı OBJECT.VX ve OBJECT.VY komutlarıyla tespit edilir. Obje hareketinin başlangıç noktası da OBJECT.X ve OBJECT.Y ile tanımlanır. AmigaBasic, obje çarpışması oluştuğunda OBJECT.STOP yönergesini otomatik olarak çalıştırır. İki obje çarpışmışsa her iki obje de durdurulur; obje, çerçeve ile çarpışmışsa

AMIGA BASIC

çarpışan objenin hareketi kesilir.

Her iki yönergede de obje-no belirtilmemişse, işlem o an aktif çıktı penceresindeki tüm objeler için yapılır.

OBJECT.VX OBJECT.VY KOMUTLARI: Kullanım Şekli: KOMUT FORMATI - FONKSİYON FORMATI - OBJECT.VX obje-no,DEĞER=OBJECT.VX(obje-no) OBJECT.VY obje-no,DEĞER=OBJECT.VY(obje-no)

Bu iki yönerge, objenin x ve y eksenlerinde hareket hızını tanımlamak için kullanılır. OBJECT.VX ile obje-no ile belirtilen objenin yatay eksendeki; OBJECT.VY ile dikey eksendeki hareket hızı tanımlanır, hız değeri pozitif olduğunda hareket yukarıdan aşağıya ve sola doğru olur. Ters istikametlerde hareket için hız değeri negatif sayı ile verilmelidir.

hız, saniyede geçilecek pixel sayısı olarak verilir. Objenin hareket başlangıcı, OBJECT.START yönergesi ile belirtilen yerdir.

Fonksiyon formatında kullanıldığında, yönergeler obje-no ile belirtilen objenin x ve y yönlerinde o anki hız değerlerini verirler. Bu değerleri zaman zaman değerleri değiştirmek veya hesaplamalar için kullanabilirsiniz.

OBJECT.X OBJECT.Y KOMUTLARI: Kullanım Şekli: KOMUT FORMATI - FONKSİYON FORMATI - OBJECT.X obje-no,x-koordinatı DEĞER=OBJECT.X(obje-no) OBJECT.Y obje-no,y-koordinatı DEĞER=OBJECT.Y(obje-no)

Bu yönergeler objenin çıktı penceresindeki yerleşimini tanımlamak ya da obje hareketinin başlangıç ve bitiş noktalarını tanımlamak için kullanılır. Objenin x-koordinatı ile y-koordinatı pencerenin sol üst köşesinden hesaplanır ve -32768 ile 32767 sınırları arasında bir sayı olarak girilir. Objenin OBJECT.ON komutunu görene kadar görüntülenmeyeceğini hatırlayın.

Fonksiyon olarak kullanıldığında objenin yerleşimini verirler. Bu bilgilerle obje ile yapmak istediklerinizi gerçekleştirebilirsiniz.

Evet... OBJECT yönergelerimiz burada bitti. Şimdi söz verdiğimiz gibi, tüm bu komut ve fonksiyonlarla yapılmış iki örnek verelim. İlk örneğimizin adı Yo-Yo. Yazın ve deneyin: WINDOW 1,"Yo-Yo", (0,0)-(631,184),20 DIM alien$(114) RESTORE AlienShapeData FOR n=1 TO 114

READ a:alien$=alien$+CHR$(a) 
NEXT 
OBJECTSHAPE l,alien$ 
OBJECT.X 1,300:OBJECT.Y 1,10 
OBJECT.ON :OBJECT.START 
WHILE MOUSE(0)=0
OBJECT. AY 1,10 
WHILE OBJECT.VY( 1 )< 100:WEND 
OBJ ECT. AY 1,-10 
WHILE OBJECT.VY( 1 )>-100:WEND 
WEND 
OBJECTSTOP:OBJECTCLOSE 
AlienShapeData: 
DATA  0, 0, 0, 0, 0, 0, 0, 0 
DATA  0, 0, 0, 2, 0, 0, 0, 26 
DATA   0, 0, 0, 11, 0,24, 0, 3 
DATA   0, 0, 0,127,128, 0, 1,255 
DATA 224, 0, 7,255,248, 0,31,255 
DATA 254, 0,248,225,199,192,248,225 
DATA 199,192,255,255,255,192, 12,127 
DATA 140, 0, 12,127,140, 0,252, 0 
DATA 15,192.252, 0, 15,192, 0, 0 
DATA  0, 0, 0, 0, 0, 0, 0, 0 
DATA  0, 0, 0, 0, 0, 0, 7,30 
DATA 56, 0, 7, 30, 56, 0, 0, 0 
DATA  0, 0, 0,127,128, 0, 0,127 
DATA 128, 0, 0, 0, 0, 0, 0, 0 
DATA  0, 0

Programı çalıştırdığınızda, DATA yönergeleri ile basit bir obje yaratılıyor ve yaratık ekranda yukarıdan aşağıya doğru saniyede 10 pixel olmak üzere hareket etmeye başlıyor. Programı durdurmak için sol mouse tuşunu kliklemeniz yeterli.

İkinci örneğimiz, obje çarpışmaları ile ilgili. Program, 5 obje yaratıyor ve siz bunlardan birini mouse yardımıyla ekranda oynatabiliyorsunuz. Bu oynatma esnasında ortaya çıkan çarpışmalar, ekranın üst satırındaki mesajla bildiriliyor, programı inceleyin: SCREEN 1,320,200,3,1 WINDOW 2,"Obje Çarpışma Demosu",(0,0)-(311,185),20,1 WIDTH 40 PALETTE 0,0,.45,0: PALETTE 1,.9,.9,.9 PALETTE 2,0,0,0:PALETTE 3,.9,.48,.15 ON BREAK GOSUB Cikis:BREAK ON ON COLLISION GOSUB Carpisma:COLLISION ON DIM alien$(114):RESTORE ObjeSekilData FOR n=1 TO 114

READ a:alien$=alien$+CHR$(a) 
NEXT n 
OBJECTSHAPE l,alien$ 
OBJECTSHAPE 2,1 :OBJECT.SHAPE 3,1 
OBJECT.SH APE 4,1 :OBJECT.SHAPE 5,1 
OBJECT.PLANES 2,5:OBJECTPLANES 3,6 
OBJECT.PLANES 4,7:OBJECT.PLANES 5,6,1 
OBJECT.HIT 1,2,5 'diğer yaratık ve kenarlar ile çarpışma. 
OBJECTHIT 2,4,2 'obje hareket ederek diğerleri ile çarpışır. 
OBJECT.HIT 3,4,2 
OBJECT.HIT 4,4,2 
OBJECT.HIT 5,4,2 
FOR n=2 TO 5
OBJECT.X n.n*50-40:OBJECT.Y n,n* 12+20 
NEXT n 
OBJECT.ON  l,2,3,4,5:OBJECT.START:LOCATE 19,5 
PRINT "«Cikis için mouse'u klikleyin»" 
WHILE MOUSE(0)=0 'ana döngü'
OBJECT.X l,MOUSE(l)-l2:OBJECTY l,MOUSE(2)-l 1 
WEND 
WHILE MOUSE(0)<>0:WEND 
Cikis:
OBJECT.CLOSE:WINDOW CLOSE 2 
SCREEN CLOSE 1:END 
Carpisma:
objectID=COLLISION(0) 
collisionID=COLLISION(objectID) 
LOCATE 1,1 :PRINT SPACE$(2()):PRINT SPACE$(20) 
LOCATE LLPRINT "obje #";objectID 
IF collisionID=-1 THEN PRINT "ust kenara carpti." 
IF collisionID=-2 THEN PRINT "sol kenara carpti." 
IF collisionID=-3 THEN PRINT "alt kenara carpti." 
IF collisionID=-4 THEN PRINT "sag kenara carpti." 
IF collisionID=-5 THEN PRINT "obje #";coliisionID 
OBJECT.START:COLLISION ON 
RETURN 
ObjeSekilData: 
DATA   0, 0, 0, 0, 0, 0, 0, 0 
DATA  0, 0, 0, 2, 0, 0, 0, 26 
DATA   0, 0, 0, 11, 0,24, 0, 3 
DATA   0, 0, 0,127,128, 0,  1,255 
DATA 224, 0, 7,255,248, 0,31,255 
DATA 254, 0,248,225,199,192,248,225 
DATA 199,192,255,255,255,192, 12,127 
DATA 140, 0, 12,127,140, 0,252, 0 
DATA 15,192,252, 0, 15,192, 0, 0 
DATA   0, 0, 0, 0, 0, 0, 0, 0 
DATA   0, 0, 0, 0, 0, 0, 7, 30 
DATA 56, 0, 7, 30, 56, 0, 0, 0 
DATA  0, 0, 0,127,128, 0, 0,127 
DATA 128, 0, 0, 0, 0, 0, 0, 0 
DATA  0, 0

Bu ayki Basic tanıtımını OBJECT komutlarına verdiğimiz örneklerle tamamladık. Gelecek ay bu köşede buluşmak dileğiyle, hoşçakalın...