ASSEMBLER'daYENİ UFUKLARSelam! İşte yine sizlerle beraberiz. Bu ay, sprite'lan biraz dahakarıştıracağız. Geçen ay bir sprite'ı ekranda nasıl göstereceğimiziöğrenmiştik. Bu ay ise aynı şekilde 8 sprite'ı birden ekranda göstermekiçin yapılması gerekenleri inceleyeceğiz. Aynı zamandada sprite'ları hareket ettirmeyi de göreceğiz. Dilerseniz vermişolduğum programı hemen yazıp kaydedin.Programı incelemeye başlamadan önce, size yine biraz teorikbilgi vermemde fayda var. Aslında burada yeni bilgiler yerine,geçen ay kazandığınız bilgileri biraz tazeleyeceğim. Hatırlarsanızsprite koordinatları sprite datalarının ilk üç byte'ında bulunmaktaydı.Bunlar sırayla VSTART, HSTART ve VSTOP idi. İstediğimizbir sprite’ı hareket etirmek aslında gayet basit. Örneğinsprite'ı sağa doğru hareket ettirmek istediğimizi varsayalım. Bununiçin her ekran tranmana sprite datalarındaki ikinci byte'ıbir artırmamız yetmekte. Bu şekilde HSTART'ın aldığı değer herekran taranmasında 1 artacak. Sprite’lar da her ekran taramasındatekrar çizildiğinden sprite'ımız ekran tarama ışınına senkron olaraksağa doğru hareket edecektir. Sprite hızını artırmak için herseferiınde 1 değil de başka bir sayı eklememiz yeterli. Fakat yüksekbir sayı kullanırsanız bu sefer de sprite titremeye başlayacak.Yavaşlatmak için de her seferinde HSTART'a 1/2 ya da 1/4 değereklemek gerekmekte. Fakat Assembler'da sadece tam sayılarıhiçbir uğraş olmadan kullanabildiğimizden 1/2 ya da 1/4 değerliklibir sayı elde etmek için değişik bir yöntem uyguluyoruz:HSTART değerini ekran tarama ışını 2 ya da 4 defa ekranı tamolarak taradığında 1 artırıyoruz. Nasıl, basit değil mi? Tarama ışınıylasenkronizasyonu karıştırmamak için sprite hız değerini2'nin katlan (2, 4, 8, 16, ...) ya da askatları (1/2, .1/4, 1/8, 1/16,...) olarak seçmemizde fayda var.Sprite'ı yukarıya ya da aşağı doğru hareket ettirmek için de aynıyöntemi uyguluyoruz. Fakat burada sadece VSTART değerinideğiştirmiyoruz. Aynı zamanda VSTOP'u da VSTART'la aynıoranda artırmalı ya da azaltmalıyız. Aksi halde sprite'ımız bazenbozuk gözükebilir, bazen de ekranda sprite'ın altında bir sürüpislik oluşabilir. Bu pislikler aslında sprite datalarından hemensonra gelen bilgilerdir. Sprite yüksekliği (VSTOP-VSTART) herseferinde değişik olacağından sprite'ın altındaki pisliklerin deyüksekliği-otomatik olarak değişecektir. Bazen de negatif değereulaşılacağından (VSTART, VSTOP'dan büyük olduğu durumlarda)ekranda sprite yerine sadece pislik gözükebilir.Şimdi biraz da sprite'ların değişik bir özelliği hakkında bilgivermek istiyorum: Extended (attached) sprite. Bunun hakkındadetaylı bilgiyi aşağıda bulabilirsiniz.Bildiğiniz gibi sprite'lar nonnalde 4 renk ve 16 piksel genişliklesınırlıdırlar. Fakat bazı durumİarda 32 piksel genişliğinde yada 16 renkli sprite'lar da olmasını isteriz. Programımızda sprite'larınhepsini kullanmadığımız durumlarda bu mümkün olmakta.32 piksel genişlikli sprite’lar için iki sprite'ı yanyana kullanmamızyeterli olabilir. Sprite kordinatlarını da değiştirirken heriki sprite’ın koordinatlarını da aynı anda değiştirmemiz gerekmekte.Fakat hala 16 rengi nasıl oluşturabileceğimizi bilmiyoruz.Copper çipj sprite’ları ikili gruplar halinde işlemekte. Bu yüzdende sprite renkleri 4 grup olarak sınırlıdır. Her bir renk grubuardarda gelen iki sprite’ın rengini gösterir. Renk register'lerininüst yarısı ($dff1a0-$dff1be) aynı zamanda sprite'ların da renklerinitaşıdığını düşünürsek her sprite renginin aşağıdaki listede yeralan renk register'lerinde bulunması gerektiğini de kabul etmişizdemektir.Grup 0 : Sprite 0, 1 - $dff1a0, $dffla2,$dffla4, $dffla6Grup 1 : Sprite 2, 3 - $dffla8, $dfflaa, $dfflac, SdfflaeGrup 2 : Sprite 4, 5 - Sdfflb0, $dfflb2,$dfflb4, $dff lb6Grup 3 : Sprite 6, 7 -$dfflb8,$dfflba,$dfflbc, SdfflbeExtended sprite modundarenk register'lerinin üst yarısıkomple bu genişletilmiş spriteiçin kullanılmakta. Ne deolsa genişletilmiş sprite 16renkten oluşmakta. Dilerseniztüm sprite'ları genişletilmişsprite olarak gösterebilirsiniz.Fakat bu durumda sprite sayısı4 ile sınırlı kalacaktır. Ya da sadecebir-iki genişletilmiş sprite kullanıp gerisini normal sprite olarakda kullanabilirsiniz. Fakat bu durumda tüm renkregister'lerini birbirleriyle çakışmayacak şekilde ayarlamalısınız.Peki extended sprite'ı nasıl mı kullanacağız? Gayet basit; extendedsprite'ı oluşturan grubun sprite'larını her zaman üstüstegelecek şekilde koordinatlarını belirlememiz gerekmekte. Ayrıcaextended sprite'ı oluşturan ikinci sprite'ın dördüncü byte'ındaki(SPRxCTL) ATTACH bitini (7. bit) de set etmemiz gerekmekte.Renkleri oluşturmak için de her iki sprite'ın bitplane'lerini üstüstegetirmemiz gerekmekte. Renk kodunu aşağıdaki tablodan rahatlıklabulabiliriz.Renk no Spr0 Sprl Renk register'i0 00 00 $dffla01 01 00 $dffla2<strong>23</strong>10110000$dffla4$dffla64 00 01 $dffla85601100101$dfflaa$dfflac7811000110$dfflae$dfflb091001101010$dfflb2$dfflb4111211001011$dfflb6$dfflb813 01 11 $dfflba141510111111$dfflbc$dfflbeNe yazık ki bu aylık yerim dolmaya başladığından ancak gelecekay size extended sprite ile ilgili bir örnek verebileceğim.Şimdilik bu ay vermiş olduğum örneği incelemeye başlayalım.Programın genelini anlamanız o kadar zor değil. Hemen gözeçarpan kısımlar arasında ekran tarama ışınını kontrol etmediğimdir.Sprite hareket ettirme rutinini işlemek biraz zaman aldığındanbir de ekran tarama ışınını bekletseydim ekrandaki tümsprite'lar titremeye başlıyordu. Fakat hiç bekleme olmadan dasprite'lan hareket ettirmeye kalkıştığımda sprite'lar epey yüksekbir hızla hareket ediyordu. Bu yüzden ben de ekran tarama ışınınıbekleteceğim yerde boş bir döngü yaratarak 800'den -l'e kadarsaydırma rutini ekledim. Bu şekilde sprite'lar tam istediğim birhızla hareket etmekteler. Sprite'ları biraz daha hızlandırmak içinbu değeri azaltmanız kafi olacaktır. Aynı şekilde yavaşlatmakiçin de bu değeri anırmanız gerekmekte. Fakat bu değeri fazladüşük ya da yüksek seçerseniz sprite'lar ya titrer, ya da çok hızlıhareket eder.AMIGA DÜNYASI 47
Göze çarpan diğer bir konu da programbaşında ve sonunda iki library fonksiyonukullanmış olmam. Bunlar Execlibrary'sinden Forbid ve Permit. Her ikisininde kullanım şeklini ve amaçlarını buayki <strong>Amiga</strong> ve Assembler köşesinde detaylıolarak açıkladım.Programın CreateSprites altrutini ilksprite datalarının sprite'ın görüntüsünü tanımlayankısmını tüm sprite'lara kopyalamakta.Hemen ardından da 8 sprite'ın adreslericopper listesine yazılmakta. Dilersenizsiz 8 değişik sprite görüntüsü kullanın.Fakat bunun için CreateSprites altrutininilk kısmını silerek her sprite datasınıayn olarak girmeniz gerekmekte. Aynı zamandasprite renklerini de doğru girmenizlazım.Ana döngü içersinde demin de belirttiğimgibi ufak boş bir-döngü ve sprite hareketettirme rutinine bir dallanma (bsrMoveSprites) bulunmakta. MoveSpritesrutinine baktığımızda burada ilk önceSprNo değişkeninin içeriğinin d7register'ine kopyalandığını görmekteyiz.Bu değer o an hareket ettirilecek spritenumarasıdır ve MoveSprite rutinindençıkmadan hemen önce her seferinde birartırılmakta. SprNo, 8 olduğunda da tekrarsıfırlanmakta. Bu şekilde her seferindesadece bir sprite'ı hareket ettirmekteyiz.Tüm 8 sprite'ı da aynı anda hareket ettirmekçok zaman alacaktı. Nedeni de herseferinde sprite y koordinatlarının bir tablodanokunmasından kaynaklanmakta.Dediğim gibi, sprite y koordinatı bir datatablosundan okunmakta. Fakat tüm ykoordinatlarını aynı tablodan okumayakalkıştığımızda tüm 8 sprite'ın y pozisyonlarıaynı olur. Bunu .engellemenin ikiyöntemi var; ilki gayet basit. Her spriteiçin ayrı bir data tablosu çıkarmak. Fakatbu şekilde bir rutin dergimizde fazla yerkaplayacağından dergimizin editörü MahmureAbla, kızarak evime gizlice giripsource disketlerimi formatlayabilir. Buyüzden ben ikinci yöntemi kullanmak zorundakaldım. Bu şekilde siz de yeni birteknik daha görebilirsiniz.Tüm sprite'larımız nasıl olsa sinüzoidalbir hareket yapacaklar. Ben de sadece birsinüs tablosu kullanmaya karar verdim.Fakat bu sinüs tablosunun 8 ayn yerinigösteren 8 ayrı pointer kullanarak hersprite'ın y koordinatının farklı olmasınısağladım. MoveSprites rutininde .de herseferinde sprite numarasına denk düşenpointer'in gösterdiği değer okunmakta.Eğer bu değer $ff'den farklıysa, direktolarak VSTART'a yazılmakta. Bu değere14 (sprite yüksekliği) ekleyerek deVSTOP değerini bulmaktayız. Dğere $ffolduğunda ise sprite numarasına denk düşenpointer'in tekrar sinüs tablosunun başınıgöstermesi sağlanmakta. HSTART,yani sprite'ın yatay koordinatı da her seferinde1 artırılmakta. Rutinin sonunda dakullanılan pointer 1 artırılarak bir sonrakikullanım için hazırlanmakta.Gayet basit, değil mi? Programın açıklamasıda burada bittiğine göre bana artıksadece size hoşçakalın demekten başkabirşey kalmıyor.; >>>>>>>>>>>>>