Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
{ MANUAL1.TXT                                     Copyright (c) Martin Kolecek }
{                                                                              }
{ Author: Martin Kolecek                                                       }
{ Datum: 01.05.2011                                      http://www.trsek.com  }
 
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
SLOVO UVODEM
 
Unit Engine.pas je urceny pro DOS, pro Borland Pascal 7.0 realny rezim, nebo
freepascal. Ma za cil vytvareni jednoduchych 2D her s podporou slozitych zvuku 
pres PC-Speaker na pozadi behu programu, drzeni nekolika klaves na klavesnici
najednou, BMP soubory a grafika podobna na 8mi-bitove NINTENDO. Plati zde 
limit 640KB takze pri pouziti vsech hlavnich funkci enginu vytvorite program
velky maximalne 90KB (samozrejme se nepocitaji data externich souboru) pak
dojde k chybe "heap overflow" (naraz na limit 640KB), takze je to vhodne spis
na male projekty jako je ukazkova hra milknuts. Ovsem je treba uvest ze o
vsechno je uz postarano v enginu od grafiky pres zvuky az po mapu takze se
muzete soustredit hlavne na hru samotnou. Verze pro freepascal limitem 640KB
samozrejme netrpi.
 
Pokud nechcete do knihovny zasahovat pouzijte jiz hotovy unit. Pro pripad ze
chcete do knihovny zasahovat: 4 soubory obj ktere se nachazeji ve slozce
NETWIDE je treba prilinkovat ke knihovne, zmente si v souboru engine.pas
nasledujici radky:
 
{$L C:\ENGINE\BP7\SOURCES\NETWIDE\blok.obj}
{$L C:\ENGINE\BP7\SOURCES\NETWIDE\writeblk.obj}
{$L C:\ENGINE\BP7\SOURCES\NETWIDE\flippage.obj}
{$L C:\ENGINE\BP7\SOURCES\NETWIDE\clearpag.obj}
 
tak aby odpovidaly vasemu umisteni na harddisku a spravne ukazovaly na obj.
 
Verze pro freepascal nevyzaduje zadne externi soubory.
 
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
O DOSBOXU
 
Pokud chcete engine provozovat pod DOSBoxem tak problemy by nastat nemely u
hotovych programu vytvorenych s verzi knihovny pro BP7, az na editory
datovych souboru (gra,snd,map). Editory jsou v DOSBoxu tak pomale, ze jejich
pouziti je nemozne. Budete potrebovat cisty DOS nebo Win9x rezim DOSu. Stejne
tak verze knihovny pro freepascal je v DOSBoxu prilis pomala (asi 35-40 fps).
Verze pro Borland Pascal 7.0 navic obsahuje funkce na XMS. Tyto funkce mi
nefungovaly a zastavovaly program kdyz jsem ho spoustel z editoru BP7 pod
DOSBoxem ovsem zkompilovat to slo a spoustet pak jiz hotovy program mimo
editor Borland Pascalu fungovalo pod DOSBoxem taky bez problemu. XMS se v
enginu pouziva pouze na prehravani zvuku raw, takze kdyz nebudete chtit hrat
rawy nebo pouzivat XMS na neco jineho, muzete pouzivat klidne Borland Pascal
7.0 s touto knihovnou pod DOSBoxem. Ve verzi pro freepascal funkce XMS nejsou
treba. Pomohlo by kdyby DOSBox vyrazne zrychlil svou emulaci v nektere z
pristich verzi nebo prepsani grafickych funkci ve freepascalske verzi do
nejake rychlejsi podoby. Samozrejme ze pro DOSBox plati nastavit hodnotu
cycles na cycles=max v konfiguracnim souboru. (V cistem DOSu vykazuje
freepascalska verze rychlost 175 fps a ma jeste rezervu v podobe cekani
nekolika milisekund za kazdym vykreslenym snimkem a funkce XMS ve verzi pro
Borland Pascal 7.0 jsou plne funkcni).
 
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
KNIHOVNA
 
Var
  Key: array[0..127] of Boolean;
  - stavy jednotlivych klaves, cislo predstavuje klavesu viz. konec
  zdrojoveho souboru engine.pas a hodnota boolean pak jestli je klavesa
  stisknuta nebo ne. True=stisknuto a prave drzeno , False=nestisknuto
  priklady: Repeat Until Key[1]=True; ... cekani na stisk ESC
            If Key[28]=True then Begin End; kdyz je stisknut Enter proved ...
 
Var
  Buffer: array[0..4] of Word;
  - V programu se pracuje se 4mi Buffery jako s parametry pro graficke funkce
  Buffer[4] predstavuje to co je na obrazovce ostatni 3 Buffery pak virtualni
  obrazovky 320x200x256 ktere mohou obsahovat zdrojovou grafiku nebo
  Buffer ktery se v nasledujicim okamziku cely najednou vlozi na obrazovku.
  Buffer[0] slouzi pro nahravani ze souboru do pameti a rozbalovani dat.
  Buffer[0] je velky 160x200 B, Buffery[1] [2] a [3] 320x200 B
 
Var
  xmsCelkem,xmsMaxBlok: Word;
  - promenne ktere hraji roli pri praci s XMS. Prvni je hodnota kolik je
  celkem XMS k dispozici a druha jak velky maximalne muze byt blok XMS pameti
  Naplneny jsou az po detekci XMS a volani procedury
  GetSizeXMS(var celkemXMS,blokXMS: Word);
 
Var
  xmsChyba: Byte;
  - promenna ktera se naplnuje kdyz dojde k nejake chybe pri praci s XMS
 
Procedure Init320x200;
  - inicializuje graficky rezim 320x200x256
 
Procedure Init80x25;
  - inicializuje zpet textovy rezim
 
Procedure WaitRetrace;
  - cekani na vykreslovaci paprsek az bude vlevo nahore, pouziva se aby se
  animace netrhala cenou je vsak zpomaleni vykreslovani na frekvenci monitoru
 
Procedure InitBuffers;
  - inicializuje Buffery viz. vyse a dalsi nutne vnitrni pameti, naprosto
  nezbytne zavolat na zacatku programu, nezapomente zase pamet uvolnit
  volanim ShutdownBuffers na konci programu.
 
Procedure ShutdownBuffers
  - uvolni alokovanou pamet pro dalsi pouziti jinymi programy a systemem
 
Procedure GetPal(Color:Byte; Var R,G,B:Byte);
  - naplni R,G,B prvky palety cervene zelene a modre pro barvu "Color"
 
Procedure SetPal(Color:Byte; R,G,B:Byte);
  - nastavi paletu barvy Color(0.255) prvky R,G,B (rozsah 0..63)
 
Procedure LoadGRPage(JmenoSouboru:string;Pozice:LongInt);
  - nacte z harddisku soubor 'JmenoSouboru.gra' od pozice seek(Pozice) do
  pameti Buffer[0] pro dalsi nahrani do bufferu [1] [2] nebo [3] prikazy
  LoadBlok nebo LoadSprite
  -Pozice se zadava 0 jen v pripade ze prilinkovavate data na konec exe pak
  se jako jmeno souboru vyplni soubor.exe a pozice se nastavi na misto kde
  zacinaji prilinkovana data
 
Procedure LoadBmpFile(JmenoSouboru: string; pozice: LongInt; StartColor: Byte);
  - nacte BMP soubor 'JmenoSouboru.bmp' s paletou 16 barev a s rozmery o
  nasobcich 4 od pozice seek(Pozice) do Bufferu[0] pro dalsi nahrani do
  bufferu [1] [2] nebo [3] prikazem LoadBitMap, StartColor je cislo barvy od
  ktere se v palete nahraje 16 barev bmp souboru napr. StartColor=240 tzn.
  barvy bmp souboru se nastavi na poslednich 16 barev palety.
  Obrazek BMP se nahraje do Bufferu[0] na souradnice 0,0 levy horni roh
 
Procedure LoadBlok(x1,y1,x2,y2,x3,y3,BufferTo: Word);
  - nacte z Bufferu[0] z pozice kde x2,y2 je levy horni roh a x3,y3 pravy
  dolni roh na strance 160x200 tento obdelnik na pozici x1,y1 na stranku
  BufferTo levym hornim rohem, priklad:
  LoadBlok(0,0,0,0,159,199,Buffer[1]) nacte na pozici 0,0 do rohu na stranku
  Buffer[1] data z obdelniku 0,0 159,199 z Bufferu[0] tj. cely Buffer[0]
 
Procedure LoadSprite(x1,y1,x2,y2,x3,y3,BufferTo: Word);
 - jako LoadBlok jen s tim rozdilem ze tam kde je barva 0 se neprovede
 nacteni daneho bajtu
 
Procedure LoadBlokM(x1,y1,x2,y2,x3,y3,BufferTo: Word); (M=Mirrored)
 - uplne jako LoadBlok jen s tim rozdilem ze nacteni se provede zrcadlove,
 vhodne tam kde potrebujeme aby panacek chodil nejen doleva ale i zrcadlove
 vykresleny doprava, muzeme tak v souboru gra mit jen jednu verzi a pak v
 bufferu s grafikou nacteme LoadBlok a LoadBlokM jen s rozdilem x1 a y1 a se
 zachovanim x2,y2,x3,y3, ziskame dva obrazky jeden pro kazdy smer pohybu
 
Procedure LoadSpriteM(x1,y1,x2,y2,x3,y3,BufferTo: Word);
 - jako LoadBlokM jen nacita sprajt
 
Procedure LoadBitMap(X,Y: Word; BufferTo: Word);
 - pouziva se po volani LoadBMPFile, nacte z Bufferu[0] do Bufferu "BufferTo"
 na souradnici X,Y obrazek BMP, rozmery BMP obrazku jsou automaticky
 nastaveny po volani LoadBMPFile. BufferTo = Buffer[1] [2] nebo [3]
 
Procedure LoadBitMapM(X,Y: Word; BufferTo: Word);
 - jako LoadBitMap jen s tim rozdilem ze nahraje obrazek zrcadlove otoceny
 
Procedure WritePixel(X:Word;Y,Color:Byte;Buffer:Word);
 - nakresli pixel na souradnice X,Y barvou "Color" do Bufferu "Buffer"
 Buffer[1] [2] nebo [3] = 320x200 v pameti, Buffer[4]=screen
 
Procedure Blok(x1,y1,x2,y2,Color,Buffer:Word);
 - nakresli plny obdelnik kde levy horni roh je urcen souradnicemi x1,y1
 pravy dolni roh pak souradnicemi x2,y2 , vyplni barvou "Color" v Bufferu
 "Buffer" (Buffer[1] [2] [3] nebo [4])
 
Procedure Ramecek(X1,Y1,X2,Y2:Word;Color:Byte;Buffer:Word);
 - nakresli do bufferu "Buffer" ramecek tloustkou jeden pixel barvou "Color"
 levy horni roh je urcen souradnicemi X1,Y1 pravy dolni roh pak souradnicemi
 X2,Y2
 
Procedure WriteBlok(x1,y1,x2,y2,x3,y3,BufferFrom,BufferTo: Word);
 - zkopiruje obdelnik grafiky z Bufferu "BufferFrom" do Bufferu "BufferTo"
 na pozici x1,y1 do Bufferu "BufferTo" z obdelniku x2,y2 x3,y3 z Bufferu
 "BufferFrom" priklad: WriteBlok(X,Y,0,0,15,15,Buffer[1],Buffer[3]);
 zkopiruje graficky obdelnik z Bufferu[1] ze souradnic 0,0 15,15 do bufferu
 Buffer[3] na pozici urcenou souradnicemi X,Y
 
Procedure WriteSprite(x1,y1,x2,y2,x3,y3,BufferFrom,BufferTo: Word);
 - jako WriteBlok jen s tim rozdilem ze bajty s hodnotou nula se nevykresluji
 
Procedure FlipPage(BufferFrom,BufferTo: Word);
 - zkopiruje obsah Bufferu "BufferFrom" do Bufferu "BufferTo"
 priklad: FlipPage(Buffer[1],Buffer[4]); zkopiruje obsah bufferu[1] na screen
 
Procedure ClearPage(Buffer:Word);
 - vymaze Buffer napr. ClearPage(Buffer[1]); vymaze Buffer[1] nulami.
 
Procedure InitTexter(Barva:Byte);
 - inicializuje moznost vypisovat texty na obrazovku, je nutne byt nejprve v
 grafickem rezimu, Barva urcuje jakou barvu budou mit vysledne texty (0..255)
 nezapomente opet uvolnit pamet texteru volanim procedury ShutdownTexter
 na konci programu
 
Procedure ShutdownTexter;
 - uvolni alokovanou pamet texteru pro pouziti dalsimi programy a systemem.
 Ve verzi pro freepascal neni treba tuto proceduru volat.
 
Procedure ChangeTexterColor(Barva:Byte);
 - zmeni barvu texteru (pozn. u BP7 verze pomala procedura)
 
Procedure WriteText(X,Y:Word;retezec:string;BufferTo:Word);
 - vypise do Bufferu "BufferTo" na souradnici X,Y textovy retezec je nutne
 aby byl inicializovany texter, priklad:
 WriteText(150,97,'Hallo World',Buffer[4]); vypise zhruba do prostred
 obrazovky text "Hallo World"
 
Procedure WriteNumber(x,y:Word;Cislo:Longint;Small:Boolean;BufferTo:Word);
 - vypise do Bufferu "BufferTo" na pozici X,Y cislo "Cislo" (rozsah cisel je
 0..9999999) Small=True znamena ze cislo bude malym fontem, Small=False
 znamena velikost cifer 5 pixelu do delky 7 pixelu na vysku
 
Procedure LoadMapFile(soubor:string; pozice:Longint);
 - Nacte do pameti soubor mapy z programu editmap, pozice je parametr pro
 seek(pozice) pri nacitani ze souboru
 
Procedure SetMapByte(MapOffset:Word;bajt:Byte);
 - na pozici MapOffset v mape nahraje bajt, mapa je velka 64000B takze rozsah
 MapOffsetu je 0 .. 63999, pouzivejte rovnici pro offset Y * delka radku + X
 kde X a Y jsou souradnice ctverce na mape
 
Function  GetMapByte(MapOffset:Word): Byte;
 - vraci hodnotu bajtu z mapy z pozice urcene MapOffsetem
 
Procedure InitKeyboard;
 - inicializuje klavesnici (nezapomente zase klavesnici vratit do puvodniho
 stavu volanim ShutdownKeyboard na konci programu)
 
Procedure ShutdownKeyboard;
 - vrati klavesnici do puvodniho stavu
 Pokud na konci programu zustane vlivem stisku CTRL+F9 pro spusteni nefunkcni
 klavesnice, stisknete CTRL+ESC pro navrat normalni funkcnosti
 
Function  DetekujXms: Word;
 - vrati 0, pokud je ovladac XMS nainstalovany.
 u freepascalske verze funkce XMS nejsou treba a proto v unitu pro freepascal nejsou
 
Procedure GetSizeXms(var celkemXMS,blokXMS: Word);
 - v celkemXMS vraci celkovou (volnou?) velikost XMS a v blokXMS kolik si
 maximalne muzeme alokovat pro 1 blok. Vetsinou jsou obe velikosti shodne.
 
Function  AlokujXms(kolik: Word): word;
 - "kolik" je v Kb. Vraci handle (rukojet) alokovaneho bloku.
 
Procedure UvolniXms(handle: Word);
 - vsechny bloky, ktere jsme si alokovali bychom meli uvolnit, jinak budou az
 do restartu systemu nepouzitelne pro jine aplikace.
 
Procedure MoveToXMS(Handle: Word; XMSOffset: LongInt; Var Source; BlockLength: LongInt);
 - Source je promenna ze ktere se bude kopirovat do XMS na offset "XMSOffset"
 pocet bajtu BlockLength (pocet bajtu BlockLength musi byt sude cislo)
 
Procedure MoveFromXMS(Handle: Word; XMSOffset: LongInt; Var Dest; BlockLength: LongInt);
 - Dest je promenna do ktere se bude kopirovat z XMS z Offsetu XMSOffset
 pocet bajtu BlockLength (pocet bajtu BlockLength musi byt sude cislo)
 
Procedure InitTimer;
 - zapne casovac pro pouzivani funkce wait, Stopky, FPS2s a zvukovych funkci
 nezapomente opet casovac uvest do puvodniho stavu volanim ShutdownTimer na
 konci programu
 
Procedure ShutdownTimer;
 - uvede casovac do puvodniho stavu
 
Procedure Wait(ms: Word);
 - ceka "ms" milisekund, nahrada prikazu delay z jednotky CRT
 
Procedure Sound(Hertz: Word);
 - nahrada prikazu Sound z jednotky CRT
 
Procedure Silence;
 - nahrada prikazu NoSound z jednotky CRT
 
Procedure Stopky_Start;
 - zapne mereni stopkami
 
Procedure Stopky_Stop;
 - zastavi mereni stopkami
 
Function  Stopky_GetNumber: LongInt;
 - vraci namerene cislo po mereni stopkami v milisekundach
 
Procedure LoadSNDFile(Filename:String;Pozice:LongInt);
 - nacte 'soubor.snd' z harddisku do pameti, pozice se pouziva pro
 seek(pozice) pri nacitani
 
Procedure LoadRAWFile(filename:String;Pozice:LongInt;N:Byte);
 - nacte 'soubor.raw' seek(pozice) z harddisku, N je poradove cislo rawu
 (cislujte rawy od nuly pro spravne automaticke uvolneni pameti na konci
 programu)
 Soubory RAW nemaji hlavicku a je treba si je predem pripravit utilitou
 wav2raw pro windows. Vemte WAV s delkou max 4 sekundy a nejakym programem si
 ho prevedte do formatu PCM 8bit unsigned mono a potom na nej aplikujte
 utilitu wav2raw. Tato utilita prevede wav na raw a nastavi do prvnich ctyr
 bajtu souboru delku dat. (nutne pro nacitani v enginu)
 
Procedure PlaySound(Sample:Byte);
 - prehraje zvuk ze souboru.snd, Sample je cislo zvuku
 
Procedure PlayRaw(Cislo:Byte);
 - prehraje zvuk raw , Cislo je poradove cislo rawu
 v DOSBoxu zni rawy obzvlast pekne protoze DOSBox hraje PC Speaker pres
 reproduktory pocitace, V cistem DOSu kde PC Spaker hraje z bedny to zni
 nic moc extra spis skrceni nez zvuky
 
Procedure StopPlay;
 - zastavi prehravani zvuku
 
Function  FPS2s: Boolean;
 - strida stav co jednu vterinu, v jedne vterine vraci True a v druhe False
 pouziva se pro vypocet fps
 
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}