Sei sulla pagina 1di 3

Tekst Ekranda Grafik Fare Krsr

Text ekranda grafik fare krsr kartmak iin yle bir yol izlenir. ncelikle mouse grafik
olduundan iki karakter veya 4 karakter arasnda bulunabilir. Bu durumda mouse krsrnn zerinde
olduu karakter ve bunun altndaki, sandaki, ve aprazndaki karakterlerin ekilleri mouse krsr
yapmakta kullanlan 4 karaktere kopyalanr. Bundan sonra bu karakterlerin ekilleri zerine fare krsr
offsetleri hesaplanarak yerletirilir. Daha sonra bu mouse krsr iin kullanlan karakterler farenin
bulunduu yere kopyalanr. Fare hareket ettiinde, eski karakterler yerlerine tekrar konur. Sonra ayn
ilem tekrar batan farenin o anda bulunduu yeni yer iin tekrar yaplr. Farenin krsr dzgn
grnebilmesi iin bir takm oynamalar yaplmaldr. Mesala Chr$(219) komple dolu bir karakterdir. Fare
krsr zerine geldiinde belli olabilmesi iin erevesinin en azndan belli edilmesi gerekir. Bu durum
windows iinde byledir. Eer dikkat ettiyseniz beyaz olan fare krsr beyaz bir alana geldiinde siyah
olan ereve rengiyle kendini belli eder. Ayrca krsr bir eit ekil olduuna gre blok olarak tanamaz.
iinde saydam blgelerinde olmas gerekiyor. Bu durumu zmek iin farkl masklar kullanlarak krsr
belli edilir. Mouse Cursor iki mask'tan oluur. Birincisi Xor dier And. nce And uygulanr. Sonra Xor
uygulanr bu ekilde.
Data And Xor Aklama
0
0
0
Siyah
1
0
0
Siyah
0
1
0
Saydam
1
1
0
Saydam
0
0
1
Beyaz
1
0
1
Beyaz
0
1
1
Ters Renk
1
1
1
Ters Renk
imdi buradan u sonu kyor. 0 ile and'lediiniz yerler siyah veya beyaz olarak dzenlenebiliyor. 1
ile and'lersenizde ya saydam oluyor veya ters renk oluyor. Eer 1 ile Xor'larsanz And'leme sonucunu
aynen tayor. Eer 0 ile and'lenmi ise oras siyah oluyor 1 ile and'lenmi ise saydam oluyor. Buna gre
iki matris hazrlayp izdiinizde bunu neyin zerinde tutarsanz onun zerinde istediiniz grnty
gsterebilirsiniz. Mesala bir byte iziyorsanz bytecin yuvarlan eer ters renk yaparsanz olduka
gzel bir efekt elde edersiniz. imdi bir mouse krsrn hazrlayalm
And Mask
Xor Mask
+=======
========
++======
========
+++=====
=+======
++++====
=++=====
+++++===
=+++====
++++++==
=++++===
+++++++=
=+++++==
+++++==+
=+++====
+=++++==
===++===
==++++==
===++===
==++++==
===++===
==+++++=
===+++==
===++++=
====++==
===++++=
====++==
===++++=
====++==
========
========
+:0
+:1
=:1
=:0
Bu ekilde tanmlamanz yaptktan sonra sorunsuz bir ekilde krsrnz grnecektir. imdi gelelim
kodlamasna. Bilinmeyen bir ka olay var. Bunlardan bir tanes ekranda grlen her karakter aslnda 9
pixel'den oluuyor. Oysa fontlar 8 pixel'den oluuyor. Bu durumda 9=8 yaparak daha kaliteli ve geni bir
grnt elde ediliyor. Bunu yapmak iin yanl hatrlamyorsam INT 10h'n misc servisinde bir alt servisi
arlyor. Yine bu serviste 256 karakter olan font saysn 512'ye kartmak iin gerekli opsiyonda var.

