Amiga Dünyası sayı 24, sayfa 27

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 27

Selam! Bu ay dergiyi incelediyseniz bir eksikliği fark etmiş olabilirsiniz. Bu ay, bu yazının uzunluğundan dolayı Amiga ve Assembler yazısını kaldırmak zorundaydım. Bu yüzden hepinizden özür dilerim. Gelecek aya da Amiga ve Assembler yazısını uzun tutarak, Gelişmiş Assembler'ı bir aylığına yazmayacağım.

Bu ay verdiğim programı yavaş yavaş devam ettirerek ufak çapta bir oyunu nasıl hazırlayabileceğimizi yakından göreceğiz. Fakat araya da bazı örnekler sokacağım. Bu yüzden, oyun programlamasını merak eden arkadaşlar bir an önce verdiğim programı yazıp kaydetsinler. Bu örnek 16 renkli sprite'ların nasıl oluşturulacağını anlamanız açısından bir hayli faydalı. Program ekrana iki adet 16 renkli sprite getiriyor ve bunlarla bir animasyon yapıyor.

Programı çalıştırdığınızda dikkatinizi çeken bir şey oldu mu? Ekranda bir adet 16 renkli 32 piksel genişliğinde sprite var! Bu sizi aldatmasın, aslında 32 piksellik sprite diye bir şey yok. Ama iki sprite'ı yan yana bitiştirir ve programınız sayesinde de bunların devamlı yan yana kalmasını sağlarsanız, aynı sonucu elde edebilirsiniz. Benim vermiş olduğum programda 0 ve 1 numaralı sprite'lar ilk 16 renklik sprite'ı oluşturmak için kullanılmış durumda. 2 ve 3 numaralı sprite'lar ise sağ yarıyı oluşturan 16 renkli sprite'lar. Programımda 15 değişik sprite görüntüsü kullandım. Bunlar belli zaman aralıklarıyla peş peşe gösterince bir animasyon elde edilmekte. Grafikler için bu arada Tunç DİNDAŞ'a da teşekkürler. Aslında bu grafikleri bir demoda bob olarak kullanmayı planlıyordum; fakat düşündüğüm demonun aynısını başkaları yapmış. Her neyse, programımıza dönelim. Sprite animasyonunu yapmak için ben var olan iki yöntemden ikincisini seçtim. Bu bana daha düzenli gibi gelmekte. Aslında ikisi arasında pek fark yok:

1. Her seferinde copper listesinde sprite'ların adreslerini gösteren değerleri değiştirebiliriz.

2. Copper listesine sprite adresi olarak boş bir buffer adresini yazabiliriz. Daha sonra da programımızda bu boş buffer'a hafızada data olarak bulunan sprite görüntülerini kopyalarız. Bu kopyalama işlemi için de dilersek blitter'ı, dilersek de 68000'i kullanabiliriz. Ben, çoğunuzun daha blitter'ı kullanmasını bilmediğini varsayarak 68000 yardımıyla kopyalamayı kullandım. Bu arada belirteyim, 1. yöntem ikinciden çok çok daha hızlıdır. Dört sprite adresini copper listesine move.w komutları yardımıyla yazmak pek zaman almaz. Çok hızlı sprite animasyonları istendiğinde bu ilk yöntem daha faydalı olacaktır.

Sprite datalarını IFFMaster programını kullanarak data satırları haline çevirdim. Bu şekilde istediğiniz sprite animasyonunu bu programa koyabilirsiniz. Tek gereken şey, sprite'ların Deluxe Paint yardımıyla çizilmesi. Unutmayın, sprite'lar 16'şar pixel olarak kaydedilmekte.

Şimdi dilerseniz, 16 renkli sprite'lar hakkında biraz teorik bilgi vereyim. Bu tür sprite'lar ikili sprite gruplarının üst üste birleştirilmesinden oluşmakta. Bu durumda sprite sayısı yarıya düşer. Fakat dilediğiniz ikili sprite grubunu 16 renkli ya da normal olarak tanımlayabileceğinizden sadece kullandığınız 16 renkli sprite adedinin iki katı kadar sprite'ı harcamış olacaksınız. Diğer sprite'ları da dilediğiniz gibi kullanmakta özgürsünüz. 16 renkli sprite'larda birinin üstte, birinin de onun altında olması gerekmekte. Sprite öncelik sıralamasına göre düşük numaralı sprite her zaman üstte gözüktüğünden, bu durumda çift numaralı (even) sprite her zaman ikili gruptaki kardeşinin üstünde gözükür.

Gelelim işin en kafa yorucu yönüne; sprite üzerindeki piksel kodlarının belirlenmesine. 16 renkli sprite'ları aslında 4 bitplane'li 16 piksel genişliğinde resim ekranları olarak görebiliriz. Normal bitplane'lerde olduğu gibi, sprite bitplane'lerinde bir biti 1 konumuna geçirirseniz, bir renk seçmiş olursunuz. Buna göre dilediğiniz bitleri açıp kapayarak her piksele ait renk numarasını belirleyebilirsiniz. Çift numaralı sprite her zaman tek numaralının üzerinde gözükeceğinden, bu sprite'daki bitler renk kodunun sol yarısını belirler. Tek numaralı sprite bitleri ise sağ yarıyı belirler. Bu şekilde 16 rengin hepsini de kullanmak mümkün.

Son olarak da iki sprite'ı birleştirmek için Sprite Attachment flag'ını set ediyoruz. Sprite ikilimizden tek numaralı olanı sayesinde, bu flag'ı açıp kapayabiliriz. İkinci sprite kontrol word'ünün alt byte'ında 7. biti set ederek ($80 ile OR'layın!) iki sprite'ı birbirine kolaylıkla bağlayabiliriz.

16 renkli sprite teorisi bu kadardı. Nasıl, o kadar da zor değil, değil mi? Eh, 16 renkli sprite'ı da öğrendiğimize göre gelecek yazımızda (iki ay sonra!) biraz da joystick'le sprite kontrolüne geçebiliriz. Unutmayın; bundan sonra göstereceğim örnekleri bu ay vermiş olduğum programa ekleyerek göreceğimizden, bu örneği mutlaka yazın. İki ay sonra bu köşede tekrar görüşmek üzere hoşça kalın...

CEM GENCER ; > GELİŞMİŞ ASSEMBLER < ; > SPRITE DEMONSTRASYON < ; > PROGRAMI 05 < ; > byCemGENCER-1992 <

Q: movem.l d0-d7/a0-a6,-(a7) bsr.b Init

Loop: cmp.b #$ff,$dfP006 bne.b Loop

bsr.w CopySprites

Mouse: btst #6,$bfe001 bne.s Loop bra. w Fin

Fin: move.l GfxBase,a0 add.l #50,a0 move.l OldCopper,(a0) move.l 4,a6 jsr -138(a6) movem.l (a7)+,d0-d7/a0-a6 rts

Init: move.l 4,a6 jsr -132(a6) lea GfxName,a1 jsr -408(a6) move.l d0,GfxBase move.l d0,a0 move.l 50(a0),OldCopper move.l #NewCopper,50(a0) bsr.b CreateSprites rts

CreateSprites: lea NewCopper,a0 move.l #Sprite0,d0 move.l #Sprite0,d1 swap d1 and.l #$ffff,d0 and.l #$ffff,d1 move, w d1,6(a0)

ASSEMBLER'da YENİ UFUKLAR

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