Bu sayfadaki yazılar
Sayfanın metni
Sayfa 50
Şekil 5. Uzatılmış resim
Bu şekilde resmi uzatabiliriz. Şimdi Bresenham formülünü biraz daha basitleştirerek inceleyelim;
delta0 : Orijinal resmin yüksekliği (y20-y10 farkı)
deltaU : Uzatılmış resmin yüksekliği (y2-y1 farkı)
-— y20-ylo deltaU -— y2u-ylu p - 0 for i from 1 to a (deltao / deltaU) * (i-1) if int(a) <> p then print "x" p intla) else ptint Vo"
deltaO = 5 ve deltaU = 11 olduğuna göre adım değerini saydırarak genişletilmiş resmin hangi satırının orijinal resmin hangi satırına denk geleceği değerlerini elde edebiliriz. Ancak bunun için çarpma ve bölme işlemleri yapmak gerekiyor ki Commodore 64 için hiç de ideal bir yöntem değil bu. Çarpma işleminden kurtulalım;
y20-ylo deltaU - y2u-ylu adim deltaO / deltaU
a 0 for i from 1 to
a a *t adim if int(a) <> p then print "xXx" p else print "o"
Ancak hala bir problem var. "adım" değerini elde edebilmek için ondalıklı sayılarla çalışabilmemiz gerekiyor. Bizim yapmamız gereken tam sayılarla çalışabilecek bir formül bulmak. Neyse ki matematikçiler bunun da bir çözümünü bulmuşlar. Yine pseudocode yazacak olursak;
deltaO y20-ylo deltaU - y2u-ylu a — 0 for i from 1 to a a * delta0o if a >— deltaU then a a - deltaU : print "Xx" else print "ot
Dikkat ederseniz yazdığımız bu son pseudocode yalnızca toplama, çıkarma işlemleri ve koşullardan ibaret. Verdiği sonuç ise önceliklerle aynı. Bu durumda hadi bu formülün nasıl bir çıktı verdiğini test edelim. Bunun için istediğiniz dili kullanmakta serbestsiniz. Ben yine en pratik bulduğum Javascript dilini kullanacağım. Bu örnekte deltaO değerini spriteların yüksekliği olan 21 ve deltaU değerini örnek olarak 70 veriyorum. Yani 21 pixel yüksekliğindeki sprite 70 pixele uzatılsaydı her bir satır kaçar kez tekrar edecekti, bu script bize bunun sonucunu verecek.
lineer interpolasyon1.htm
<script> deltaO - 21; deltaU - 70; 0; for(i 0; i < deltaU;
1 a deltaO; ifl(a >— deltaU) a -—-- deltaU; document.write("X"); ) else document.write("o");
) </seript>
Bu programın çıktısı şu şekilde olacaktır.
Buradaki her X bir alt satıra geçilecek yeri ifade etmektedir. Yani bu çıktıya göre sırasıyla satırlar 4,3,3,4,3,3,4,3,3,4... kez tekrar edecektir. Başlangıçtan itibaren inceleyecek olursak 3 adet o ve ardından bir X gelmiş. Yani ilk satır 4 kez tekrar edecek. Ancak X'den sonraki satır artık orijinal resmin 2. satırı olacak anlamına geliyor.
Şimdi 21'den 200'e kadar elde etmek istediğimiz 180 tablo değerini hesaplayalım.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 51
lineer interpolasyon2.htm
<seript> Str vu, deltaO for(deltaU
21; <-— 200;
a Oş forl(i
(
0; i < deltaU; a *- deltaO; ifl(a >— a deltaU; str *—
else Str *— "o"; )
str *- "<br>";
) document .write(str); </seript>
Bu programın çıktısı bize istediğimiz tabloları verecektir. Bir önceki scripte göre hız optimizasyonu için her karakteri tek tek document.write ile ekrana çıktı verilmek yerine "str" ismindeki bir string değişkende biriktirip bir seferde tüm çıktıyı ekrana yazdırıyoruz. Bir diğer nokta ise her çıktının arasına <br> koyarak çıktıların alt alta dizilmesini sağlıyoruz.
Aslında bu çıktıları "0" ve "X" yerine $00 ve $ff ile alsak ve kodumuzda doğrudan kullansak istediğimiz sonucu elde etmiş oluruz. Ancak buna gerek yok, bu kodun aynısını 6510 Assembler'dan da yazmak bizi hiç zorlamayacaktır. Burada çıktının doğru olduğundan emin olmuş olduk.
lineer interpolasyon.a
to "lineer interpolasyon.prg" A —DELTA O —DELTA U —TABLO
$£8 21 100 $1000
*
ldy lda adc sta cmp # DELTA U bec passl deltaU sbc # DELTA U sta A ele lda sta iny CPpY bne beg a < lda sta iny CPpY bne res
$0900 #$00 A # DELTA O A
loop2
a a *t deltaOo if a < then passl >-
a a - #$Ef
tabloya ekle
# DELTA U loop2 out ; passl #$00 TABLO,y
tabloya $00 ekle
# DELTA U
loop2 out
Bu programı yükleyip "SYS 2304" ile çalıştırdıktan sonra monitörden (Vice'da File->Monitor) "m 1000" yazarak 1000'den itibaren oluşturulan tabloyu görebilirsiniz.
Artık stretch efektinde gerekli tabloları gerçek zamanlı olarak oluşturabiliriz.
Yumuşak renk değiştirme
Bir demoda seyirciyi en çok etkileyen özelliklerden biri de renk parlamaları (flashing colors), sıralı renk geçişleri (cycling colors), kayan renkler (scrolling colors) ve benzeri renk efektleridir. Spritelarımız uzama efektini yaparken bir taraftan da renk değiştirirlerse bu seyircinin gözüne hoş gözükecektir. Ancak sürekli renk değiştirmek yerine bir süre sabit bir renkte kalıp arada bir parlayarak başka bir renge dönüşmesi zaten yeterince hareketli olan efektimiz için iyi bir seçim olabilir. Bu durumda oluşturacağımız renk tablosu şu şekilde olmalıdır.
renk1,renk1,renk1,renk1 ,renk1,.....,geçiş renkleri,renk2,renk2,renk2,renk2,renk2,renk2,.....,geçiş renkleri
Şimdi !fill ve !byte komutlarını kullanarak 256 bytelık bir tablo oluşturalım.
flash !byte !byte !byte !byte
110,10 12,12,12,15,15,15,15,13,13 13,13,1,1,1,1,13,13,13 110,14 12,12,12,15,15,15,15,13 13,13,13,1,1,1,1,15,15,15
Aralarda 18'erden toplam 36 geçiş rengi kullanıyoruz. Bu durumda sabit renkler de (256-36)/2'den 110'ar tane olarak hesaplanabilir. Böylece "!fill 110,10" ve "!fill 110,14" diyerek Açık Kırmızı (10) ve Açık Mavi (14) renklerinden 110'ar tane oluşturmuş oluyoruz. Aralarda ise geçiş renkleri var. Renkler hızlı değişeceği için ben renk geçişine pek özenmedim. Sizler isterseniz uygun renkleri peş peşe dizerek daha yumuşak geçişler elde edebilirsiniz.
Şimdi gelelim bu renkleri nasıl okutacağımıza. İstersek;
ldx lda sta sta sta sta sta sta sta sta
flashCounter $d027 $d028 $d029 $d02a $d02b $d02c $d02d $d02e
diyerek tablodan okunan bir değeri tüm sprite renklerine atayabiliriz. Ancak bunun yerine;
ldx lda sta lda sta inx lda sta
flashCounter flash,x $d02e
£flash,x $d02d
£flash,x $d02c