512 font yklemek iin arabilirsiniz. Burada font dosyalar 8x16 pixellik, iki ayr font dosyas. Birincisi
FNT uzantl, dieri FON uzantl.
SUB LoadFont (FontFile$)
DIM Reg AS RegTypeX
Reg.ax = &H1103
Reg.bx = 1
InterruptX &H10, Reg, Reg
OPEN FontFiles$ + ".FNT" FOR BINARY AS #1 LEN = 1
Size = LOF(1) / 256
DIM Fonts(1 TO Size) AS STRING * 256
FOR i = 1 TO Size
GET #1, , Fonts(i)
NEXT
CLOSE #1
Reg.ax = &H1110
Reg.bx = Size * &H100 + 1
Reg.Cx = &H100
Reg.dx = 0
Reg.es = VARSEG(Fonts(1))
Reg.bp = VARPTR(Fonts(1))
InterruptX &H10, Reg, Reg
OPEN FontFiles$ + ".FON" FOR BINARY AS #1 LEN = 1
Size = LOF(1) / 256
FOR i = 1 TO Size
GET #1, , Fonts(i)
NEXT
CLOSE #1
Reg.ax = &H1110
Reg.bx = Size * &H100 + 0
Reg.Cx = &H100
Reg.dx = 0
Reg.es = VARSEG(Fonts(1))
Reg.bp = VARPTR(Fonts(1))
InterruptX &H10, Reg, Reg
END SUB
Bu rutini ardnzda iki adet font yklenmi olacaktr. imdi hangisini nasl seeceim konusuna
gelelim. Bu karakterin rengi ile belirleniyor. YTTT ZWWW Y = 0 Birinci karakter seti. Y = 1 ikinci
karakter seti. TTT Arka plan rengi Z = 1 Blink (Yanp snyor.) Z = 0 Dim (Sabit renk.) WWW n
plan rengi. Bu ekilde yanp snmesini ve karakter setini semi oluyorsunuz. Bunu yaptnz
varsayalm. Gelelim mouse krsrn gstermeye. Bu ilem iin 4 karakter aslnda yetiyor. Bunu 512
iinde istediiniz gibi seebilirsiniz. Ama palette de bir ayarlama yapmanz gerektiini sylememde
herhalde sorun yok. Yapacanz ilem aadaki gibi. bir dngde olacaktr.
Orgx = 0
Orgy = 0
A=0:B=0:C=0:D=0
Do
GetMouse X,Y
if X<> OrgX or Y <> OrgY Then
PutChar OldX,OldY,A,B,C,D
Oldx = X
OldY = Y
GetChar X,Y,A,B,C,D
CalcMouseCursor X,Y,A,B,C,D,Fonts(),aMask(),xMask() ' Font 250,251, 252, 253
SetFonts Fonts()

PutChar X,Y,250,251,252,253 end if


Loop
sub PutChar(X,Y,A,B,C,D)
Ptr = (X\8) + (Y \16) * 80 ' 80 karakter / satr
. Ptr = Ptr *2 -1 ' Rengide dahil etmek lazm.
Poke Ptr,A
Poke Ptr+2,B
Poke Ptr + 80, C
Poke Ptr + 82, D end sub
sub GetChar(X,Y,A,B,C,D)
Ptr = (X\8) + (Y \16) * 80 ' 80 karakter / satr.
Ptr = Ptr *2 -1 ' Rengide dahil etmek lazm.
A = peek(Ptr)
B = Peek(Ptr+2)
C = Peek(Ptr + 80)
D = Peek(Ptr + 82)
end sub
sub CalcMouseCursor (X,Y,A,B,C,D,Fonts(),aMask(),xMask())
XDelta = X mod 8
YDelta = Y mod 16
Fonts(250) = Fonts(A)
Fonts(251) = Fonts(B)
Fonts(252) = Fonts(C)
Fonts(253) = Fonts(D)
For i=YDelta to 15
T% = Cvi(mid$(Fonts(250),i,1)+mid$(Fonts(251),i,1)
A$ = Mki$(ApplyMask%(T%,Asc(AMask(i-YDelta)), Asc(,xMask(i-Ydelta)),xDelta))
Mid$(Fonts(250),i,1) = left$(A$,1)
Mid$(Fonts(251),i,1) = Right$(A$,1)
next
For i=0 to YDelta
T% = Cvi(mid$(Fonts(252),i,1)+mid$(Fonts(253),i,1)
A$ = Mki$(ApplyMask%(T%,Asc(AMask(i-YDelta)), Asc(,xMask(i-Ydelta)),xDelta))
Mid$(Fonts(252),i,1) = left$(A$,1)
Mid$(Fonts(253),i,1) = Right$(A$,1)
next
end sub
Function ApplyMask%(T%, aMask%,xMask%,xDelta)
a% = Amask% * 2^(8-xDelta ) ' Burada bir sorun var.
' 8-xDelta = 8 olursa overflow olabilir. Bunuda
' siz zn. p ucu rakamlar Long yaparsanz
' zlebilir
. x% = xMask% * 2^(8-xDelta) ' Shift ilemi
ApplyMask% = ((T% and a%) xor x%)
end function
--------------------------------------------------------Burada dikkat etmeniz gereken bir ka ey var. Bir tanesi bata verilen program parasndaki font
ykleme rutinindeki fonts ile buradaki birbirinden farkl. bu ikinci rutinde verilen rutinde fontlar 256 adet
16 karakterlik stringlerden oluurken, ilkinde kolay olsun diye 256 karakterlik 16 eleman yklenmitir.
Buradan siz kendi loadfont rutinizi kartabilirsiniz. Set font rutinide esasnda bu yklenmi olan font
dizinin INT 10h fonksiyonunu aran ksmdr.
Bu mesaj Facia tarafndan gnderilmitir.

Potrebbero piacerti anche