Subject : VGA Programlama Author : pOiSOn Email : poisone@usa.net Irc : irc.ada.net.tr / #scene.tr #manowar #atheist ICQ : 6795916 LastUpdate : 5 subat 98 Note : DOS hicbir zaman olmez! 0.1 sELaM! $imdi bu yaziyi niye yazdim...? Benim uzun zamandir ugrastigim scene dnyasinda yeterince aktivite g”sterememizin kafami bozmasiydi. Niye acaba derken aklima hemen iki sebep geldi...birincisi para...insanlarin bu isten para kazanmamalari olabilir...ama bunu para icin yapmak istiyenler hic yapmayip gitsin mirkosoft'a programci olsunlar. (hehe)...ikincisi bilgi olmamasi...(inkilizcesi bozuk olanlar icin benim gibi :} )... Hemen belirteyim bu yazilar sadece bu ise yeni baslayanlar icin yazdim. Tanidigim programcilarin cogu bu islere merakli ama nasil yapacaklarini bilmi yorlar. hmm iste bu yazinin sebebi...haaa bu arada bu yazida mumkun oldugu kadar kod yazmamamin sebebi lamerler...bu isi seven oturup yazsin.... de mi ama ? 1. Ekran Modu Ekran modu s”yle aciklanabilir. Ekrana gelen bilgilerin g”znrlg olarak basitce aciklanabilir. (nea?) Mesela bu yaziyi okudugunuz ekran text modudur. Text (tabi bi grafikal edit”rde okumuyosaniz :=)) modunda ekranda 2000 karakter (harf) g”sterilmektedir. Baska bir mod olan 320x200 modunda ise ekranda 64000 nokta (karakter degil) g”sterilmektedir. Ekran modlari kullanilan ekran kartinin hafizasina bagli olarak degisir. Mesela 1MB hafizasi bulunan ekran karti 1024x768 c”znrlgnde 256 rengi g”sterebilir. Bu renk olayi ise s”yle bir anda g”sterilebilen renk sayisidir. Bu biraz ”nce aciklanan c”znrlkte bir 257.ci rengin g”sterilememesi demektir. Bu ekran modu konusunda daha fazla aciklama yapmayacagim, gnk bunu zamanla ne demek istedigimi anlayacaksiniz. 1.1. Ekran Modu Nasil Degistirilir Ekran modunu degistirmek icin ilk gereken sey istediciniz modun numarasini bilmenizdir. Bu sayi mesela 320x200x256 modu icin 13h'dr. 640x480x256 icin ise 101h'dir. Biz simdilik sadece 320x200 modu zerinde galisacagiz. Bu modu agmak icin gereken kod; void opengraph() { asm { pusha mov ax,0013h int 10h popa } } $imdi bu koda bakan bazi acemi programcilar asm g”rnce korkacaklardir inanki assemler bir basic kadar kolay, fakat bir s”zlk programi yazmak kadar hamal isidir. (hmm...?) Eger asm'den anlamiyorsaniz piyasadaki asm kitablarindan alabilirsiniz. Bu gibi kitablar pek bir ise yaramasalarda yukardaki kodu anlamanizi saglayacaklardir. Gelelim koda yapilan is ax registerina 13 ykleyip ekran kesmesini cagirmaktir. €agirilan kesmede AH=0 ve AL=ekran modu olmasi gerekiyor. Bizde AL registerina 320x200 modunun kodu 13h yazdik. Eger ana programda opengraph procedure'n cagirirsaniz bos siyah bir ekran ile karsilasirsiniz. Siz ekran modunu degistirdicinizde ekran karti otomatik olarak ekrani temizler. 1.2. Pixel Teknik olarak ekrandaki bir noktaya pixel adi verilir. Her pixel'in rengini ayarlamak icin o pixel'in sayi degeri ile oynanmasi gereklidir. Siz ekran modunu degistirdicinizde ekran temizlenir dedik ama asil yapilan is ekrandaki btn pixellerin degeri 0 yapilir. 0.nci renkte ise genelde siyah renk bulunmaktadir. Eger siz 0,0 koordinatlarindaki pixele 10 yazarsaniz renk paletinden 10.rengi yklemis olursunuz. Artik 0,0 koordinatlarinda paletin 10.sirasindaki renk g”sterilir. Text modundan kalan bir aliskanlikla 4.nc renkte kirmizi bulunur diye dsnebilirsiz. Fakat bu b”yle degildir. 4.n rengi mavi olarakta ayarlayabilirsiniz. Bunu yapmak icinde paleti degistirmek gereklidir. 1.3. Palet Paleti anlamak icin s”yle dsnebilirsiniz. Elinizde 256 tane boya kutusu oldugunu fazedersek her kutudaki boya rengi degistirilebilir. Hatta bazi kutularda ayni renklerde bulunabilir. Iste paletteki her kutunun rengini ayarlamak icin 3 tane sayi kullanilir. Biz bunlara RGB degerleri deriz. Bu g sayiyi degistirerek ekranda 16 milyon rengi g”sterebilirsiniz. (ayni anda degil tabiki) 1.4. Ekran Bellegi Grafik ekran bellegi PC hafizasindaki A000 segmentine yerlestirilmistir. Bu islem aynen text ekranin B800 segmentine yerlestidigi gibidir. Eger siz A000:0000 adresine 1 yazarsaniz ekranin 0,0 koordinatinda bir pixel'in rengini 1 olarak degistirmis olursunuz. $imdi 320x200 moduna g”re ekran bellegi 0 1 2......................................................319 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ 0 ³ 0 1 2...................................................318 319 ³ 1 ³320 321 322...................................................637 638 ³ 2 ³ ³ 3 ³ ³ . ³ ³ . ³ ³ . ³ ³ . ³ ³ . ³ ³ 200³ ............ 63800 ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Sanirim bu sekil her seyi agikliyor. siz 320 offsetini degistirirseniz ekranda 0,1 koordinatindaki pixel rengini degistirirsiniz. Pekala bir koordinatin adresini nasil bulunabilir? basitce su formlle bulunabilir; Her Y degeri icin offsete 320 eklersek ve x degerinide offsete eklersek pixel adresini bulabiliriz. Yani; offset= Y * 320 + X Bu forml bize offseti verir. Akila takilabilecek bir soru ise neden 319 degilde 320 ile garptigimizdir. Bunun nedeni ise 0. stunuda hesaba katmakdir. Unutmamaniz gereken bir sey bilgisayar icin 0 sayisinin bir ”nemi yoktur, onun icin 4 veya 89 dan farki sadece 0 olmasidir. Bu formle g”re bir procedure yazmak istersek void putpixel(int x,int y,char color) { poke(0xA000,y*320+x,color); } Ayni sekilde ekran bellegine yazabildigimiz gibi okuyabilirizde char getpixel(int x, int y) { return peek(0xA000,y*320+x,color); } 1.5. Tarama €izgisi'de ne? Biraz teknik konu olacak ama sabredin... Ekrandaki btn g”rntler adeta bir kalemle saniyede 75 (mesela) kez gizilir. bu cizim s”yle ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄ> ³ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ> ³ ³ ³ ³ Ú---------------------------Ù ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ> ³ ³ ³ ³ Ú---------------------------Ù ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ> ³ ³ ³ ³ Ú---------------------------Ù ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ> ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÙ À----------------------------------Ù Iste siz bu cizim sirasinda ekrana bir cizim yaparsaniz bu cizimlerde kesikler olusur. Bunu engellemek icin iki yol var. 1.5.1 Sayfalama Teknigi Bu teknikte cizimler ekran yerine bellekte bir yere gizilip, cizim bittikten sonra bellek ekrana aktarilir. Animasyon icin en uygun y”ntem budur. €izim ekrana gizilmedigi icin daha hizlidir. €nk ekran bellegi normal bellekten daha yavastir. (Ekran Bellegi fiziksel olarak hizli olsada ekranda galisirken yavas kaliyor. €nk islem sadece bellege sayi yazmakla bitmiyor.) Buna ”rnek olarak bir algoritma verirsek 1. bellek ayir 2. bellege bir dikd”rtgen giz 3. tarama cizgisini bekle 4. bellegi ekrana aktar Buna ”rnek kodu ileri yazilarda daha aciklayacagim. 1.5.2. Tarama cizgisini bekleme Bu y”ntemde ise ekrana herhangi bir cizim yapilmadan tarama cizgisi beklenir. Bekleme isi tamamlandiktan sonra cizim yapilir. Bu y”ntem ise kgk grafik islemleri ve bellek sorunu olan islemlerde kullanilir. Fakat bu y”ntemin dezavantaji cok yavas islemesidir. 1. tarama cizgisini bekle 2. dikd”rtgen icin piksel (pixel) bas 3. cizim bitmediyse 1'e d”n Grafik islemlerinde grafiklerin dzgn gikmasi icin mutlaka tarama cizgisinin beklenme islemi yapilmalidir. Ayrica tarama cizgisini beklemek programlarin hep ayni hizda galismasini saglar. Yani 286'da yazilmis programlar pentisinizde de ayni hizda galisabilirler. €nk islerini bitir- dikten sonra ekran kartinizin isini bitirmesini beklerler. Tarama cizgisini beklemek programinizi yavaslatabilir ama grafik kalitesi icin gereklidir. 1.5.2. Basit Bir Scroll Denemesi Programi yazmadan ”nce yapilacak olan islemin algoritmasini dsnelim Scroll nedir? Bir objenin ekranda kaydirilmasidir. Kaydirma islemi yapilirken dsnlmesi gereken kaydirilacak objenin alt zemininde bir sekil olacak mi? Bu ”nemlidir gnk objenin gegtigi yerlerin tekrar temizlenmesi gerekecektir. Eger alt zemin sadece bir renk ise yapilacak islem objenin bitis yerlerine zemin renginin basilmasidir. Egerki bir alt zemin bir desen ise yapilacak islem sayfalama teknigi ile objenin kaydirilmasidir. $imdi biz tek renk zemini olan bir ekranda scroll yaptiralim. Ekranda g”rlmesini istedigimiz ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ³ ³ ³ ³ ³ ³ ³ ³ P³ ³ Po³ ³ Poi³ ³ Pois³ ³1 ³ ³2 ³ ³3 ³ ³4 ³ ÀÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÙ ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ³ ³ ³ ³ ³ ³ ³ ³ Poiso³ ³ Poison³ ³ Poison ³ ³ Poison ³ yapabilirsiniz. Ama bu scroll teknigi oldukga sert bir kayma hareketi verir. Biz bunu grafik ortama tasiyalim ve hareketi harf derecesinde degil harflerin kolonlari seviyesine indirelim. Yani her karede harf degil harfin sadece bir kolonu daha ortaya giksin. Peki bu harfin kolonunu nasil bulacagiz. Bunu anlatmak icin ”nce su anda g”rdgnz ekrandaki fontlarin hepsinin bilgisayarinizdaki ekran kartinda sayisal olarak saklandicini bilmeniz gerekli. $imdi bu saklama sekli s”yle tutuluyor. Mesela bir 'E' harfi icin bit haritasi gizersek Bit Haritasi Byte Degeri . . . . . . . . -------> 0 . . . . . . . . -------> 0 X X X X X X X . -------> 254 X . . . . . X . -------> 130 X . . . . . . . -------> 127 X . . . . . . . -------> 127 X . . . . X . . -------> 132 X X X X X X . . -------> 248 X . . . . X . . -------> 132 X . . . . . . . -------> 127 X . . . . . . . -------> 127 X . . . . . . . -------> 127 X . . . . . X . -------> 130 X X X X X X X . -------> 254 . . . . . . . . -------> 0 . . . . . . . . -------> 0 Bu haritada her satir bir byte'i g”sterirse her harf icin 16 byte yeterlidir. Iste bir scroll yaparken bu sutunlari bulmak icin bu bitleri kullaniyoruz. Peki bu bir sutunda 1 olup olmadicini nasil bulabiliriz. Bunu bilmenin bir cok yolu var mesela sayiyi nin kaginci kolununu istiyorsaniz asm'deki ror komutu ile d”ndrn ve 1 ile AND'leyince kolonda bir olup olmadicini test edebilirsiniz. Bir baska yolu direkt olarak sayi ile AND'lemek olabilir yani 8 elemanli bir diziye 2'nin slerini kaydedip kaginci kolunu istiyorsaniz dizinin o elemani ile AND'lemekte ayni seyi verir. Yani bu yol siz'e kalmis. Biras karisik ama programi yazmaya baslayinca g”zersiniz. Peki istedigimiz stunu bulduk fakat kaydirma islemi icin btn pikselleri yeniden mi basacagiz? Hayir. Bununda kolay bir yolu var Scroll yazisinin piksellerini hafizada tmn birden bir geri gekmek kaydirma islemini yapar yani; memmove(MK_FP(0xA000,320*100),MK_FP(0xA000,320*100+1),320); | ^100. satir | ^320 byte tasi ^her satir 320 piksel ^bir ileridekini geriye tasi komutu 100. satirdaki tm pikselleri ekranda bir sola getirir. Eger siz her karede tasima isleminden sonra 100. satirdaki 319. kolona istediciniz pikseli basarsaniz b”ylece scrollu yapmis olursunuz. Bu arada her tasima isleminden ”nce tarama cizgisini bekleme rutinini galistirmaniz gerekli. Yoksa obje kayarken kesilmeler g”rrsnz. Eger ”rn. program kodlarini incelerseniz nasil galisticini daha iyi anlarsiniz. $imdi ekranda yazilarin nasil kaydirildicini g”zmeye basladiniz. Bundan sonraki meselemiz arkada bir yildiz efekti. Bilmeyenler icin yildiz efekti uzayda gidiyormus gibi bir his veren bir efekt. ™nceleri ben bu efektin agi hesaplamalari ile yapildicini tahmin ediyordum. Ama sorun bu agi hesaplamalari islemci icin uzun srer. Bunun daha kolay bir yolu su forml ™nce her yildiz icin g eksen tanimlamaniz gerekli. yani struct point { unsigned int x; unsigned int y; unsigned int z; } bu yapiyi her yildiz icin kullanacagiz. Bu koordinatlar aslinda yildizin g”rsel koordinatlari, bunlari biz formlle iki boyuta indirecegiz. ekran_x = ( 256 * point.x ) / point.z; ekran_y = ( 256 * point.y ) / point.z; ^^^perspektif orani simdi bu formllerle her yildizin ekrana basilma koordinatlarini hesaplamis olduk. Peki yildizlarin bize yaklasmasini nasil ayarlayabiliriz?.. Eger bir her yildiz ekrana gizildikten sonra z koordinatini bir azaltirsak bu formle yansiyacagi icin yildiz bize yaklasmis gibi *g”zkr*. $imdi dsnlecek nokta ise z koordinati 0 oldugunda ne yapilmali... yapilacak is sadece yildizin koordinatlarina rastgele degerler yazilmasidir. Ayrica efekti daha g”rsel hale getirmek icin ekranda g”sterilecek pikselin renginide su formlle bulabiliriz.. renk = ( point.z / oran ) + taban_palet_sayaci Yildizlari bu renkte basticinizda uzaktakiler daha s”nk yaklastikga parlamaya baslarlar. Tabi bu ayarladiciniz palet'e g”re degisir :) Orani yildizlar icin ayirdiciniz palet sayacina g”re ayarlamalisiniz. Bu orani ise yildizlar icin verdiniz en byk degeri, ayirdiciniz renk sayisina b”lerek bulabilirsiniz. Sonraki efekt ise bir alev efekti. Bu efekt cok basit bir efekt ama g”rns bayagi iyi bir efekttir. Alev efekti icin ”nce hafizada bir 2 boyutlu dizi ayarliyoruz. Bu dizi stnde islemlerimizi yapacagiz. Herseyden ”nce renk paletini istegidimiz renge ayarlamaniz gerekli. A B C D E F G ÚÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄ¿ Programda ”nce bu dizinin tm elemanlarini 1³ ³ ³ ³ ³ ³ ³ ³ sifirlamamiz gerekli. ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ 2³ ³ ³ ³ ³ ³ ³ ³ Sonraki is dizinin en alt satirini yani 5. ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ satiri rastgele degerlerle doldurmak. 3³ ³ ³ ³ ³ ³ ³ ³ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ Daha sonra dizi elemanlari arasinda bir smoot 4³ ³ ³ ³ ³ ³ ³ ³ islemi yapacagiz. ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ 5³ ³ ³ ³ ³ ³ ³ ³ What is SMOOT ? Smoot islemi bir renklerin ÀÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÙ yumusatilmasi islemi. $”yle bir resim dsnn °°°°°°°° ²²²² °°±²²²²±°° ²² ²² resmini yumusatirsak °±²²±±±±²²±° ²² ²² °±²²±±±±²²±° ²²²²²²²² °±²²²²²²²²±° ²² ²² °±²²±±±±²²±° ²² ²² °±²²± ±²²±° °°±±° °±±°° G”rldg gibi a harfinin cizim hatlari belirsilesmeye basladi. Bu islemi defalarsak a harfi giderek kaybolmaya baslar. Iste biz dizimizde bu islemi yaparsak rastgele verdigimiz degerler kendi aralarinda yumusamaya baslar ve her defasinda dizideki tm elemanlari bir yukari kaydirirsak alev efektimizi yapmis oluruz. Peki bu yumusatma islemini nasil yapacagiz...? Dizideki her elaman icin etrafindaki btn degerleri ve kendi degerini bir sayida toplayip bu sayinin ortalamasini yeni hcre degeri olarak alirsak yumusatma islemi tamamlanir. 1. adim 2. adim A B C D E F G A B C D E F G ÚÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄ¿ ÚÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄ¿ 1³0 ³0 ³0 ³0 ³0 ³0 ³0 ³ 1³0 ³0 ³0 ³0 ³0 ³0 ³0 ³ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ 2³0 ³0 ³0 ³0 ³0 ³0 ³0 ³ 2³0 ³0 ³0 ³0 ³0 ³0 ³0 ³ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ 3³0 ³0 ³0 ³0 ³0 ³0 ³0 ³ 3³0 ³0 ³0 ³0 ³0 ³0 ³0 ³ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ 4³0 ³0 ³0 ³0 ³0 ³0 ³0 ³ 4³2 ³3 ³3 ³3 ³3 ³2 ³2 ³ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ 5³ 8³10³ 6³ 7³11³ 9³ 5³ 5³ 8³10³ 7³ 9³14³ 5³ 3³ ÀÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÙ ÀÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÙ 3. adim 4. adim A B C D E F G A B C D E F G ÚÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄ¿ ÚÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄ¿ 1³0 ³0 ³0 ³0 ³0 ³0 ³0 ³ 1³0 ³0 ³1 ³1 ³1 ³0 ³0 ³ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ 2³0 ³0 ³0 ³0 ³0 ³0 ³0 ³ 2³1 ³1 ³2 ³2 ³2 ³1 ³1 ³ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ 3³3 ³ 3³ 3³ 4³ 3³ 3³ 2³ 3³3 ³3 ³4 ³3 ³3 ³2 ³1 ³ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ 4³3 ³ 3³ 3³ 4³ 3³ 3³ 2³ 4³4 ³ 5³ 6³ 5³ 4³ 2³ 4³ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ ÃÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄÅÄÄ´ 5³ 8³10³ 7³ 9³ 5³ 6³ 7³ 5³ 8³10³ 6³ 7³11³ 9³ 5³ ÀÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÙ ÀÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÁÄÄÙ G”rldg gibi dizideki tm elemanlarin degerleri yukari gidildikge azalmaya baslar bu azalma yumusak bir sekilde oldugu ve bazi degerlerde yukarilara dogru dalgalanmalarla tam bir alev efekti olusur. Burdaki ”nemli nokta paletin dzenlenmesi yani alevin mavi olmasini isterseniz byk degerlerde daha cok mavi daha az degerlerde siyaha yakin olmasi gereklidir. barlar simdi ”nce bar'in ne demek oldugunu anlatayim.. bar yatay bir cizgidir.. ehuehe basit ha ? :) ve efekt bunlarin asagi yukari dalga gibi salinmasi ile yapilir. bu yatay degerler sins degerleri ile bulunur. Hareket ÚÄ<Ä¿ °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ³ ³ ³ ³ ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ³ ³ ³ ³   ²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²² ³ ³ ³ ³ ³ ³ ³ ³ ÀÄ>ÄÙ seklinde. Bunu grafik ekranda cizmek icin ”nce ekrani yatay olarak 20 satir renge boyariz. Ve hareket sadece palet degerlerinin degistirilmesi ile yapilir. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ------------------------------ 1. renk ³ seklinde gizilip ilk 200 renk ³ ------------------------------ 2. renk ³ siyah renkte olmasi gerekli ³ : ³ ³ 200 tane ³ ³ : ³ ³ ------------------------------ 200. renk ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Sonra barin hangi satirda olmasi gerektigini sins degerleri ile hesaplayip bulunan sayinci palet rengini mesela mavi yapilirsa bari olusturmus oluruz. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ------------------------------ 1. renk ³ ³ ****************************** 2. renk ³ bar 2. renkte ³ ------------------------------ ³ ³ : ³ ³ 200 tane ³ ³ : ³ ³ ------------------------------ 200. renk ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Text ekranda barlar Teoride text ekranda grafik cizmek mmkn degil. Fakat biz ekran kartinin bir *hilesini* kullanarak text ekranda grafik g”sterecegiz. Bu zemin renginin ekran kartinin ekrani tazelemesinden ”nce renginin degistirilmesi ile yapilir. Bu konu hakkinda pek fazla benimde bilgim yok sadece kodu verecegim. a4line prosedr her cagrilisinda ekran satiri bir alt cizgiye geger. Burdada bari cizmek icin sins degerleri kullanildi. Fakat aklinizda bulunmasi gereken illa sins ile cizmek olmasin bu sadece barin st ve alt degerleri daha yumusak gecmesi icin yapilir. Aksi halide kullanilabilir. #include #include "sincos.c" #include "intro.h" #define barmax 4 #define byte unsigned char #define word unsigned int char text[]={" cOdeD by pOiSoN dAte 1/11/97 gRoUnd iSt"}; unsigned char pal[]={15,7,7,8}; int s1,s2,s3,s4,count,count2,col,say,backupsay,boyali; int position[barmax]; struct coltyp { byte r; byte g; byte b; } dizi[380]; void setrgb(byte color,byte r,byte g,byte b) { asm { mov dx,3c8h mov al,color out dx,al inc dx mov al,[r] out dx,al mov al,[g] out dx,al mov al,[b] out dx,al } } void waitvbl(void) { asm mov dx,3dah l1: asm in al,dx asm test al,8 asm jnz l1 l2: asm in al,dx asm test al,8 asm jz l2 } void a4line() { asm pusha asm mov dx,0x3da a1: asm in al,dx asm test al,1 asm jnz a1 a2: asm in al,dx asm test al,1 asm jz a2 asm popa } void main() { // IMAGEDATA ekran'a basilacak ansii grafikler.. memcpy(MK_FP(0xb800,0),IMAGEDATA,4000); gotoxy(1,24); while (inp(0x60)!=1) { backupsay=say; // sinus degerleri for(s1=0;s1=0;s2--) { if ( (count2==position[s2])) { boyali=1; for(s1=0;s1<10;s1++) { dizi[count].r=0; dizi[count].g=0; dizi[count].b=s1*6; count++; } //FOR for(s1=10;s1>0;s1--) { dizi[count].r=0; dizi[count].g=0; dizi[count].b=s1*6; count++; } //FOR } //IF } //FOR if (boyali==0) { dizi[count].r=0; dizi[count].g=0; dizi[count].b=0; count++; } //IF } disable(); // tm kesmeleri iptal et klavye, timer vesaire waitvbl(); // tarama cizgisini bekle for(count=0;count<380;count++) { a4line(); // her a4line dedigimizde ekranda bir satir asagi ineriz. setrgb(col,dizi[count].r,dizi[count].g,dizi[count].b); } // FOR enable(); // kesmeleri geri ag } //while // program kapatiliyor herseyi eski haline getiriyoruz setrgb(col,0,0,0); // renkler 0.renk siyah'ti /// cursor'u yok ediyoruz... asm mov ah,1 asm mov cx,1000h asm int 10h s2=pal[0]; s3=1; // kapanis efektimiz.. for(s1=0;s1<=strlen(text);s1++) { gotoxy(s1+5,24); for (s4=0;s4<=3;s4++) { textattr(pal[s4]); if (s1+s4