Varga Márton - Játékprogramok készítése

  • Upload
    dafyfy

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    1/117

    VARGA MRTON

    JTKPROGRAMOK KSZTSEPASCAL S ASSEMBLY NYELVEN

    A knyv nyomtatott formban megvsrolhat a

    www.unisher.hu

    oldalon

    Minden jog fenntartva. A jelen knyvet elektronikus formban kizrlag a Magyar Elektronikus Knyvtr

    hozhatja nyilvnossgra, brmely ms felhasznlshoz a szerz rsbeli engedlye szksges.

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    2/117

    2

    Tartalom

    Elsz......................... ............................................................ ........................................................... ...................... 41. Alapfogalmak........................ ........................................................ ......................................................... ............ 5

    1.1. A VGA krtya zemmdjai, az MCGA zemmd ................................................................ ....................... 5

    1.2. Kppont kigyjtsa........... ....................................................... ......................................................... ............ 51.3. Egy pixel sznnek lekrdezse ................................................................ .................................................... 61.4. A BOB-ok.............................................................. ....................................................... ................................ 71.5. Az MCGA kp elmleti megjelentse ......................................................................... ................................ 71.6. A paletta .............................................................. ......................................................... ................................ 9

    1.6.1. Egy szn RGB-komponenseinek olvassa................... ................... .................... ................... ...................... ........... 101.6.2. Egy szn RGB-komponenseinek rsa.................. ..................... .................... ..................... .................. .................. 101.6.3. Pldaprogramok a paletta mdostshoz .................. ................... .................... ................... ....................... ........... 10

    2. BOB-ok megjelentse ....................................................... .......................................................... .................... 132.1. Egyszer BOB-megjelent ................................................... ........................................................... .......... 132.2. Tetszleges httr ............................................................ ............................................................... ............ 152.3. Tbb BOB egyszerre............................................... .................................................... ............................... 182.4. Vltoztathat httr, animlt BOB-ok ...................................................................... .................................. 22

    2.5. Teljes megjelents ................................................................ ........................................................ ............. 273. Billentyzet s egr.......................................................... ........................................................... ..................... 34

    3.1. A billentyzet mkdse .......................................................... ............................................................ ...... 343.2. Az egr programozsa, a Mouse egysg....... ............................................................ .................................. 38

    4. Httr ..................................................... ....................................................... ................................................... 414.1. LBM kp betltse ...................................................... .......................................................... ..................... 414.2. A MAP kpszerkezet.... ............................................................ ...................................................... ............ 454.3. Megjelents ............................................................. ............................................................ ...................... 474.4. Sor megjelentse...................................................................................... .................................................. 48

    4.4.1. Legfels sor..................... ...................... ..................... ..................... ...................... ..................... .................... ........ 484.4.2. Brmely sor..... ..................... ...................... ..................... ..................... .................... ..................... ..................... .... 494.4.3. Tetszleges helyzet trkp egy sora .................... ...................... ...................... ...................... ...................... ......... 51

    4.5. Oszlop megjelentse.......................... ................................................................ ........................................ 54

    4.6. Grdts ..................................................... ............................................................ ..................................... 574.6.1. Jobbra ................... ..................... ..................... ..................... ..................... ................... ..................... ..................... 574.6.2. Balra................... ...................... ..................... ..................... ...................... .................... ..................... ..................... 584.6.3. Fel .................... ..................... ..................... ..................... ..................... .................... ..................... ..................... .... 594.6.4. Le..................... ..................... ..................... ..................... ..................... .................... ..................... ..................... .... 60

    4.7. Scroll pldaprogram, a MAP fjl formtuma.............................................................................................. 605. tkzsek ..................................................... ............................................................ ........................................ 63

    5.1. Egyszer BOB-BOB tkzs ................................................ .................................................... ................. 645.2. Tnyleges BOB-BOB tkzs............ .................................................... .................................................... 655.3. BOB-httr tkzs .................................................. ............................................................. ..................... 705.4. BOB-BOX tkzs........... ....................................................... ........................................................ ........... 71

    6. BOB-EDITOR ........................................................ ....................................................... .................................. 726.1. A program ltal hasznlt unitok............................................................ ...................................................... 72

    6.1.1. Az MCGA egysg.................... ..................... ..................... ..................... ..................... .................... ..................... . 726.1.2. A _SYSTEM egysg....... ..................... ..................... ..................... ..................... ................... ..................... ........... 73

    6.2. A BOB-Editor megjelense s hasznlata ............................................................ ...................................... 746.2.1. Menk................... .................... ..................... .................... .................... ...................... ..................... ..................... 746.2.2. Szerkesztsi terlet................ ..................... ..................... ...................... .................... .................... ..................... .... 746.2.3. Paletta ..................... ..................... ..................... ...................... ..................... ................... ..................... .................. 756.2.4. llapotsor ................... ..................... ..................... ..................... ..................... .................... ..................... .............. 75

    6.3. Menk s funkcik ......................................................................................................... ............................ 766.3.1. AFile men ..................... ..................... ..................... ..................... ..................... ...................... .................... ........ 766.3.2. AzEdit(szerkesztsi) men...... ...................... ...................... ...................... ...................... ................... .................. 786.3.3. A Tools (eszkzk) men ..................... ..................... ...................... ..................... ...................... ................... ........ 78

    6.4. Funkcibillentyk........................................................ ............................................................ ................... 806.5. Egyb lehetsgek ....................................................... ........................................................... .................... 81

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    3/117

    3

    7. MAP-EDITOR...................................... ........................................................ ................................................... 827.1. A Menu egysg...................... ........................................................... ...................................................... .... 82

    7.1.1. Eljrsok .................... ..................... ..................... ...................... ..................... .................... ..................... .............. 827.1.2. Vltozk, konstansok....... .................... .................... .................... .................... ...................... .................... ............ 837.1.3. Pldaprogram..................... ..................... ..................... ..................... ..................... .................... ..................... ....... 83

    7.2. A kperny felptse, az editor hasznlata............ ....................................................................... ............. 847.2.1. Menk................... .................... ..................... .................... .................... ...................... ..................... ..................... 847.2.2. Trkpszerkesztsi terlet ...................... ..................... ..................... ...................... .................... .................... ........ 857.2.3. BOX-kivlaszt rsz ................... ...................... ..................... ...................... ................... ..................... .................. 857.2.4. BOX-szerkesztsi terlet................ ...................... ..................... ...................... .................... .................... ............... 857.2.5. Paletta ..................... ..................... ..................... ...................... ..................... ................... ..................... .................. 857.2.6. llapotsor ................... ..................... ..................... ..................... ..................... .................... ..................... .............. 86

    7.3. Menk............................................... ............................................................ .............................................. 867.3.1. A File men ................... ..................... ..................... ..................... ..................... .................... ..................... ........... 867.3.2. Az Edit (szerkesztsi) men..... ..................... ...................... ..................... ...................... .................. ..................... . 877.3.3. Options (opcik) men ................... .................... ..................... .................... ................... ..................... .................. 88

    7.4. Funkcibillentyk........................................................ ............................................................ ................... 897.5. Tovbbi lehetsgek............ ........................................................... ......................................................... ... 89

    8. A GAME unit............................................................... ................................................................ .................... 918.1. DoneGame eljrs: az egysg lezrsa ........................................................... ............................................ 91

    8.2. DoneKey eljrs: BIOS billentyzetmegszakts vissza..................................... ........................................ 918.3. DrawBox eljrs: egy BOX megjelentse ........................................................ ......................................... 928.4. FillBack eljrs: httr besznezse....................................................................................... ..................... 928.5. GrayPal eljrs: szrkesklv konvertls ....................................................................... ......................... 928.6. HidePal eljrs: sznek egybemossa.......................................................................................................... 928.7. InitGame eljrs: az egysg inicializlsa ............................................................................ ...................... 938.8. InitKey eljrs: mdostott billentyzetmegszakts................................................................................... 938.9. LoadLBM eljrs: kp betltse........... ............................................................ .......................................... 948.10. LoadMap eljrs: trkp betltse........................................................ .................................................... 948.11. LoadPal eljrs: paletta betltse ...................................................................... ....................................... 948.12. MakeScr eljrs: megjelents elksztse......................................................... ..................................... 958.13. NewPos eljrs: ugrs a trkpen .......................................................... ................................................... 958.14. PixelBack eljrs: httrpont megvltoztatsa.......................................................................................... 958.15. RetRace eljrs: vrakozs vertiklis visszafutsra....................................................................... ........... 968.16. Scroll eljrs: trkp grdtse ............................................................. .................................................... 968.17. SetArea eljrs: kp magassga........................................................... ..................................................... 978.18. SetRGB eljrs: sznsszetevk vltoztatsa...................... ................................................................. ..... 978.19. ShowPal eljrs: kivilgosts .............................................................. .................................................... 988.20. ShowScr eljrs: megjelents ............................................................... ................................................... 998.21. _KeyPressed fggvny: billentyzet figyelse....................................................................................... ... 998.22. _ReadKey fggvny: SCAN-kd beolvassa ........................................................................................... 998.23. A BOB objektumtpus ................................................... ...................................................... ..................... 99

    8.23.1. Collision fggvny: tkzs BOB-bal .......................... ............................ ............................ .................... ......... 1008.23.2. CollBack fggvny: tkzs httrrel ............................. ............................... .......................... .................... ...... 1008.23.3. CollBox fggvny: tkzs trkpegysggel .................................. ................................... ....................... ......... 1008.23.4. CollColors fggvny: tkzs httrrel............... .............................. .............................. ................... ................ 1018.23.5. Copy eljrs: BOB msolsa............... ...................... ..................... ...................... .................... .................... ...... 1018.23.6. Init eljrs: inicializls ................... ..................... ...................... ..................... .................... .................... .......... 1018.23.7. Load eljrs: Shape betltse.................... ..................... ..................... ..................... ................... .................... ... 1028.23.8. OnScreen fggvny: lthatsg vizsglata .............................. ................................ ........................... ................ 1028.23.9. Put eljrs: kpernyre rajzols .................... ...................... ...................... ...................... ...................... ............. 1028.23.10. ShowUpon eljrs: prioritsvltoztats. .................... .................... .................... ..................... .................... ...... 1028.23.11. A BOB tpus mezi .................... ..................... ...................... ..................... ...................... .................... ............ 103

    8.24. A Game unit konstansai s vltozi........ ....................................................................... ......................... 1039. Pldajtk....................................................................................................................................................... 106A lemezmellklet ismertetse .................................................................. .......................................................... 113Trgymutat ...................................................................................................................................................... 114Irodalomjegyzk ....................................................... ........................................................ ................................. 117

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    4/117

    4

    Elsz

    Sokan vannak, akik a szmtgppel csak jtszanak. Sokkal kisebb azoknak a tbora, akik kedvtelsbl,idtltsbl sajt maguk is rnak jtkokat, mg akkor is, ha ezek sznvonala jcskn alulmarad a kereskedelmi

    forgalomban lvknl. Igaz, hogy egy jtkprogram elksztse lnyegesen nehezebb, mint egy ksz jtkhasznlata, viszont sokkal rtelmesebb tevkenysg annl. A legtbb jtk csak a kzgyessget fejleszti, mgjtkprogram-rshoz szksges nmi fantzia, kreativits, tletek, grafikai kszsg stb. is.

    E knyv s lemezmellklete segtsgvel kszthet jtkok megjelensket tekintve ktdimenzi-sak, felbontsuk 320200, szneik szma 256. A knyv megrtshez elengedhetetlen a Pascal s az assemblynyelv ismerete, jtkok ksztshez azonban elegend a Pascal, mert a lemezmellkleten tallhat egy olyan

    programknyvtr (Game unit), ami magba foglalja a jtkok ksztshez nlklzhetetlen gpi rutinokat.A lemezmellkleten tallhat programok futtatshoz s a knyv alapjn ksztett jtkokhoz az

    albbiakra lesz szksg: egy IBM AT tpus szmtgpre, egy 286-os vagy annl fejlettebb processzorra, egy tetszleges VGA krtyra, Turbo Pascal 7.0 fejleszti krnyezetre.

    A programok szp s egyenletes futshoz azonban ez nem elg, ehhez legalbb egy 80-90 MHz-es processzor segy PCI buszos VGA krtya kell.

    Jtkprogramok ksztshez sok sikert kvn

    A szerz

    [email protected]

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    5/117

    5

    1. Alapfogalmak

    1.1. A VGA krtya zemmdjai, az MCGA zemmd

    A VGA krtyk tbbfle zemmdban kpesek mkdni, melyek alapveten ktflk lehetnek, szvegess grafikus mdok. A szveges mdok karakteres kpernyt hasznlnak, felbontsuk vltoz, a leggyakrabbanhasznlt a 8025 karakteres kpernyfelbonts. A grafikus kperny pixeleket tartalmaz, melyek lehetnek kett,16 s 256 sznek. Nem rdemes a klnbz zemmdok felbontst, szneinek szmt stb. elemezgetni, mert

    jtkaink csak az MCGA (vagyis a 320200/256 szn) zemmdot alkalmazzk.MCGA videomdban a kperny felbontsa 320200, azaz vzszintesen 320, fgglegesen 200 pixelt

    tartalmaz. Ez a felbonts elg gyenge a ma hasznlatos SVGA felbontsokhoz kpest, viszont elnye, hogyknnyen kezelhet, s minden VGA krtyn alkalmazhat. Az MCGA az egyetlen a hagyomnyos szabvnyosVGA grafikus mdjai kzl, amelyik 256 sznt tud egyszerre megjelenteni. A memriban a kezdcmeA000:0000, egy bjt egy pixelnek felel meg, melyek sorfolytonosan vannak trolva, balrl jobbra, fentrl le. Akperny helyignye 320200, azaz 64000 bjt, ami majdnem lefoglalja a teljes videomemrit (az $A000-s

    szegmenst).A matematikban hasznlthoz hasonl koordinta-rendszert hasznlunk, hogy a pontokat meg tudjukklnbztetni, csak itt az ordintatengely (Y tengely) fordtott lls, lefel mutat. A (0;0) pont, az orig, akperny bal fels sarkban tallhat kppont, gy cme: $A000:0000. Ettl jobbra az els, ettl lefele a msodikkoordinta n. Pldul a $A000:0005 cm pont koordinti: (5;0).

    A koordintk rtelemszeren csak termszetes szmok lehetnek Egy pont abszcisszja (elskoordintja) bele kell, hogy essen a [0..319] intervallumba, ordintjnak (msodik koordintjnak) pedig[0..199] kztt kell lennie. Ez a kperny MCGA zemmdbeli mrete miatt van (320200).

    1.2. Kppont kigyjtsa

    Azoknl a jtkoknl, melyeknl a f hangsly a grafikn van, nagyon fontos tudni, hogyan kell akperny egy pontjt valamilyen sznre befesteni. Minden rajzols alapja a pont-rajzols, ezrt legelszr eztkell megismerni. Szerencsre az MCGA kpszerkezet felptsnek ksznheten ez nem tl nehz feladat.

    Egy (X;Y) koordintj pont kirajzolshoz szksges kplet:CM=320*Y+X

    Ez nem egy nagy rdngssg, ebbl is lthatjuk, hogy a memriban a sorok egymst kvetenhelyezkednek el. Teht az A000. szegmensen az els 320 bjt az els sornak, a msodik 320 a msodik sornakfelel meg, s gy tovbb. A kvetkez rvid pldaprogram bemutatja az MCGA zemmd be- s kikapcsolst,s pixelek kirajzolst.

    {putpixel.pas}

    procedure PutPixel( X,Y: word; C: byte); assembler; asm

    { (X;Y) helyzet C szn pont rajzolsa }mov es,sega000 { A vidememria szegmenst a SEGA000 sz }

    { tartalmazza, rtke $A000 }mov ax,320 { A kp szlessge 320 pixel }mul Y { A pont sornak kezdcme: 320Y }add ax,X { A pont cme: 320Y+X }mov di,ax { ES:[DI] a felgyjtand pont cme }mov al,C { C-t kell rni ebbe a bjtba }mov es:[di],al { Pixel kigyjtsa }

    end;

    procedure MCGA_On; assembler; asm { MCGA zemmd bekapcsolsa }

    mov ax,0013h { 00h zemmd, 13h funkci }int 10h { 10h sorszm megszakts }

    end;

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    6/117

    6

    procedure MCGA_Off; assembler; asm { Visszatrs a szveges zemmdhoz }

    mov ax,0003h { A 8025-s md a 03h funkci }int 10h { Megint a 10h megszaktst hasznljuk }

    end;

    begin

    MCGA_On;PutPixel( 0, 0, 12); { A kperny ngy sarkba ngy klnb- }PutPixel( 319, 0, 13); { z szn pont kirajzolsa }PutPixel( 0, 199, 14);PutPixel( 319, 199, 15);readln; { Enter megnyomsra kilp }MCGA_Off;

    end.

    Az els eljrs, aPutPixel, egy C szn s (X;Y) koordintj pontot rajzol a kpernyre. A memribarni Turbo Pascalban a MEM[ ] tmbbel lehet, teht a PutPixel eljrs helyett elg lett volna aMEM[$A000:320*Y+X]:=C rtkad utasts is. Viszont a ksbbiekben fleg assembly eljrsokat

    alkalmazunk, ezrt ismerni kell a pixel kirajzolshoz szksges assembly eljrst is.A program elszr bekapcsolja az MCGA zemmdot, a 10h megszakts segtsgvel. Jtkok

    ksztse szempontjbl a 10h megszakts funkcii nem fontosak, csupn ez a kett, amivel be- illetvekikapcsoljuk a 320200/256-os kpszerkezetet.

    Ezutn ngy, egy piros, egy lila, egy srga s egy fehr pontot gyjtunk ki a kperny ngy sarkba,majd kilps eltt visszalltjuk a szveges zemmdot. Ezt sohase felejtsk programunk befejezse el

    beiktatni, mert lehet, hogy csak gpnk jraindtsval tudunk ksbb karakteres kpernyt hasznlni.Pixelek rajzolsa nem tl bonyolult, elszr ki kell szmolni a kpcmet a koordintkbl (320Y+X),

    majd erre a cmre ki kell rni azt a bjtot, ami a kvnt sznhez tartozik. Az eljrsnak rgtn az els sorbantallhat a SegA000 vltoz. Ez a System unit egyik tipizlt konstansa (inicializlt kezdrtk vltozja), rtke$A000, vagyis az MCGA kp szegmenscme. Elnye pedig az, hogy a szegmensregisztereknek egy utastssalrtk adhat, nem kell valamelyik ltalnos cl regisztert, pldul az akkumultor regisztert kzbeiktatni. A ktalbbi assembly utasts

    mov ax,0a000hmov es,ax

    helyett teht elg a kvetkez:mov es,sega000

    Tovbbi elnye ennek a konstansnak, hogy vdett mdban is hasznlhat, mg az elz megolds ott nemmkdne, hiszen vdett mdban a szegmensek szervezse egszen mshogy mkdik, mint vals mdban.

    1.3. Egy pixel sznnek lekrdezse

    Csak a teljessg kedvrt foglalkozunk ezzel a problmval, ami valjban egy jtk rsa sorn szintesohasem kerl el. Ugyanazt a kpletet hasznljuk, amit a pixel kiraksnl, csak nem rjuk, hanem olvassuk a

    kpernyrl az egybjtnyi adatot. A legrdekesebb dolog az egsz fggvnyben taln az, hogy a visszatrsirtkt az AL regiszterben kell megadni. Ez jl alkalmazhat brmely ms assembly fggvnyben, pldul afunction Fgv: byte; assembler;asm...

    end;szubrutin vgn ha az AL-be berunk 3-at, az lesz a Fgv rtke, gy, mintha Pascalban rtuk volna, s a vgnkiadtuk volna az FGV:=3; rtkad utastst.

    function GetPixel( X,Y: word): byte; assembler; asm { Az (X;Y) koordintj pont szne }

    mov es,sega000 { A vidememria szegmenst a SEGA000 sz } { tartalmazza, rtke $A000 }

    mov ax,320 { A kp szlessge 320 pixel }mul Y { A pont sornak kezdcme: 320Y }add ax,X { A pont cme: 320Y+X }

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    7/117

    7

    mov di,ax { ES:[DI] a leolvasand pont cme }mov al,es:[di] { A fggvny visszatrsi rtke AL-ben }

    end;

    1.4. A BOB-ok

    A BOB-ok olyan tglalap alak grafikai objektumok, melyek tetszlegesen mozgathatak,eltntethetek s megjelenthetek. Szintn 256 sznek, tbb fzisbl (mozdulatokbl) llhatnak. A BOBelnevezs az Amiga gpekrl szrmazik, a Blitter OBject rvidtse. Akik jrtasak a Commodore 64

    programozsban, azok tallkoztak mr a Sprite fogalommal. Nos, a BOB-ok is hasonl funkcit ltnak el, minta Sprite-ok, azzal a klnbsggel, hogy a Sprite-ok ellltsa a hardver feladata, a BOB-ok programozsrlviszont neknk kell gondoskodni, szoftveres ton. A bobot teht nevezhetnnk akr szoftver SPRITE-oknak.

    Egyszerre tbb BOB-bal is dolgozhatunk, ezek egymstl s a httrtl is fggetlenek. BOB-naktekinthet pldul az egr ikonja grafikus kpernyn, ami ltalban nyl formj. Vagy pldul BOB egy

    jtkban egy fut ember, radsul tbb fzis. Egy tbbfzis BOB olyan, mintha tbb, azonos mret egyfzisBOB-ot jelentennk meg egyms utn. Egy BOB bizonyos rszein ttetsz (transzparens) lehet, vagyis ott azltszik, ami mgtte van (httr, egy msik BOB).

    Shape-nek nevezzk a BOB grafikus adatait a memriban. Egy egyfzis, W szlessg, H magassgShape helyfoglalsa WH bjt. Ha ennek a BOB-nak nem csak egy, hanem P fzisa van (P>1), akkor bjtbanmrt memriaignye PWH. A Shape-et dinamikus vltozknt troljuk, GetMem-mel foglalunk neki PWH

    bjt hosszsg memrit. A BOB adatait az adatszegmensben, Object tpus vltozknt, objektumkntdeklarljuk. Ide tartozik pl. a BOB szlessge, magassga, fzisainak szma, bjtban vett helyfoglalsa,sorszma, s itt adjuk meg a Shape-re mutat pointert is.

    1.5. Az MCGA kp elmleti megjelentse

    MCGA kpszerkezet esetben a kpernyn megjelentend adatok az $A000 szegmens els 64000bjtjn helyezkednek el, a bal fels sarokban lv pontot pl. a MEM[$A000:0000] tmbbel rhetjk el. Egy bjt

    egy kppont sznt hatrozza meg. A VGA krtya ebbl a tartomnybl olvassa ki a kppontokhoz szksgesadatokat, majd ezeket a bjtokat a monitor szmra is rthet jelekk alaktja. A monitornak msodpercenkntlegalbb 25-szr kell felfrisstenie a kpet ahhoz, hogy szemnk a vltozsokat folyamatosnak rzkelje, nelegyen darabos s villog.

    A kpalkots a monitorban az elektronsugr segtsgvel megy vgbe. Ez a sugr mindenmsodpercben tbbszr vgigpsztzza a kpcs felnk es tglalap alak rszt, a kpernyt. Szembl nzve a

    bal fels sarokbl indul, vgighalad egy soron, vzszintesen, majd jra a kperny bal oldalra ugrik, a kvetkezsorra. Ezt a bal oldalra trtn visszatrst nevezzk horizontlis visszafutsnak (horizontal retrace), amelyminden sor vgigpsztzsa utn bekvetkezik. Amikor az utols soron is vgigszaladt az elektronnyalb,

    bekvetkezik a vertiklis visszafuts (vertical retrace), amikor a jobb als sarokbl a bal felsbe ugrik. Ezutnkezddhet az egsz ellrl.

    Az elektronsugr teht kigyjtja a kperny pontjait. Ezek nem alszanak el rgtn, hanem tovbbra isingerelt llapotban vannak, tovbb vilgtanak. Ezrt ha egy kppont hossz ideig ugyanolyan szn, akkor

    az folyamatosan ltszik, nem alszik el teljesen.A televzis kszlkekben az elektronsugr elszr a pratlan, majd a pros sorokon halad vgig.

    Msodpercenknt 50 flkpet jelent meg, azaz 25 teljes kpet. Ekkor mondjuk, hogy a TV-kszlk 50 Hz-es. Amonitorok ltalban 60-70 Hz-esek, de itt nem mindig rvnyes ez a flkp-kiraks mdszer. MCGAzemmdban gy kell az egszet elkpzelni, hogy az elektronsugr folyamatosan rajzol, kivve horizontlis svertiklis visszatrsekor. Ilyenkor kialszik a nyalb, hiszen ha ilyenkor is felgyjtan a kppontokat, az zavarlenne.

    A horizontlis s a vertiklis visszafutst figyelni tudjuk, meg tudjuk vrni amg egy ilyen visszafutsbekvetkezik. A VGA krtya $03DA llapotregisztere alkalmas erre a clra. A 0. bit a vertiklis vagyhorizontlis, a 3. bit csak a vertiklis visszafutst jelzi. ltalban ezt a bitet figyeljk, mert ha egy vertiklisvisszafuts kzben kezdnk a kpernyre rni, akkor az egyszerre s egyben fog megjelenni. Ha nem figyeljk azelektronsugarat, s gy vltogatjuk egyms utn a klnbz tartalm kpeket, akkor ez darabossghoz vezet.

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    8/117

    8

    Vegynk egy pldt: fekete s fehr kpernyket vltogassunk egyms utn. Ez egyszer memribarssal megvalsthat, 64000 darab 0, utna megint 64000 darab 15 rtk bjtot runk ki az $A000:0000 cmtlkezdve. Az elektronsugr haladsa lassabb, mint a memriba rs. Tegyk fel, hogy a kperny kzepn jr, s a100. sort kezdi ppen frissteni. A kp eddig fekete volt, de mi most hirtelen fehrre vltoztatjuk, azaz avidememria bjtjait 15-s rtkkel tltjk fel. Ez elg gyorsan vgbemegy, tegyk fel, hogy kzben azelektronsugr csak a 101. sorig jutott. Eddig csak fekete pontokat rajzolt (azaz nem rajzolt semmit), hiszen a

    kpmemriban nulla rtk bjtokat tallt. A kperny fels rsze teht fekete. Most a 101. sor kirajzolsakezddik. E sor els kppontjhoz tartoz bjt rtke viszont mr nem nulla, hanem 15, hiszen elzleg az egszkpmemrit 15-tel teltettk. Teht innentl kezdve a kperny fehr lesz. Egyszval a kp fels fele fekete, azals fehr egszen addig, amg be nem kvetkezik egy jabb frissts.

    A kp teht feketrl fehrre vltott, de ez a vlts a kperny kzepn ment vgbe. Ha sokszor egymsutn vgznk el ilyen teljes kpernys szn-vltsokat, akkor az ezzel a mdszerrel darabos lesz, nem lesz szp.De nzznk egy rvid pldaprogramot, mely illusztrlja az ilyen sznvltsok zavar hatst. (rdemesmegjegyezni, hogy a teszt sem a szemnek, sem a monitornak nem tesz jt.)

    {villog1.pas}

    uses Crt;

    procedure Fill( C: byte); assembler; asm { Kperny befestse C sznre }mov es,sega000 { A SEGA000 rtke elre meghatrozott, }xor di,di { A $A000:0000 cmtl indulunk (ES:[DI]) }mov cx,32000 { 320200 bjt=32000 sz kirsa }mov al,Cmov ah,alrep stosw { gy a leggyorsabb s a legrvidebb }

    end;

    begin

    asmmov ax,13hint 10h { MCGA zemmd bekapcsolsa }

    end;repeatFill( 0); Fill(15); { A kperny vltakozik, fekete vagy fehr}

    until keypressed; { Billentynyomsra vge }readkey; { A gomb kdja ne maradjon a pufferben }

    asmmov ax,03hint 10h { Visszatrs a szveges mdhoz }

    end;end.

    A program mint ahogy azt szerettk volna vltogatja a kperny sznt, egyszer feketre, egyszerpedig fehrre. Elvileg. A gyakorlatban ez ennl a pldnl nem valsulhat meg, mert a fent emltett okok miatt a

    kperny sohasem lesz teljesen fehr vagy fekete. Mindig lesz benne egy trsvonal, s radsul mindig mshelyen.

    Ha az elektronsugarat figyeljk, s a vertiklis visszafuts bekvetkeztekor kezdjk el kirakni a 64000bjtot, a vlts nem lesz darabos, villog. Ehhez persze szksges az is, hogy a bjtok rsnak sebessgegyorsabb legyen a visszatrsnl, ellenkez esetben az adatkivitelt beri, s gy hasonlan darabos lesz a kpnk(csak a trsvonal krlbell lland helyen lthat). De egy 80 MHZ-es gp sebessge mr legyzi azelektronsugarat. Nzzk az eljrst, ami egy vertiklis visszafuts bekvetkeztig vrakozik!

    procedure Retrace; assembler; asm { Vertiklis visszafutsra vrakozs }

    mov dx,03dah@1: { A $3da port 3. bitje 1, ha ppen felfe- }

    in al,dx { le halad az elektronsugr }

    test al,8jz @1 end;

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    9/117

    9

    Ezt a szubrutint mindig kzvetlenl a kpre rs eltt alkalmazzuk, mert ha korbban tesszk, akkor azelektronsugr mr elkezd rajzolni, s a kp darabos lesz. Bvtsk a VILLOG1.PAS deklarcis rszt a fentiRetRace eljrssal, s a repeat until fciklust a kvetkezre mdostsuk (a bvtett program aVILLOG2.PAS a lemezmellkleten):

    repeatRetrace;Fill( 0);Retrace;Fill(15);

    until keypressed;

    Mg egyszer az egsz elektronsugr-figyels lnyege: ha akkor mdostjuk a kperny tartalmt, amikoraz elektronsugr fgglegesen visszatr, a vltozs egyszerre kvetkezik be, nem lesz darabos. Ez perszefelttelezi azt, hogy a kpmemria bjtjainak vltoztatsa nem tart tbb ideig mint egy vertiklis visszafuts, samint elkezddik egy ilyen visszafuts, rgtn el kell kezdeni mdostani, hogy elg legyen az id. Teht azegyenletes futs rdekben nem csak alkalmazni kell a fenti (RetRace eljrsban elhelyezked) sorokat, hanem jhelyen kell alkalmazni.

    1.6. A paletta

    A sznes monitorok kppontjai hrom, egy vrs, egy zld s egy kk rszbl llnak. A kppont szneennek a hrom sszetevnek (alapszn komponensnek) a intenzitstl fgg. A VGA krtyk az MCGAkpszerkezetnl 256 sznt tudnak egyszerre megjelenteni. Minden sznhez hozz van rendelve hrom [0..63] zrtintervallumba es egsz szm, mely a szn sszetevinek erssgt hatrozza meg. Az MCGA mdban a palettafelptse a kvetkez. Minden sznsszetev egy bjton van trolva, amely bjtnak csak az als 6 (0-5.) bitjehasznlatos, a kt legmagasabb helyrtk bit llapota lnyegtelen. Minden sznnek hrom, vrs (red), zld(green) s kk (blue) sszetevje van, gy a paletta mrete 3256=768 bjt. A kvetkez tblzatban azalaprtelmezett VGA paletta els tizenhat sznnek RGB (vrs-zld-kk) komponensei olvashatak.

    (Alaprtelmezett paletta a beptett, az MCGA videmd bekapcsolsa utn kzvetlenl aktv paletta.)Szn Neve Crt-azonost R G B0 Fekete Black 0 0 01 Kk Blue 0 0 422 Zld Green 0 42 03 Trkiz Cyan 0 42 424 Vrs Red 42 0 05 Lila Magenta 42 0 426 Barna Brown 42 21 07 Vilgosszrke LightGray 42 42 428 Sttszrke DarkGray 21 21 219 Vilgoskk LightBlue 21 21 63

    10 Vilgoszld LightGreen 21 63 2111 Vilgos trkiz LightCyan 21 63 6312 Vilgos piros LightRed 63 21 2113 Vilgos lila LightMagenta 63 21 6314 Srga Yellow 63 63 2115 Fehr White 63 63 63

    Ebbl a tblzatbl krlbell ltni lehet, hogy melyik komponens milyen arny keverse milyen sznteredmnyez. Sejthetjk, hogy a sttlila komponensei pldul a 21,0,21 lehetnek, s hogy szrke szneket gyllthatunk el, hogy a komponensek rtkei megegyeznek. rdemes a lemezmellkleten tallhat s az 1.6.3.fejezetben lert RGBSET.PAS pldaprogrammal ksrletezni, hogy ksbb, a grafikk ksztsnl mr jrtasaklegynk az additv sznkevers sajtossgaiban.

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    10/117

    10

    A keret szne megegyezik a 0. sznnel, ami alapllapotban fekete. Ezrt ezt nem rdemes mdostani,mert ha megvltoztatjuk, nem lesz olyan szp a jtkunk, nem fog gy tnni pldul egy besz BOB, hogy akperny szlbl csszik be. Ettl fggetlenl persze ppgy megvltoztathatjuk, mint brmely msik sznt, haez a clunk.

    A paletta szneit tetszlegesen mdosthatjuk, gy minden szn 646464=262144 fle RGB rtketvehet fel. sszesen teht ennyi, egyszerre azonban 256 a megjelenthet sznek szma. A vltoztats a VGA

    krtya $03C7-$03C9 regiszterein keresztl valsulhat meg.

    1.6.1. Egy szn RGB-komponenseinek olvassa

    Nagyon egyszer feladat. A $03C7 olvass cmregiszterbe (RGB Read Adress) az olvasni kvnt sznszmt rjuk. Ezutn a $03C9adatregiszter (RGB Data) hromszor egyms utn olvasva megkapjuk a hromrtket, elszr a vrs (R), majd a zld (G), vgl a kk (B) sszetevt. A kvetkez eljrs a fejben megadottR,G,B bjt tpus vltozkban megadja az N. szn alapkomponenseinek rtkt:

    procedure GetRGB( N: byte; var R, G, B: byte); assembler; asm { Az N. szn RGB-komponensei }

    mov dx,03c7h { RGB olvass cmregiszter }mov al,N { Jelezzk a krtynak, hogy az N. szn- }out dx,al { nel fogunk dolgozni (most: olvasni) }mov dx,03c9h { RGB adatregiszter }in al,dx { Els sszetev lekrdezse }les di,Rstosbin al,dx { Msodik sszetev lekrdezse }les di,Gstosbin al,dx { Harmadik sszetev lekrdezse }les di,Bstosb

    end;

    1.6.2. Egy szn RGB-komponenseinek rsa

    Ez az elzhz hasonlan szintn nagyon egyszer feladat. Elszr a $03C8RGB rs cmregiszterbe(RGB Write Adress) a kvnt szn szmt kldjk, majd a $03C9 adatregiszter hromszori rsval llthatjuk bea megfelel rtkeket, a vrs (R), a zld (G) s vgl a kk (B) sszetevt. Erre is nzznk egy pldt, ahol N avltoztatni kvnt szn szma, R, G, B, pedig az sszetevi.

    procedure SetRGB( N, R, G, B: byte); assembler; asm { Az N. szn sszetevinek vltoztatsa }

    mov dx,03c8h { RGB rs cmregiszter }mov al,Nout dx,al { N. szn mdostsa }

    mov dx,03c9h { RGB adatregiszter }mov al,Rout dx,al { R sszetev rsa }mov al,Gout dx,al { G sszetev rsa }mov al,Bout dx,al { B sszetev rsa }

    end;

    1.6.3. Pldaprogramok a paletta mdostshoz

    Az els program segt gyakorolni az ppen szksges szn belltst. Ez a sznvltoztat mdszer a

    ksbbi grafikink elksztsben nagy szerepet fog jtszani, mert gy lehet belltani egy sznt, hogy kzbenltjuk azt, s az alapkomponenseinek rtkeit is. Nem lenne sszer egy program grafikai rsznek

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    11/117

    11

    palettamdostsait szmokkal bevinni, azaz nem clszer egy jtk grafikjhoz gy kitallni a szneksszetevit, hogy kzben magt a sznt nem is ltjuk.

    A programban a httr s a keret sznt, vagyis a 0. sorszm sznt fogjuk mdostani. Indts utn a balfels sarokban hrom fehr (15) szmot ltunk, ezek a httr R-G-B alapkomponensei. A kvetkez billentyksegtsgvel vltoztathatjuk ezeket az sszetevket:

    Q : R komponens nvelse

    A : R komponens cskkentseW : G komponens nvelseS : G komponens cskkentseE : B komponens nvelseD : B komponens cskkentse

    {rgbset.pas}

    uses Crt;

    const

    R: byte = 0; { Alapllapotban a httr s a keret, }G: byte = 0; { vagyis a 0. sorszm szn fekete, RGB }

    B: byte = 0; { sszetev

    inek rtke nulla }

    var

    C: char;

    procedure SetRGB( N, R, G, B: byte); assembler;

    ... { Ez az elz eljrs }

    begin

    textbackground( black); { Kivtelesen szveges zemmdot alkal- }textcolor( white); { mazunk, a palettt itt is meg lehet }clrscr; { vltoztatni, de csak 16 szn ltszik }

    gotoxy( 1, 3);writeln('Billentyk: Q/A: R+/-; W/S: G+/-; E/D: B+/-;'+

    ' ESC: Kilps');repeatgotoxy( 1, 1);write( R:3,' ', G:3,' ', B:3);C:= readkey;

    case upcase( C) of'Q': if R00 then dec(R); { R sszetev cskkentse }'W': if G00 then dec(G); { G sszetev cskkentse }'E': if B00 then dec(B); { B sszetev cskkentse }

    end;SetRGB( 0, R, G, B); { RGB sszetevk vltoztatsa }

    until c=#27; { ESC-re kilps a programbl }SetRGB( 0, 0, 0, 0); { A mdostott szn visszalltsa }

    end.

    A msodik pldaprogram segtsgvel megnzhetnk egy httrtroln trolt palettafjlt. ltalban a256 sznt hasznl jtkok a grafikhoz szksges palettt egy 768 bjt hosszsg fjlban troljk, melynekgyakori kiterjesztse a .PAL . A sznek alapkomponensei egy-egy bjton vannak trolva, sorban, gy jn ki a 768

    bjtos hosszsg. Mi is ebben a formtumban mentjk majd el palettinkat, ezrt nha szksges lehetmegtekinteni egy-egy ilyen fjlt. A program paramterben kell megadni a fjlnevet kiterjesztssel s tvonallal,ha szksges, majd futtats utn megjelenik a paletta. Billentynyomsra lehet kilpni.

    Q W E

    A S D

    R G B+

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    12/117

    12

    {viewpal.pas}

    uses Crt;

    type Colors = record { Egy szn komponensei }R,G,B: byte;

    end;

    var

    f: file; { Vltoz a fjlmveletekhez }x,y: byte; { A FOR... ciklusokhoz vltozk }Palette: array[0..255] of Colors; { Paletta sznei }

    procedure Box8x8( X,Y: word; C: byte);var { 88-as ngyzet kirajzolsa, bal fels }i,j: byte; { sarka koordinti: (X;Y) }

    begin for i:= 0 to 7 do { Most nem assembly utastsokat runk, } for j:= 0 to 7 do { mert a sebessg annyira nem fontos }

    mem[$A000:320*(y+i)+(x+j)]:= C;

    end;

    procedure SetRGB( N, R, G, B: byte); assembler; asm

    ... { Ez az eljrs mr szerepelt feljebb }

    end;

    begin

    if paramcount=0 then halt; { Ha a paramterben nem adunk meg } { semmit, lell a program futsa }asm

    mov ax,13hint 10h { MCGA zemmd bekapcsolsa }

    end;assign( f, paramstr( 1));reset( f, 1);blockread( f, Palette, 768); { Fjl tartalmnak tltse }close( f);

    for x:= 0 to 255 dowith Palette[x] do SetRGB( x, R, G, B); { Paletta belltsa (a 'Palette' vltoz }for x:= 0 to 15 do { adatai szerint) ... } for y:= 0 to 15 do

    Box8x8( x*8, y*8, 16*y+x); { ... s megjelentse }readkey;

    asmmov ax,03h

    int 10h { MCGA zemmd kikapcsolsa } end;end.

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    13/117

    13

    2. BOB-ok megjelentseEbben a fejezetben megismerkednk a BOB-ok megjelentsnek klnbz lehetsgeivel. Lpsrl

    lpsre haladunk, a legegyszerbb megjelenttl a legsszetettebbig. Minden lehetsget kln pldaprog-rammal szemlltetnk, melyekhez igyeksznk rszletes magyarzatot adni. A kulcseljrsok, azaz a legfontosabb,

    a megjelentst vgz eljrsok mindig assembly sorokbl llnak, hiszen mint azt ksbb ltni fogjuk msodpercenknt tbbszr vgre kell hajtani ezt a mveletet. Vegynk egy pldt. Egy BOB-ot mozgatniakarunk. A mozgs akkor lesz tkletes, ha kicsi lpsekbl ll, s kt lps kztt kevs id telik el. s ha tbbBOB-bal dolgozunk, mr lnyegesen szmt, hogy ezt a kulcsfontossg BOB-megjelentst vgz eljrstPascalban vagy assemblyben rjuk.

    A legsszetettebb BOB-megjelents a kvetkez lehetsgekkel rendelkezik: Egyszerre tbb BOB s a httr is lthat a kpernyn. A httr fggetlen a grafikus objektumoktl, s akr tetszlegesen vltozhat is (pldul a

    grgetsnl). A BOB-ok tetszleges helyzetek, mretek s fzisak lehetnek. A BOB-ok bizonyos rszeiken tltszak (transzparensek) lehetnek, vagyis ezeken a pontokon a

    mgttk lv tartalom ltszdik, ami lehet a httr vagy egy msik BOB rsze. Ha egy BOB P.

    fzisnak (X;Y) pontja tltsz, akkor a Shape PWH+WY+X. bjtja zrus. W a Shape bjtbanvett szlessgt, H pedig a magassgt jelli. Ha kt BOB egymson helyezkedik el, akkor meghatrozott, hogy melyik van fell, azaz melyik

    ltszik teljes egszben, s melyik van takarsban. (Meghatrozott a BOB-ok prioritsa.) A BOB-ok kilghatnak a kpbl, azaz nhny esetben csak egy rszk lthat. Ilyenkor gyelni

    kell arra, hogy nem kell s nem is szabad az egsz BOB-ot megjelenteni. A villogst s a darabossgot lehetsg szerint legjobban ki kell kszblni.Nehz lenne elsre az sszes pontot teljesteni, s megrtse is bonyolult lenne. ppen ezrt bontsuk

    szt a lpseket, s mindig tegynk hozz valamit, hogy a vgn megvalsthassuk a fenti kitteleknek eleget teveljrst.

    2.1. Egyszer BOB-megjelent

    Ez a megjelent annyira primitv lesz, hogy csak igen nagy tlzssal lehet BOB-megjelentneknevezni. A magunk el clul kitztt kritriumok kzl egyet sem teljest. Egyszerre csak egy, 1616-os mret,egy fzis, tltszatlan BOB-ot tudunk ltrehozni. Az egsznek rajta kell lennie a kpen, nem tud beszni. Ahttr egyszn, a megjelents pedig meglehetsen villog, lvezhetetlen. Viszont a f eljrs knnyen rthet, s

    j alapot ad a ksbbi, bonyolultabb megjelentkhz.Ez a BOB-brzols nagyon hasonlt a Turbo Pascal Graph egysgnekPutimage eljrshoz. Lnyege

    az, hogy a memrinak egy bizonyos helyrl (ahol a Shape van) 1616, azaz 256 bjtot kell tmsolni akpmemria egy bizonyos bjtjtl kezdve (amit a BOB koordinti alapjn hatrozunk meg), de kzben asorokat szt kell trdelni. Az eljrs vzlata:

    1. Tegyk fel, hogy egyszer mr lefutott az eljrs, s a BOB lthat a kpernyn. A kpmemria azonrszt, amelyben a BOB helyezkedik el, fell kell rni a httr sznvel. gy onnan letakartjuk aBOB-ot. Most nagyon gyorsnak kell lenni, hiszen ilyenkor nem ltszik a BOB, s ha tl sokat

    vrunk, az villogshoz vezet.2. A BOB brzolsa. DS:[SI]-be a Shape, ES:[DI]-be a kperny kezdcmt ($A000:0000) tltjk,

    majd DI-hez hozzadunk 320Y+X-et. Teht kiszmtjuk azt a cmet, ahov a BOB kerl, s eztbetesszk a DI regiszterbe. DS:[SI]-rl ES:[DI]-re msoljuk a Shape adatait a rep movsw utastssal.Minden sor kiraksa utn DI-hez hozz kell adni 304-et (32016-ot), gy a sorok egyms alattelvglag helyezkednek el.

    A program elejn deklarljuk aBOB tpust, amely egy rekord. Ebben a koordintit s a kpmemriabelikezdcmt troljuk. Ez a vltoz trolja a BOB elz helyzetnek cmt, amit a letrlshez fogunk hasznlni. ABOB tpus tartalmaz ezeken kvl egy pointert, ami a Shape kezdcmre mutat. A deklarcis rszben tallhatmg a BOB-megjelent eljrs, majd a fprogram kvetkezik. Itt lefoglaljuk a Shape szmra szksges1616=256 bjtot, majd rtket adunk nekik, vletlenszeren. Az MCGA md bekapcsolsa utn feltltjk akpmemrit a megadott httrsznnel, amit a f ciklus kvet, mely a BOB-ot mozgatja s megjelenti, majd

    billentynyomsra visszalpnk a szveges zemmdba, s befejezzk a programot.

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    14/117

    14

    {showbob1.pas}

    uses Crt; { A Crt egysgre csak a billentynyoms } { figyelsnl lesz szksg }type BOB = record { A BOB nem grafikus adatai: }

    X,Y: word; { szlessg, magassg }CIM: word; { elz cme a trlshez }DT: pointer; { a Shape mutatja-grafikus adatok }

    end;

    var B: BOB; { B a BOB azonostja }i: word; { A FOR..TO..DO ciklusokhoz }

    const C= 1; { A httr sttkk }

    procedure ShowBOB; assembler; asm{ A megjelent eljrs }

    { 1. BOB letrlse, azaz fellrsa C (httr) szn bjtokkal }

    mov es,sega000 { A segA000 rtke a Turbo Pascal 7.0-ban } { elre megadott, $A000 }

    lea bx,B { BX-be tlti a BOB ofszetcmt }mov di,[bx+4] { DI-be a BOB elz helyzetnek cmt }mov al,C { AX bjtjaiba a httrszn kerl, ezzel }mov ah,al { rjuk fell a BOB-ot }cld { Nvekv sorrendben runk }mov dx,16 { 16 sor van, }

    @1:mov cx,8 { s 16 oszlop, aminek a fele 8 (azrt a }{ fele, mert szavakat runk, nem bjtokat)}

    rep stosw { Egy sor trlse }add di,304 { DI a kvetkez sor kezdcme }dec dx { A sorszmll cskkentse }jnz @1 { Ismtls, amg el nem fogynak a sorok }

    { 2. BOB kiraksa az j helyre }

    mov ax,320 { j cm szmtsa a CIM=320Y+X kplettel}mul word [bx+2] { A B BOB cmhez (BX) 2-t adva megkaphat-}

    { juk a BOB ordintjt }add ax,[bx] { [BX] pedig pont az abszcisszt adja }mov di,ax { DI-ben elllt a kpcm, }mov [bx+4],di { amit elreltan elmentnk, hogy a tr- }

    { lshez ne kelljen ismt szmolgatni }push ds { Az adatszegmens megvltozik a MOVSW }

    { utasts miatt, ezrt el kell menteni }lds si,[bx+6] { DS:SI a grafikus adatok kezdcme }mov dx,16 { 16 sor msolsa, }

    @2:mov cx,8 { s 16 oszlop }

    rep movsw { Az aktulis sor megrajzolsa }add di,304 { DI a kvetkez sor kezdcme }dec dx { Egy sort kirajzoltunk }jnz @2 { A tbbi sor kirajzolsa, amg DX>0 }pop ds { Vissza az eredeti adatszegmenst }

    end;

    begin

    with B dobegingetmem( DT, 256); { 1616=256 bjt lefoglalsa a Shape-nek }CIM:= 0; X:= 0; Y:= 92; { Kezdrtket adunk a nem grafikus }randomize; { adatoknak }

    for i:= 0 to 255 do mem[seg(DT^):ofs(DT^)+i]:= random( 256);

    { A BOB pontjai vletlenszerek }

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    15/117

    15

    asmmov ax,13hint 10h { MCGA zemmd bekapcsolsa }

    end; fillchar( mem[$A000:0000], 64000, C); { A kperny C szn (sttkk) } repeat

    ShowBOB; { BOB megjelentse, }inc( X); { mozgatsa balrl jobbra }

    if X=304 then x:=0; { Ha a kperny szlre rt, az elejre } { ugrik }

    delay( 50); { Kis vrakozs, hogy lthat legyen } until keypressed; { Billentynyomsra kilp }readkey; { Billentykd ki a pufferbl }

    asmmov ax,3int 10h end; { MCGA zemmd kikapcsolsa }

    end;end.

    Futs kzben is lthatjuk, hogy ez az brzolsmd a gyakorlatban gy nem alkalmazhat. A BOB

    mozgsa nem egyenletes, darabos s villdz. Viszont gyors. Ha a f ciklusbl eltvoltjuk a delay utastst,akkor szinte nem is ltunk semmit, mert a BOB kiraksa gyorsabb, mint a kpfrissts.

    Egy elnye mgis van ennek az eljrsnak. A megjelents alapjait viszonylag knny itt elsajttani,hiszen nehz lenne megrteni mr elsre a legfejlettebb BOB-brzol eljrst. Ezrt az Olvas, ha nem rtiegszen, ne lpjen tovbb, mert a kvetkez megjelentk mind erre az arnylag primitv eljrsra plnek.

    2.2. Tetszleges httr

    Ha a httr nem egyszn, mint az elz pldaprogram futsa alatt, s a pixelek sznei nem szablyoselrendezsek, azaz ha a videomemriban tallhat kp tetszleges, akkor ms mdszert kell alkalmaznunk aBOB eltvoltsra, amire itt is szksg van, hiszen ha koordinti megvltoznak, akkor el kell valahogy tntetni,

    s csak azutn szabad elkezdeni kirakni az j helyre, mert nem lehet a BOB egyszerre kt helyen.Bizonyra rthet, hogy mirt nem lehet a sznfeltltses mdszert hasznlni. Ekkor ugyanis mdosulna

    a httr, s nem ez a clunk. A megolds, hogy a BOB ltal letakart terletet valamilyen formban trolni kell.Ezt gy fogjuk megvalstani, hogy elre lefoglalunk egy Shape hosszsg rszt a memribl, amire mindenegyes kiraks eltt tmsoljuk a kirakand BOB alatti terletet. Eszerint a megjelent eljrs hrom f lpsblll. Itt is felttelezzk, hogy az eljrs mr egyszer lefutott, vagyis a BOB mr lthat, s a BOB-hoz tartozdinamikus vltoz a BOB ltal letakart httr-rszletet trolja.

    1. A kpernyn mg lthat, elz helyzet BOB-ot el kell tntetni, rmsoljuk az elzleg elmentetthttrrszt.

    2. Kiszmoljuk a BOB kezdcmt, s az ott tallhat 1616-os tglalapot elmentjk.3. Kirakjuk a BOB-ot.

    Legelszr az els lps kimarad, mert klnben a httr mdosulna. Kln eljrsba kerl az 1. lps(ClearBOB) s a 2-3. lpsek (ShowBOB), gy legelszr csak a ShowBOB-ot hvjuk meg.

    Az elektronsugr figyelsvel, vagyis vertiklis visszafutsra vrakozssal megprbljuk kikszblni adarabossgot s a villogst. Ez lelasstja ugyan a futst (elvgre minden megjelentskor vrni kell), de kzbenszebb varzsolja.

    Megoldjuk mg az tltszs problmjt is, azaz a BOB bizonyos pontjain ttetsz lehet, mely pontokona httr megfelel pixele lthat. Ezeket a pontokat gy jelljk, hogy a hozzjuk tartoz Shape-bjtoknak zrusrtket adunk. A feladat megoldshoz egy movsw utastst kell nhny msik paranccsal helyettesteni, melyekmegvizsgljk, hogy az ppen aktulis Shape-bjt nem nulla-e, mert csak akkor lehet kirni ha nem nulla.(Termszetesen brmelyik sznt vlaszthattuk volna transzparensnek. Itt s a tovbbiakban a 0-t hasznljuk erre aclra, mert ez ltalban fekete, az res httr szne).

    A programban elszr lefoglaljuk a szksges 2256 bjt hosszsg memrit, majd betltjk a Shape-

    et, amit a lemezen trolunk. A httrre vletlenszeren kirakunk 1000 tetszleges szn pontot a MEM[ ] tmbsegtsgvel. Ezutn belpnk a megjelent ciklusba, ami billentynyomsig mkdik, s a vgn visszalltjuka szveges mdot (amit a program elejn bekapcsoltunk).

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    16/117

    16

    {showbob2.pas}

    uses Crt; { Megint csak a billenty miatt }

    type BOB = record { Bjt Lers }X: word; { 0. A BOB abszcisszja, ez a 0. s az }

    { 1. bjt a BOB tpusban }Y: word; { 2. Ordinta, 2-3. bjt }A: word; { 4. Elz helyzetnek cme (4-5.) }S: pointer; { 6. Shape mutatja (6-9. bjt) }H: pointer; { 10. Ide kerl a BOB mgtti rsz }

    end;

    var

    B: BOB;f: file; { A grafikus adatokat fjlbl tltjk be }i: word;

    const

    dx: shortint = 1; { Vzszintes irny jelzje (1=jobbra) }dy: shortint = 1; { Fggleges irny jelzje (1=le) }

    procedure ClearBOB; assembler; asm

    { 1. BOB letrlse }

    lea bx,B { BX a BOB cme }mov es,sega000 { $A000 az rtke a SEGA000 konstansnak }mov di,[bx+4] { Elz helyzetnek cme, eltroltuk, gy }

    { nem kell ismt kiszmolni (gyorsabb) }push ds { A DS regiszter kell majd a MOVSW-hez }lds si,[bx+10] { A BOB alatti httrrsz mutatja (H) }

    mov dx,16 { 16 sor van }@1:mov cx,8 { s 8 sznyi oszlop (16) }rep movsw { Egy sor visszalltsa }add di,304 { A kvetkez kezdcme 304-gyel nagyobb }dec dx { Sorszmll cskkentse, }jnz @1 { ismtls, amg el nem ri a nullt }pop ds

    end;

    procedure ShowBOB; assembler; asm { BOB megjelentse }

    { 2. Az j koordintk szerinti 1616-os rsz mentse }

    lea bx,B { BX a BOB ofszetcme (szegmenscme: DS) }mov ax,320 { Kpcm kiszmolsa a szoksos mdon }mul word [bx+2] { Sor cme=320Y }add ax,[bx] { Kppont cme=sor cme+X }mov [bx+4],ax { Kpcm elmentse (B.A szba) }mov si,ax { A forrsindex a kpcm, innen olvasunk }les di,[bx+10] { A clcm a BOB rekord H mezje }push ds { Ugyancsak a MOVSW miatt kell a DS }mov ds,sega000 { A kpmemribl trtnik az olvass }mov dx,16 { 16 sor }

    @1:mov cx,8 { 16 pixel soronknt (16 bjt, 8 sz) }rep movsw { Egy sor elmentse }add si,304 { Forrsindex a kvetkezre mutat }

    dec dx { Egy sort tmsoltunk }jnz @1 { A tbbi sor mentse (ha mg van) }pop ds

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    17/117

    17

    { 3. BOB megjelentse }

    mov es,sega000 { Most ES tartalmazza a kpszegmenst }mov di,[bx+4] { Szerencsre egyszer mr kiszmoltuk a }

    { kpcmet, gy idt s helyet sprolunk }push ds { Megint kell a DS, de most a LODSB miatt }lds si,[bx+6] { A BOB grafikus adatainak kezdcme }mov dx,16 { DX ismt a sorokat szmllja }

    @2:mov cx,16 { CX pedig a pontokat (16 pixel, 16 bjt) }@3:lodsb { DS:[SI] ltal cmzett bjt AL-be tltse}

    cmp al,0 { Ha ez nulla, nem runk semmit a kper- }jz @4 { nyre }mov es:[di],al { Egybknt kirajzoljuk }

    @4:inc di { DI a kvetkez kpbjtot cmzi meg }loop @3 { Kvetkez pixel megjelentse }add di,304 { A kvetkez sor cme }dec dx { Sorszmll cskkentse }jnz @2 { Amg nagyobb nullnl }pop ds

    end;

    procedure Retrace; assembler; asm { Vrakozs egy vertiklis visszafutsra, }

    mov dx,03dah { hogy a megjelents ne legyen darabos, }@1:in al,dx { villdz. A vertiklis visszafuts ide- }

    test al,8 { je alatt a $3DA port 3. bitje 1. Ezt }jz @1 { kell vizsglni }

    end;

    begin

    with B dobegin { A B rekord mezivel foglalkozunk }

    getmem( S, 256); { 1616=256 bjt a Shape szmra, }getmem( H, 256); { 1616=256 bjt a httrrszletnek }assign( f,'rec.dat'); { A grafikus adatok a lemezen vannak, a }reset( f, 1); { REC.DAT fjlban, sorfolytonosan }blockread( f, s^, 256);close( f);x:= 0; y:= 0; { A BOB kiindulpontja a bal fels sarok }

    asmmov ax,13hint 10h { MCGA zemmd bekapcsolsa }

    end;randomize;

    for i:= 1 to 1000 do mem[$a000:random( 64000)]:=random( 256);

    { A httr tetsz

    leges besznezse }ShowBOB; { BOB megjelentse } repeat

    Retrace; { A szp, egyenletes futs miatt vrako- }ClearBOB; { zs a visszafutsra, majd ez id alatt }ShowBOB; { letrljk s jra kirakjuk a BOB-ot }

    { gy nem villog, igaz, lassabb lesz }inc( X, dx); { BOB vzszintes mozgatsa }

    if (X=0) or (X=304) then dx:= -dx; { Kp szln irnyvlts }inc( Y, dy); { BOB fggleges mozgatsa }

    if (Y=0) or (Y=184) then dy:= -dy; { Kp szln irnyvlts } until keypressed;readkey; { A lenyomott billenty kiolvassa }

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    18/117

    18

    asmmov ax,03hint 10h { Visszatrs a szveges mdhoz }

    end; end;end.

    (Megjegyzs: a Turbo Pascal 7.0 beptett assemblyjben a rekordok, objektumok mezire gy is lehethivatkozni: pl. [BX].BOB.X, azonban a knyvbeli programok tbbsge a 6.0-s verziban kszlt, amiben mgnincs meg ez a lehetsg.)

    Az egrkurzor grafikus kpernyn val megjelentse hasonl, csak az egr nyila mr jobboldalt s lentkicsszhat. Vegyk t mg egyszer, milyen elnyei s htrnyai vannak ennek az eljrsnak!

    Elnyk: A httr tetszleges lehet, nem kell egysznnek lennie. A BOB tltsz rszeket is tartalmazhat, ahol a httr ltszik. A megjelents nagyon gyors, prbljuk csak meg eltvoltani a RetRace utastst a fciklusbl! Ha ezutn

    nem iktatunk be egy vrakoz parancsot (delay), akkor az brzols nagy sebessge miatt szinte semmi semlthat. Kevs memrit ignyel, mindssze 256 bjt hosszsg az a dinamikus vltoz, ahol a BOB ltal takart

    httrdarabot troljuk.

    Htrnyok: Csak egy BOB brzolst biztostja, melynek mretei elre meghatrozottak, s csak egyfzis. Nem tudjuk megvalstani a BOB beszst, vagyis nem helyezhetjk el gy, hogy a kperny szle

    keresztbevgja. Prbljuk meg a fciklust a kvetkez sorral helyettesteni:B.X:=312; ShowBOB;Azt szeretnnk ezzel elrni, hogy a BOB csak flig ltszdjon. Ezzel ellenttben a msik fele is megjelenik, a

    msik oldalon s egy sorral lejjebb. (A magyarzat, hogy az MCGA zemmd pixelei sorfolytonos bjtokkntjelennek meg a memriban.)

    A httr nem vltozhat, mert a httr vltoztatshoz a BOB-hoz tartoz puffert is t kellene rni.

    Nos, van mg mit javtanunk, folytassuk a fejlesztst!

    2.3. Tbb BOB egyszerre

    Egyszerre tbb grafikus objektum megjelentsnl kt problma merl fel. Az egyik, amelyiknekmegoldsa egyszerbb, az, hogy ha kt BOB fedi egymst akkor melyik legyen fell, azaz melyik ne legyentakarsban. Ezt egyszeren a megjelents sorrendjvel hatrozhatjuk meg. Amelyik BOB-ot elszr rakjuk ki, azlesz alul, a kvetkez pedig fell.

    A msik nehzsg a httr aktulis rsznek trolsban rejlik. Tegyk fel, hogy csak kt BOBbrzolsrl akarunk gondoskodni, melyek legyenek B1 s B2. B1 pozcija legyen (X;Y), B2- pedig(X+8;Y+8). Most nzzk meg, mi trtnik, ha a httrtrols megjelentst alkalmazzuk, ahogy azt az elzrszben tettk. Az eljrs B1 kirajzolsa eltt lemsolja az (X;Y) bal fels sark 1616-os tglalapot, majdkirakja a B1-es azonostj BOB-ot. Ezutn B2 kvetkezik. Itt viszont baj van, mert a trolsra kerl httr-rszmr tartalmazza a B1 jobb als rszt. Teht ez a B1-rszlet is elmentdik, miszerint a B2 httr pufferben nema valsgos httr tallhat. Ez majd csak a BOB-ok letakartsnl jelent problmt, amit ktflekppenoldhatunk meg.

    B2

    B1

    B2 httrpuffere tartalmazza a B1 egy rszlett teht nem az eredeti htteret.

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    19/117

    19

    Az egyik megolds az, hogy a BOB-okat fordtott sorrendben tntetjk el, mint ahogy kiraktukket. Azelz pldnl maradva a kpernyn ltszik B1 s B2, B2 takarja B1 egy rszt. Ha most ugyanolyan sorrendbentvoltannk el ket, mint ahogy megjelentettk, akkor a B1 jobb als sarka a kpernyn maradna. De hafordtott sorrendben trljkket, akkor lssuk, mi trtnik. B2 eltvoltsa utn ott marad B1, teljes egszben,srtetlenl; hiszen B2 httrpuffere tartalmazta a B1-bl kiharapott rszt. Vgl a B1 eltntetse mr nem okoz

    gondot. Ez a fordtott letrls jnak tnik, mert arnylag kevs memrit ignyel (minden BOB utn 256 bjtot,Shape-pel egytt 512-t). Htrnya, hogy mindegyik objektum ms-ms ideig ltszik. A legelszr brzolt tbbidt tlt a kpernyn, mint az utoljra megjelentett, ez villogshoz vezethet. s ha nem kett, hanem mondjuk256 BOB-ot szeretnnk lthatv tenni, akkor az sszes httr-rszlet eltrolsa mr tetemes memrit emszt fel(1616256 = 65536). Fleg, ha a BOB-ok nem 1616-os mretek, hanem ennl nagyobbak.

    A msik megolds a httr pufferelse. A memriban is trolunk egy 320200-as kpet, amelynektartalma megegyezik a kpmemria tartalmval. gy teht kt ugyanolyan kpnk van, csak az egyik, amelyik anorml memriban van, nem ltszik. Segtsgkkel lnyegesen leegyszersdik a BOB-ok letrlse, azaz akpernyn az eredeti httr visszalltsa. Egyszeren csak t kell msolni BOB-onknt egy-egy 1616-ostartomnyt a megfelel helyre, s mr el is tnt a BOB. A jobb rthetsg kedvrt, nzzk meg rviden, hogyanmkdik az j, tovbbfejlesztett eljrs! Legyen H1 az a httr, amelyik nem ltszik, tartalma vltozatlan, H2

    pedig a valdi kp, amelyik megjelenik, kezdcme $A000:0000, s amelyre a grafikus objektumok kerlnek.

    1. Minden egyes BOB eltrolt kezdcmtl kezdve tmsolunk H1-rl H2-re egy 1616-ostartomnyt.

    2. BOB-ok kiraksa H2-re, de mindegyik BOB-nl meg kell jegyezni annak a kezdcmt (320Y+X),a letrlshez a kvetkez ciklusban.

    Itt nem kell els futtatsnl az els lpst tugrani, hiszen eleinte (BOB-ok megjelentse eltt) H1 sH2 ugyanazt a kpet tartalmazza, gy igaz, hogy hiba, de nyugodtan msolhatunk egyikrl a msikra.Viszont az elektronsugrra annl inkbb figyelni kell! Sok BOB van, ezrt egy-egy megjelentsi ciklusban akpernyn viszonylag sokig nem ltszanak egyes BOB-ok. (Letrlsnl amelyiket elszr tvoltjuk el, azltszik a legkevesebb ideig.) Ha a kperny megtiszttst nem egy vertiklis visszafuts alatt vgezzk, azvillogshoz vezet! Amennyiben nagyon sok BOB-ot prblunk megjelenteni, akkor egy bizonyos hatrtl felfel

    mr gyse lehet kikszblni ezt a villogst, mert a kperny letakartsa tbb ideig tart, mint egy vertiklisvisszafuts. Ez a hatr tbbek kztt fgg a gp sebessgtl, a memriarezidens programoktl, s a BOB-okmrettl. Egy kb. 133 MHz-es gpen 40 BOB megjelentse mg nem okoz gondot, de 50 darab brzolsa mrvillogssal jr.

    A pldban a msodik, a ketts-httr technikt valstjuk meg. A program elejn belltjuk a szksgesadatokat, betltjk a lemezrl a Shape-eket stb. A fciklusban a BOB-ok mozgsa tls irny, falrl lepattan,ezrt a BOB rekordhoz mg hozz kellett venni a DXs DYelemeket, amelyek a vzszintes illetve fgglegesirnyt jelzik.

    {showbob3.pas}

    uses Crt;

    type BOB = record { Egy BOB nem grafikus adatai }X : word; { 0 Vzszintes koordinta }Y : word; { 2 Fggleges koordinta }

    H1 kezdcm: BackGround H2 kezdcm: $A000:0000

    BOB

    BOB

    Httr memriban Kperny kpmemriban

    Ezeket a httr-rszeket kell a kpmemriba msolni, hogy aBOB-ok eltnjenek.

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    20/117

    20

    A : word; { 4 Elz helyzetnek ofszetcme }G : pointer; { 6 Grafikus adatok kezdcme }DX: shortint;{ Vzszintes irny (1: jobb, -1: bal) }DY: shortint;{ Fggleges irny (1: le , -1: fel) }

    { (A 0,2,4,6 szmok a mez tvolsgt je- } { lentik, bjtban, a SHOWBOB eljrshoz) } end;

    const

    Bnum = 15; { BOB-ok szma: BNUM+1 (itt: 16) }Snum = 3; { Shape-ek szma: SNUM+1 }Blen = sizeof( BOB); { A BOB nem grafikus adatainak hossza }

    var

    B: array[0..Bnum] of BOB; { Az sszes BOB nem grafikus adatai }S: array[0..Snum] of pointer; { A grafikus adatok mutati }f: file; { Fjl vltoz a Shape-ek tltshez }n: string[1]; { Ugyancsak a tltshez kell }i: word; { ltalnos vltoz a FOR ciklusokhoz }

    BackGround: pointer; { A httr kezdcme }

    procedure ShowBOB; assembler; asm

    { Vrakozs, amg nincs vertiklis visszafuts }

    mov dx,03dah { Nagy hiba lenne ezt a rszt kihagyni, }@W: { az villogssal jrhat. Lass gpeknl }

    in al,dx { ez gy is elfordulhat, ilyenkor nem r }test al,8 { vget egy elektronsugr-visszatrs }jz @W { alatt az eljrs 2. s 3. rsze }

    { 1. A BOB-ok helyre az eredeti httr-rszletek visszarsa }

    mov es,sega000 { A kperny szegmenscme }cld { D bit eloltsa a sztring-mveletekhez }mov cx,bnum { BNUM(=16) db BOB eltvoltsa }

    @1:push cx { A REP utastshoz is szksg lesz CX-re }lea bx,b { A BOB-adatokat trol tmb cme }mov ax,blen { BX-hez annyit kell adni, hogy az az ak- }mul cx { tulis (CX.) BOB-ra mutasson }add bx,ax { (BX:=BX+CXBOB tpus hossza) }mov di,[bx+4] { A BOB elz helyzetnek cme ('A' mez) }push ds { A MOVSW utastshoz kell }lds si,background { A httr kezdcme DS:[SI]-be }

    add si,di { SI-hez a kpcm hozzadsa }mov dx,16 { Most is a DX szmllja a sorokat }@2:

    mov cx,8 { s CX az egy sorban lv szavakat }rep movsw { 16 pixel visszalltsa httr sznre }add di,304 { Kvetkez sor: DI:=DI+320-16 }add si,304 { A httr szlessge is 320 bjt }dec dx { Eggyel kevesebb a visszarand sor }jnz @2 { Ismtls, amg DX el nem ri a nullt }pop dspop cx { CX jra a BOB-okat szmllja }loop @1 { Tbbi BOB eltntetse }

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    21/117

    21

    { 2. BOB-ok kiraksa }

    mov cx,bnum { CX most is BOB-szmll }@3:

    push cx { Most is menteni kell, pontszmll lesz }lea bx,b { Megint gy jrunk el, mint a 2. rszben }mov ax,blen { (ahhoz, hogy a BX regiszter az aktulis }mul cx { BOB-ra mutasson) }add bx,axmov ax,320 { Kpcm szmtsa a szoksos mdon }mul word [bx+2] { A 3. bjttl tallhat az ordinta }add ax,[bx] { Az 1. kt bjt pedig az abszcissza }mov di,ax { DI-ben elllt a kpcm (320Y+X), }mov [bx+4],ax { amit elmentnk a BOB eltvoltshoz }push ds { Most a LODSB-hez kell }lds si,[bx+6] { A forrscm a BOB tpus 7. bjtjtl }

    { kezddik, ez a Shape-re mutat }mov dx,16 { Mg mindig 16 sorbl ll a BOB }

    @4:mov cx,16 { s ugyangy 16 pontbl egy sor }

    @5:lodsb { DS:[SI]-vel cmzett bjt tltse, SI n }cmp al,0 { Ha ez a bjt nulla, nem kell kirni a }jz @6 { kpernyre, mert itt a BOB tltsz }mov es:[di],al { Egybknt igen }

    @6:inc di { DI a kvetkez kppontot cmzi }loop @5 { Egy egsz sor megjelentve, ha CX=0 }add di,304 { ES:[DI] a kvetkez kpsor (X-1). bjt- }

    { jnak cme }dec dx { Sorszmll cskken }jnz @4 { Sorok kiraksa, amg szmlljuk (DX)>0 }pop dspop cx

    loop @3 { Tbbi BOB megjelentse } end;

    begin

    { 1. Httr, kperny belltsa }

    asmmov ax,13hint 10h { MCGA zemmd bekapcsolsa }

    end;getmem( BackGround, 64000);randomize;

    for i:= 1 to 1000 do mem[$a000:random( 64000)]:= random( 256);move( ptr($A000, 0)^, BackGround^, 64000);{ A httr ugyanazt a kpet tartalmazza, mint a kperny }

    { 2. Grafikus adatok betltse }

    for i:= 0 to Snum dobegingetmem( S[i], 256); { A Shape hossza 1616=256 bjt }str( i, n);assign( f, 'bob'+n+'.dat');reset( f, 1);seek( f, 7); { Az els 7 bjt lnyegtelen (pl. mret) }blockread( f, s[i]^, 256);

    close( f); end;

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    22/117

    22

    { 3. Nem grafikus adatok vletlenszer belltsa }

    for i:= 0 to Bnum dowith B[i] dobeginG:= S[random( Snum+1)]; { Vletlenszer minta kivlasztsa }X:= random( 303)+1;Y:= random( 183)+1;DX:= 2*random( 2)-1; { rtke csak -1 vagy +1 lehet }DY:= 2*random( 2)-1; { rtke csak -1 vagy +1 lehet }

    end;

    { 4. Fciklus, megjelents s mozgats billentynyomsig }

    repeatShowBOB;

    for i:= 0 to Bnum dowith B[i] dobegininc( X, DX); if (X=0) or (X=304) then DX:=-DX;inc( Y, DY); if (Y=0) or (Y=184) then DY:=-DY;

    { Falrl lepattan mozgs } end; until keypressed;

    readkey;{ 5. Visszatrs a szveges mdhoz, vge }

    asmmov ax,03hint 10h { Visszatrs a szveges mdhoz }

    end;end.

    A lemezen lv grafikus adatfjlok (pl. BOB3.DAT) csak a 8. bjtjuktl kezdve tartalmazzk a Shapeadatait, sorfolytonosan, gy ahogy a memriban is trolni szoktuk. Az els 7 bjt a Shape mreteit s fzisaithatrozzk meg, ami adott (1616, 1 fzis. Ez okbl ugrottunk a fjl 7. bjtjra a seekutastssal. (A Shape-ek aBOB-Editorral kszltek, melynek fjlformtumrl rszletesebben a 6. fejezet elejn olvashatunk.)

    Ezzel a mdszerrel elvileg 5389 BOB-ot brzolhatunk. Viszont ha ezt a szmot (azaz nla eggyelkevesebbet 5388-at) berjuk a Bnum konstans utn, s gy futtatjuk a programot, akkor az eredmny: akperny tele lesz fejecskkkel, szvekkel, rombuszokkal s almkkal (ezek a BOB-ok), s temesen elsttl,mindig, amikor egy BOB-letrl rsz fut. De mr kevesebb BOB-nl is feltn zavar hatsokat vehetnk szre,100 BOB megjelentsnl a kp fels rszben azok nem ltszdnak. Ez azrt van, mert az elektronsugr mrelkezdte frissteni a kpet, mieltt az sszes BOB eltntetse s jbli kiraksa befejezdtt volna, azaz aShowBOB eljrs futsi ideje tbb, mint egy vertiklis visszafuts.

    A htteret nem tudjuk egyszeren vltoztatni. Ez majd akkor okoz problmt, ha olyan jtkotszeretnnk rni, amelyik szntere nagyobb egy kpernynl, gy azt grgetni akarjuk. A BOB-ok mg mindiglland mretek s fzisak (16161), s nem tudnak beszni. Szmuk korltozott, gptl fgg. Folytassukteht a fejlesztst!

    2.4. Vltoztathat httr, animlt BOB-ok

    Tovbbfejlesztjk az eljrst, bvtjk egy lpssel, hogy tetszleges szm BOB brzolsa se jrjonvillogssal. A bvts lnyege, hogy a kpalkots a memriban trtnik, s az ott elksztett, mr ksz kpetrakjuk ki a kpmemriba. Ehhez az eljrshoz szksg van teht a memriban mg egy 320200 bjt hossztartomnyra, a munkaterletre. Ez a munkaterlet ltest kapcsolatot a grafikai adatok (httr, Shape-ek) s akpmemria kztt. Hasznlatnak elnye: a BOB-ok letrlsnek s jbli kiraksnak ideje megnhet, amilegfeljebb a program futst lasstja, de villogst mr nem okoz. gy tbb BOB-ot tudunk zavar hatsok nlklbrzolni, s a htteret is knnyebben vltoztathatjuk. A munkaterlet lnyegnek knnyebb megrtsheznzzk meg eljrsunk lpseit, mely megmutatja azt is, hogy a httr egy egyszer memriba rssal

    mdosthat.

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    23/117

    23

    1. Az egsz httr, azaz 32000 sz tmsolsa a munkaterletre a movsw utasts segtsgvel.2. BOB-ok megrajzolsa a munkaterleten.3. Munkaterlet (32000 sz) msolsa a kpmemriba, vagyis maga a megjelents.

    A kvetkez bra szemlletesebb teszi az brzolsnak ezt a mdszert, s segt megrtetni amunkaterlet hasznlatt. A nyilak memribl memriba msolst, a nyilak feletti szmok ezek sorrendjt

    jellik.

    Ha a htteret egyszer csak gykeresen megvltoztatjuk, az sem okoz problmt, gy fogjuk tapasztalni,mintha az a BOB-ok mgtt vltozott volna meg, teht elrtk clunkat. Viszont mi lenne akkor, ha az els

    lpsben nem az egsz htteret msolnnk, hanem csak azon rszeit, amit a munkaterleten a BOB-ok takarnak?Nos, ez nylvn lland httrnl gyorsabb futst eredmnyez, de azt vltoztatni nehezebb lenne. Meg knevltoztatni magt a htteret s a BOB-oktl mentes munkaterletet is. Ez grgetsnl 264000 bjt mozgatst

    jelenti, ami semmiben sem gyorstja a futst, hanem mg lasstja is. Vltozatlan httrnl bevlik, ennek ellenrenem trnk ki kln erre a mdszerre.

    Mirt van szksg arra, hogy a kpet a munkaterleten lltsuk el? Ez fleg a scrollozs, grgets miattvan gy. Ha egy jtkban a htteret grgetjk, akkor minden grdtsi fzisban az egsz kperny tartalmamegvltozik, hiszen minden egyes pixelnek ms helyen kell megjelennie. Teht mindig fell kell rni az egszkpernyt, azaz 64000 bjttal bizonyos mveleteket kell vgrehajtanunk. Amg a kpernyt odbb toljuk,vagyis ppen fellrjuk a grdts miatt, a BOB-ok nem ltszanak, s ez a mvelet hosszsga (64k bjt) miatters villogshoz vezet. Ha a memriban, a munkaterleten vgezzk mindezt, az nem jr villogssal, mert akpernyn a kp korbbi llapota ltszdik, egszen a 3. lps vgrehajtsig.

    Lehet

    sg nylik az animcira is, a BOB-ok tbb fzisak lehetnek. Ezt egy egyszer

    szorzsbeszrsval rjk el, aminek eredmnyt hozzadjuk a Shape-re mutat forrsindexhez, gy az mr a kvntfzisra mutat. A pldaprogramban a BOB-ok mrete mg mindig 1616, fzisaik szma viszont 4. Ebbladdan egy-egy Shape helyfoglalsa 16164=1024 bjt.

    {showbob4.pas}

    uses Crt;

    type BOB = record { Bjt Tartalom }X,Y: word; { 0;2 Koordintk }P: word; { 4 Aktulis fzis sorszma (0-tl) }Shp: pointer; { 6 Grafikus adatok kezdcme }V,F: shortint; { Vzsz. s fgg. irnyjelz bjtok }

    end;

    const

    Bnum = 15; { Megjelentend BOB-ok szma -1 }Snum = 3; { A BOB-okhoz tartoz mintk szma -1 }Blen = sizeof( BOB); { Egy BOB tmbelem hossza a memriban }Pspd = 10; { Fzisvltsi ksleltets }

    Pcur: word = 0; { Szmll a fzisksleltetshez }Retr: boolean = true; { Vertiklis visszatrs figyelse }

    var

    B: array[0..Bnum] of BOB; { BOB nem grafikus adatok tmbje }

    S: array[0..Snum] of pointer; { Grafikus adatok tmbje }BackGround, Workarea: pointer; { Httr s munkaterlet cme }f: file;

    Httr(BackGround)

    Munkaterlet(WorkArea)

    Kperny($A000:0000)

    BOBBOB

    1.

    2.

    3.

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    24/117

    24

    i: word; { ltalnos cl vltozk }n: string[1];

    procedure ShowBOB; assembler; asm

    { 1. Httr msolsa a munkaterletre, 32000 sz mozgatsa }

    cld { D-bit eloltsa, gy az indexregiszte- } { rek nnek a karakterlnc-mveleteknl }

    mov cx,32000 { 320200 bjt = 32000 sz }push ds { A DS regisztert megvltoztatjuk }les di,workarea { A clcm a munkaterlet kezdcme }lds si,background { A forrscm pedig a httr kezdcme }rep movsw { A belltsok utn lehet msolni }pop ds { Az adatszegmens visszalltsa }

    { 2. BOB-ok felraksa a munkaterletre }

    mov cx,bnum { BNUM a BOB-ok szma }@1:

    push cx { CX majd msra is kell }lea bx,B { A BOB-adatok tmbjnek kezdcme BX-be }mov ax,blen { BX-hez CXBLEN-t adva megkapjuk az ak- }mul cx { tulis (CX-edik) BOB nem grafikus ada- }add bx,ax { tainak kezdcmt }les di,workarea { A clcm nem a kperny, hanem a }

    { munkaterlet kezdcme }mov ax,320 { Kiszmtjuk annak a bjtnak a cmt, a- }mul word [bx+2] { mi a BOB bal fels sarka alatt lesz }add ax,[bx] { A kplet jl ismert: cm=320Y+X }add di,ax { ES:[DI] mr a megfelel bjt cme }push ds { DS lesz a forrsszegmens }mov ax,256 { A Shape kezdcmhez P256-ot kell adni,}mul word [bx+4] { hogy az aktulis fzis (P) cme legyen }

    lds si,[bx+6] { A forrscm a Shape cme, csak mg hoz- }add si,ax { zadunk P256-ot. (Fzishossz: 1616 b) }mov dx,16 { Ahogy megszoktuk, DX a sorok szmllja }

    @2:mov cx,16 { CX pedig a soron belli pixelek }

    @3:lodsb { A Shape egy bjtjnak betltse }cmp al,0 { Ha ez nulla, nem kell a munkaterletre }jz @4 { rni semmit }mov es:[di],al { Egy pixel kigyjtsa a munkaterleten }

    @4:inc di { A kvetkez bjt cme eggyel nagyobb }loop @3 { Egsz sor kiraksa ciklus alja }

    add di,304 { Kvetkez

    sor els

    bjtjnak cme }dec dx { Eggyel kevesebb sort kell mg kirakni }jnz @2 { 16 sort kell kirakni, ismtls }pop dspop cxloop @1 { Tbbi BOB megrajzolsa a munkaterletre }

    { 3. Munkaterlet msolsa a kpernyre, maga a megjelents }

    { 3.1. Ha a RETR logikai vltoz igaz, vrakozs az elektronsu-gr fggleges irny visszatrsre }

    cmp retr,0jz @6 { Ha a RETR hamis, nem kell vrni }

    mov dx,3dah

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    25/117

    25

    @5:in al,dxtest al,8jz @5 { Csak visszafuts alatt folytatdhat }

    { 3.2. Az 1. rszhez hasonlan 32000 sz mozgatsa }

    @6:mov es,sega000 { MCGA kpmemria szegmenscme $A000 }xor di,di { A bal fels sarokbl kezdnk (DI=0) }mov cx,32000 { 32000 sz, 64000=320200 bjt }push dslds si,workarea { A forrscm a munkaterlet kezdcme }rep movsw { Msols }pop ds { Soha ne felejtsk a DS regiszter erede- }

    { ti rtkt visszalltani! } end;

    procedure Pixel( A: word; C: byte); assembler; asm

    { C szn

    pont kiraksa a httrre, A=320Y+X (X;Y-koordintk) }les di,background { Most a httrre rajzolunk }add di,Amov al,Cmov es:[di],al

    end;

    begin

    { 1. Belltsok, inicializlsok, helyfoglalsok }

    randomize;

    getmem( BackGround, 64000);getmem( Workarea, 64000); for i:= 0 to Snum dobegin

    getmem( S[i], 1024); { A Shape hossza 41616, 4 fzisbl ll }str( i, n);assign( f, 'anim'+n+'.dat');reset( f, 1);seek( f, 7); { Az els 7 bjt szmunkra nem fontos, }

    { lersuk a kvetkez rszben (2.5.) }blockread( f, s[i]^, 1024);close( f);

    end; for i:= 0 to Bnum dowith B[i] dobegin

    Shp:= S[random( Snum+1)];

    X:= random( 303)+1;Y:= random( 183)+1;P:= random( 4);V:= random( 3)-1; { A BOB egyszerre kt, egy vagy nulla i- }F:= random( 3)-1; { rnyba mozoghat }

    end; asm

    mov ax,0013hint 10h

    end; for i:= 0 to 63999 do Pixel( i, 0); { A httr kezdetben fekete }

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    26/117

    26

    { 2. Fciklus, megjelents s mozgats, animci }

    repeatShowBOB;

    for i:= 0 to 3 do Pixel( random( 64000), random( 256)); { Httr vltoztatsa } for i:= 0 to Bnum dowith B[i] dobegin

    inc( X, V); if (X=0) or (X=304) then V:=-V;inc( Y, F); if (Y=0) or (Y=184) then F:=-F;

    end;inc( Pcur);

    if Pcur=Pspd thenbegin{ Fzisksleltets, csak minden }{ PSPD-edik temben van fzisvlts }

    Pcur:= 0; for i:= 0 to Bnum dowith B[i] dobegin

    inc( P); if P=4 then P:= 0; end; end; until keypressed;

    readkey;

    { 3. Videomd visszalltsa, vge }

    asmmov ax,3int 10h

    end;end.

    Itt abba is hagyhatnnk a fejlesztst, mert mr majdnem minden kritriumot teljestettk. Kt dolgot kellmg megvalstanunk: a BOB-ok legyenek tetszleges mretek, s ha gy helyezzk el, hogy a kperny szlekettszelje ket, akkor csak az a rszk ltszdjk, ami a kpernyn rajta van. Sok jtkban szksg van a

    beszs lehetsgre, mert mondjuk egy autversenyzs jtkban igazn nem lenne szp, ha az autk csak gyhirtelen megjelennnek. A BOB-ok tetszleges mretnek szksgessge pedig egyrtelm, mert pldul egylvldzs programban egy 11-es lvedknek 1616-os mret Shape-et adni egyszeren pazarls.

    Ennek az brzolsmdnak kt nagy problmja van: lass s sok memrit ignyel. Lasssga abblfakad, hogy minden megjelentsnl legalbb 264000 bjtot kell mozgatni, s ehhez mg hozzjnnek a BOB-ok. Ez azt jelenti, hogy a futs csak egy 80 MHz-es gptl lesz egyenletes s szp, ha a visszatrsre vrakozstalkalmazzuk (RetRace). Ennl lassabb gpeknl rdemes ennek a vltoznak hamis rtket adni, ezzel nveljkvalamivel a sebessget. Msik gyorst mdszer az lehetne, hogy a BOB-ok letakartshoz a SHOWBOB3.PAS

    programban megismert mdszert alkalmaznnk, ezzel azonban kizrnnk a httr vltoztathatsgnaklehetsgt, azaz pldul nem tudnnk azt grgetni, ami sok jtkhoz nlklzhetetlen. A programfutssebessgt a processzor sebessge mellett nagymrtkben meghatrozza a videokrtya sebessge. Az jabb PCI

    buszos krtyk szerencsre mr elg gyorsan tudjk kezelni a videomemrit, gy a mdszer jl hasznlhat.

    Rgebbi ISA buszos krtykon a futs elg lass lehet.A msik gond a nagy memriaigny, amit a SHOWBOB2.PAS pldaprogram megjelent eljrsbanmegvalstott httrrsz-trol mdszerrel tudnnk kikszblni, ez azonban lehetetlenn tenn a httrtetszleges vltoztatst. A munkaterlet kiiktatsnak meg azrt nem lenne rtelme, mert ha adott szm BOBadott gpen villogsmentesen megjelenthet, annak brzolsa lassabb gpen mr villogssal jrhat. sklnben is mg gyors gpen is nagy esly van a villdzsra, hiszen minden vgrehajtskor az egsz kpernytfellrjuk, azaz elg sokig ltszik csak a httr.

    Ezeket a problmkat teht nem fogjuk s nem is kell megoldani. Ha az Olvas olyan programotszeretne rni, amiben a httr vltozatlan, nyugodtan kombinlhatja a megjelentket a szmra optimlismemriafoglals s sebessg szerint.

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    27/117

    27

    2.5. Teljes megjelents

    Elrkeztnk a BOB megjelents utols rszhez, amely a fejezet elejn megfogalmazott felttelekmindegyikt teljesti. Egyszerre tbb transzparens, tetszleges mret s fzis BOB jelenthet meg, melyekkpesek beszni, s a httr tetszlegesen vltoztathat. A villogs szinte kizrva. A 2.4. fejezet

    pldaprogramjhoz kpest kt j dolgot valstunk meg, a BOB-ok tetszleges mretek s helyzetek lehetnek.

    Az brzols f lpsei ugyanazok lesznek mint az elz pldban, csupn a BOB rekordot bvtjknhny elemmel, s persze a ShowBOB eljrst is. A brmekkora mret megvalstsa az egyszerbb feladat,annyi az egsz, hogy az eljrsban kt 16-os szm helyett (ennyi volt a szlessg s a magassg) egy-egy vltoztrunk. A BOB-ok mretnek s fzisszmnak kivlasztsnl csupn egyvalamire kell gyelni, hogy a Shapemrete ne haladja meg a 64K bjtot.

    Az, hogy a BOB a kperny szln is megjelenhessen mr egy kicsit sszetettebb. Meg kell vizsglni,hogy melyik irnyban lg ki s mennyire. Az is megeshet, br ritka, hogy a BOB egyszerre mind a ngy irnybankilg a kpbl. Ez pldul egy 322202-es mret objektumnl fordulhat el, de ilyen nagy BOB-ot nincsrtelme megjelenteni. Ellenben az gyakori, hogy egyszerre kt irnyban nylik ki a kpbl, pldul ha akperny sarkn helyezkedik el.

    Hogy a kperny fels vagy bal oldali szln is megjelenhessen, integer tpus koordintkat fogunkhasznlni. A kperny bal fels sarka lesz a (0;0) pont, ettl balra s felfel az adott irnyhoz tartoz koordintanegatv. Ha egy BOB bal oldalrl szik be, akkor els koordintja negatv s egyre n. gy teht van egy nagykoordinta-rendszernk, melynek szlessge s magassga egyarnt 65536 pixel, s egy arnylag kicsi, 320200-as tglalap alak tartomnya a kperny.

    Egy BOB, koordinti alapjn hromfle helyzet lehet:

    a) Teljes terjedelmben rajta van a kpernyn. Ilyenkor nem okoz nagy problmt a megrajzolsa, a korbbankidolgozott mdszert kell alkalmazni, egy kis vltoztatssal persze, hogy tetszleges mret lehessen.

    b) Csak egy rsze van rajta a kpernyn. Ez a legbonyolultabb, mert meg kell hatrozni, melyik tglalap alaktartomnya ltszik, s ezt s csak ezt a rszt kell megjelenteni.

    c) Nincs rajta a kpernyn. Ez a legegyszerbb, mert nem kell semmit tenni. Ha nem csinlunk semmit, akkor aBOB nem ltszik.

    Nzznk egy brt, amely szemllteti a koordinta-rendszert, benne a kperny

    t s a BOB-ok klnbz

    elhelyezkedsi lehetsgeit.

    Eddig 304184-es mret koordinta-rendszereket alkalmaztunk (azrt nem 320200-asat, mert akkor a1616-os BOB-ok a szlre kerltek volna), ami csak a kpernyt foglalta magba. Most ezt kibvtettk,ltrehozvn ezzel egy 6553665536 nagysg rendszert, aminek rsze a kperny. A bvts miatt felmerlt egy

    problma, hogy egy BOB lehet olyan helyzet, hogy a kperny szle keresztl szelje, s ilyenkor megjelentseegy fokkal sszetettebb. Ezt a problmt igyeksznk az albbiakban megoldani.

    A megjelentst vgz eljrs BOB kirak rsze (2.) a kvetkez lpsekkel mdosul:1. Ellenrizzk, hogy a BOB rajta van-e a kpernyn, egyszer sszeadsok s kivonsok segtsgvel. Ha nincs

    rajta, nem kell brzolsval a tovbbiakban trdni.2. Meghatrozzuk a BOB-on bell azt a tartomnyt, ami lthat. Ha az egsz BOB lthat, akkor ennek a

    tartomnynak a mretei megegyeznek a BOB mreteivel.

    (-32768;-32768)

    (32767;32767)

    (0;0)

    (319;199)

    a) BOB, amelyik teljesen ltszik

    b) BOB, amelyiknek csak egy rsze ltszik

    c) BOB, amelyik nem ltszik

    Kperny szle

    Koordinta-rendszer szle

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    28/117

    28

    3. Kirajzoljuk a meghatrozott tglalap alak BOB-rszletet a munkaterletre. A korbbiakkal ellenttben nemszabad folytonosan msolni a bjtokat, a rszlet minden sora utn valamennyivel nvelni kell a szmllt,hiszen nem szabad az egszet megjelenteni.

    Azt, hogy egy BOB a kperny szln helyezkedik el, ngy alapesetre bonthatjuk, majd ezeket kombinlvabrmilyen elhelyezkeds BOB-okat tudunk brzolni. Nzzk teht ezt a ngy esetet:

    Csak a kperny bal szle szeli keresztl. Ekkor a BOB megrajzoland rsze keskenyebb lesz, minden sorkirsa eltt a forrsindexet meg kell nvelni annyival, amennyivel a BOB balra kilg, vagyis azabszcisszjnak (-1)-szeresvel.

    A kp jobb szle vgja kett. Ez esetben a megrajzoland rsz minden sora utn a forrsindexet nvelni kellannyival, amennyivel a BOB abszcisszjnak s szlessgnek sszege 320-nl nagyobb.

    Ha a kperny teteje metszi el, akkor a kiraks eltt kell megnvelni a forrsindexet -YW-vel, ahol Y aBOB ordintja, W pedig a szlessge.

    Amikor a kp als szln helyezkedik el, egyszeren cskkenteni kell a sorkiraks szmlljt a rajzolsmegkezdse eltt. Nyilvn minden esetben, amikor a BOB mrete cskkent, az aktulis irnyhoz tartozszmllt is cskkenteni kell, hiszen nem szabad tbbet kirakni belle, mint amennyi ltszik.

    Ha egyszerre a kperny tbb szle is keresztlmegy a BOB-on, akkor sszegezni kell nhnyat a ngy alapesetkzl. Pl. ha a bal fels sarkt tartalmazza, akkor mindenekeltt nvelni kell a forrsindexet annyival,amennyivel felfel nylik ki, majd minden sorrszlet kiraksa eltt annyival, amennyivel balra lg ki akpernybl, egyszval kombinljuk az els s a harmadik alapesetet. Ha a kp jobb s bal oldaln is tlnylik,akkor az els kt esetet kell egyszerre alkalmaznunk.

    Az albbiakban kt brt lthatunk, kt szlssges helyzetet arra nzve, hogy a BOB hny kpszlttartalmaz. A bal oldali rajzon egyet sem, teht teljes egszben lthat, a jobb oldali pedig mind a ngy szlttartalmazza a kpernynek gy a sarkait is. A betk jelentse: X, Y koordintk, W szlessg, H magassg, U = 320-X-W, V = 200-Y-H.

    A megjelents tovbbra is hrom lpsbl ll, melyek megegyeznek az elz rszben lertakkal (1.httr msolsa a munkaterletre, 2. BOB-ok megjelentse a munkaterleten, 3. munkaterlet msolsa a

    kpmemriba). A msodik lps, a BOB-ok rajzolsa ms, amelyet a fenti brk segtsgvel runk le. El szrmegnzzk, hogy az X, Y, U, V vltozk kzl melyik negatv. Ha egyik sem, akkor az egsz BOB lthat, snem kell tovbb azzal trdni, hogy a BOB mely rszt kell kirajzolni, mert az egsz BOB-ot meg kell jelenteni.

    Ha a ngy rtk kzl negatvX A BOB a kperny bal szln van. DI (a munkaterletre mutat) eltolsa 320Y, a sorok kiraksa utn 320-

    (W+X)-szel n. Minden sor kirajzolsa eltt az SI (Shape ofszetjre mutat) regisztert meg kell nvelni -X-szel. s CX (oszlopszmll) rtke minden sor kiraksakor W+X lesz. (X

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    29/117

    29

    Vegyk pldul a fenti jobb oldali brt. SI-hez eleinte hozzadunk -YW-t, majd -X-et, s minden sor kiraksautn -U+(-X)-szel nveljk. DI eltolsa nulla, vagyis a munkaterlet elejre mutat, egy sor kiraksa utn nem kellnvelni semmivel, mert a BOB a kperny minkt fggleges szln is tlnylik. CX 320, DX rtke pedig 200.

    Ez mr gy meglehetsen szraz s rthetetlen, ezrt nzzk magt a pldaprogramot! A fenti brk

    sokat segthetnek a krdses BOB-megrajzol rsz megrtsben.

    {showbob5.pas}

    uses Crt;

    type BOB = object{Eltols}{00} A : wordbool; { Aktivitsjelz. Ha TRUE, akkor lthat }

    {02} X : integer; { X koordinta (abszcissza) }{04} Y : integer; { Y koordinta (ordinta) }{06} LX: word; { Szlessg (lx=0-nl ez 1 kppont) }{08} LY: word; { Magassg (ly=0-nl ez 1 kppont) }{10} P : word; { Fzisszmll (p=0 : els fzis) }{12} DT: pointer; { Shape helye a memriban }{16} PL: word; { Egy fzis helyfoglalsa }{18} W : word; { Valsgos szlessg (width ) }{20} H : word; { Valsgos magassg (height) }{22} LN: word; { Shape helyfoglalsa bjtban }{26} PN: word; { Fzisszm (fzisok 0-val kezddnek) } procedure Load( FileName: string); { Shape betltse lemezrl } end;

    const Bnum = 1; { Most csak kettt jelentnk meg }Blen = sizeof(BOB); { BOB tpus hossza }Retrace: boolean = true; { Vertiklis visszafuts-jelz }

    var B: array[0..Bnum] of BOB; { BOB-ok nemgrafikus adatai }BackGround:pointer; { Httr mutatja }WorkArea: pointer; { Munkaterlet mutatja }u,v: integer; { A SHOWBOB eljrs hasznlja ket }i: word; { ltalnos cl vltoz (FOR ciklushoz) }

    procedure BOB.Load;var f: file;beginassign( f, FileName);reset( f, 1);seek( f, 1); { A fjl els bjtja nem hasznlatos }blockread( f, LX, 2); { A 2-3. bjt a Shape szlessgt adja }blockread( f, LY, 2); { A 4-5. pedig a magassgt }blockread( f, PN, 2); { Ezt kvet sz a fzisok szma }W:= LX+1; H:= LY+1; { Az igazi mretek eggyel nagyobbak }PL:= W*H; { Egy fzis hossza = szlessg magassg }LN:= PL*(PN+1); { Shape hossza = fzishossz fzisszm }getmem( DT, LN); { Helyfoglals a Shape-nek }blockread( f,DT^,LN); { Grafikus adatok betltse }close( f);A:= true; { Bekapcsoljuk, hogy lthat legyen }P:= 0; { A fzismutatt az elsre lltjuk }

    end;

    procedure ShowBOB; assembler; asm { Ez a f eljrs, a megjelentst vgzi }{ 1. Httr msolsa a munkaterletre }

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    30/117

    30

    push bp { BP regisztert msra hasznljuk, }mov bp,ds { az adatszegmenst troljuk benne }mov cx,32000 { A httr hossza 32000 sz (64000 bjt) }cld { D jelzbit trlse a REP utastshoz }les di,workarea { ES:[DI] mutat a munkaterletre }lds si,background { DS:[SI] pedig a httrre }rep movsw { Httr msolsa a munkaterletre }mov ds,bp { DS jra az eredeti adatszegmens }

    { 2. BOB-ok rajzolsa a munkaterletre }

    mov cx,bnum { BNUM BOB kiraksrl kell gondoskodni }@putbob: { Egy BOB kiraksa ciklus kezdete }

    push cx { CX-et majd msra hasznljuk (oszlopszm-} { ll lesz a sorok megrajzolsnl) }

    lea bx,B { BX:= B tmb ofszetcme }mov ax,blenmul cx { BX-hez hozzadunk annyit, hogy az ppen }add bx,ax { aktulis (CX.) BOB-ra mutasson }

    { 2.1. Ellenrizzk, hogy a BOB, koordinti alapjn lthat-e }

    cmp word [bx],0 { Az aktivitst jelz sz ellenrzse }jz @nextbob { Ha hamis, akkor nem szabad kirajzolni }cmp word [bx+2],320 { Ha X>=320, akkor nem lthat, ugrs a }jge @nextbob { kvetkez BOB-ra }cmp word [bx+4],200 { Ha Y>=200, akkor a kperny alja a- }jge @nextbob { latt van, ezrt nem kell megjelenteni }mov ax,[bx+6] { Amikor balra helyezkedik el a kperny- }add ax,[bx+2] { tl, LX+X

  • 7/29/2019 Varga Mrton - Jtkprogramok ksztse

    31/117

    31

    add dx,[bx+4] { sszesen H+Y sort kell kirakni }mov di,[bx+2] { DI rtke X, kzvetlenl a kperny }

    { tetejtl kezdve rajzoljuk a pontokat }add di,word [workarea] { DI-hez mg hozzadjuk a munkater- }mov ax,[bx+4] { let ofszetcmt }neg axpush dxmul word [bx+18] { Csak a -Y. sortl kezdve kell megjele- }pop dxadd si,ax { nteni, ezrt SI-hez hozzadunk -YW-t }

    { 2.2.2. Bal oldal }@left:

    mov cx,[bx+18] { CX: hny pontot kell egy sorban kirakni }cmp word [bx+2],0 { [BX+2] a BOB abszcisszja (X) }jge @right { Ha nem negatv, a jobb oldalt vizsglja }sub di,[bx+2] { Kzvetlenl a bal szln kezdnk }mov ax,[bx+2] { @D