![]() |
|
|
Ðåôåðàò: Ðàçðàáîòêà èãðîâîé ïðîãðàììû íà ÿçûêå ïðîãðàììèðîâàíèÿ Turbo Pascal2:Info; 3:Story; end; Until choice=4; Done; end. UNIT Buttons; INTERFACE Uses DOS; Const keyESC = 1; keyF1 = 59; keyF2 = 60; keyF3 = 61; keyF4 = 62; keyF5 = 63; keyF6 = 64; keyF7 = 65; keyF8 = 66; keyF9 = 67; keyF10 = 68; keyF11 = 87; keyF12 = 88; keyScrollLock = 70; keyTilde = 41; key1 = 2; key2 = 3; key3 = 4; key4 = 5; key5 = 6; key6 = 7; key7 = 8; key8 = 9; key9 = 10; key0 = 11; keyUnderline = 12; keyEquality = 13; keyBackspace = 14; keyTab = 15; keyQ = 16; keyW = 17; keyE = 18; keyR = 19; keyT = 20; keyY = 21; keyU = 22; keyI = 23; keyO = 24; keyP = 25; keyIndex = 26; keyBackIndex = 27; keyEnter = 28; keyCapsLock = 58; keyA = 30; keyS = 31; keyD = 32; keyF = 33; keyG = 34; keyH = 35; keyJ = 36; keyK = 37; keyL = 38; keyDoublePeriod = 39; keyApostroph = 40; keyLShift = 42; keyBackSlash = 43; keyZ = 44; keyX = 45; keyC = 46; keyV = 47; keyB = 48; keyN = 49; keyM = 50; keyComma = 51; keyPeriod = 52; keySlash = 53; keyRShift = 54; keyCtrl = 29; keyAlt = 56; keySpace = 57; keyNumLock = 69; keyMultiply = 55; keyMinus = 74; keyPlus = 78; keyDelete = 83; keyHome = 71; keyUp = 72; keyPgUp = 73; keyLeft = 75; keyFive = 76; keyRight = 77; keyEnd = 79; keyDown = 80; keyPgDn = 81; keyInsert = 82; KeyPressed:Boolean = FALSE; Var Key :Array [1..128] of Boolean; WasPressed:Array [1..128] of Boolean; Const CheckWarmReboot:Boolean = TRUE; WarmRebootFlag :Boolean = FALSE; Procedure InitButtons; Procedure DoneButtons; Function ButtonsInited:Boolean; Function IsKeypressed:Boolean; Function Pressed(Index:Byte):Boolean; Procedure ClearKeys; IMPLEMENTATION Const Init:Boolean=FALSE; Var OldKbdHandler:Pointer; Procedure Int9; INTERRUPT; Var ScanCode,Tmp:Byte; begin ScanCode:=Port[$60]; if ScanCode and 128=0 then begin Key[ScanCode]:=TRUE; KeyPressed:=TRUE; end else begin ScanCode:=ScanCode xor 128; Key[ScanCode]:=FALSE; WasPressed[ScanCode]:=TRUE; KeyPressed:=FALSE; end; if CheckWarmReboot and (ScanCode=keyDelete) then begin Tmp:=Mem[Seg0040:$0017]; if Tmp and 12=12 then begin Tmp:=Tmp xor 21; WarmRebootFlag:=TRUE; end; Mem[Seg0040:$0017]:=Tmp; end; asm in al,61h or al,82h out 61h,al and al,7Fh out 61h,al mov al,20h out 20h,al end;
end; Procedure InitButtons; begin if not Init then begin GetIntVec($9,OldKbdHandler); SetIntVec($9,@Int9); FillChar(Key,SizeOf(Key),FALSE); FillChar(WasPressed,SizeOf(WasPressed),FALSE); CheckWarmReboot:=TRUE; WarmRebootFlag:=FALSE; Init:=TRUE; end; end; Procedure DoneButtons; begin if Init then begin SetIntVec($9,OldKbdHandler); WarmRebootFlag:=FALSE; Init:=FALSE; end; end; Function ButtonsInited; begin ButtonsInited:=Init; end; Function IsKeypressed; Var i:Byte; f:Boolean; begin f:=false; i:=1; While (i<=128) and not f do begin f:=Key[i]; Inc(i); end; IsKeypressed:=f; end; Function Pressed; begin if WasPressed[Index] then begin WasPressed[Index]:=FALSE; Pressed:=TRUE; end else Pressed:=FALSE; end; Procedure ClearKeys; begin FillChar(Key,SizeOf(Key),false); FillChar(WasPressed,SizeOf(WasPressed),false); end; END. UNIT LogoScreen; INTERFACE IMPLEMENTATION uses graph,crt; const a = 'Vera & Yulya presents'; b = ' science game'; d = ' for kids'; e = 'Magnitogorsk - 2001'; t = 'Siege'; var driver,mode,x1,x,y, color:integer;i,j:word; x2,y2,o:array[1..500] of integer; g,n:integer; label 1; begin detectgraph(driver,mode); initgraph(driver,mode,'c:\'); if graphresult<>0 then write('Îøèáêà!') else for g:=1 to 500 do begin n:=random(18); case n of 1: o[g]:=1; 2: o[g]:=3; 3: o[g]:=4; 4: o[g]:=5; 5: o[g]:=9; 6: o[g]:=11; 7: o[g]:=12; 8: o[g]:=13; 9: o[g]:=14; 10: o[g]:=15 end; x2[g]:=random(640); y2[g]:=random(480); putpixel(x2[g],y2[g],o[g]) end; setcolor(9); begin j:=getmaxx-250; i:=1; settextstyle(7,0,4); while i<=getmaxx-length(a)-400 do begin setcolor(black); outtextxy(i-length(a)-2,10,a); outtextxy(j+2,50,b); outtextxy(j+2,90,d); setcolor(1+random(14)); outtextxy(i-length(a),10,a); outtextxy(j,50,b); outtextxy(j,90,d); j:=j-2; i:=i+2; if keypressed then goto 1; end; color:=getcolor; settextstyle(4,0,1); for i:=1 to 10 do begin setcolor(black); outtextxy(230,getmaxy-20-i+1,e); delay(100); setcolor(color); outtextxy(230,getmaxy-20-i,e); end; settextstyle(4,0,15); setviewport(1,1,639,479,false); repeat for i:=15 downto 1 do begin if(i=1)or(i=5)then continue; setcolor(i); outtextxy((GetMaxX div 2)-(TextWidth(t) div 2),180,t); delay(100); end; for i:=1 to 15 do begin if(i=1)or(i=5)then continue; setcolor(i); outtextxy((GetMaxX div 2)-(TextWidth(t) div 2),180,t); delay(100); end; until keypressed; 1: setcolor(black); setfillstyle(1,1); SetBkcolor(1); setviewport(1,1,639,479,true); for i:=1 to 90 do begin sector(getmaxx div 2,getmaxy div 2,0,i,400,400); sector(getmaxx div 2,getmaxy div 2,90,90+i,400,400); sector(getmaxx div 2,getmaxy div 2,180,180+i,400,400); sector(getmaxx div 2,getmaxy div 2,270,270+i,400,400); end; setcolor(Magenta); settextstyle(7,0,8); outtextxy((getmaxx div 2)-(TextWidth('Good luck!!!') div 2), (getmaxy div 2)-180,'Good luck!!!'); Delay(1000); closegraph; end; END. UNIT Retrace; INTERFACE Procedure WaitRetraceMode; IMPLEMENTATION Procedure WaitRetraceMode; begin While Port[$3DA] and 8<>0 do; end; END. UNIT SiegeLogo; INTERFACE Uses Buttons, VGA13h; Type PFont = ^TFont; TFont = Array [0..255,0..7] of Byte; Var Font:PFont; Procedure DrawString(Base:Word;xp,yp:Integer;Const s:String); Function Logo:Byte; Procedure Info; Procedure Story; IMPLEMENTATION Procedure DrawString; Var x,y,l,t:Byte; begin if Byte(s[0])>0 then begin for l:=1 to Byte(s[0]) do begin for y:=0 to 7 do begin t:=Font^[Byte(s[l])][y]; for x:=0 to 7 do begin if t and 128=128 then PutPixel(Base,xp+x,yp+y,15); t:=t shl 1; end; end; xp:=xp+8; end; end; end; Function Logo; Var Res,Old:Byte; begin ClearKeys; Old:=0; Res:=1; ClearBase(Base1); DrawString(Base1,30,60,'Play the game'); DrawString(Base1,30,70,'Instructions'); DrawString(Base1,30,80,'Story'); DrawString(Base1,30,90,'Exit to DOS'); Repeat if Old<>Res then begin Bar(Base1,20,60,28,100,0); DrawString(Base1,20,60+(Res-1)*10,'>'); Old:=Res; end; if Pressed(keyUp) then begin Res:=Res-1; if Res<1 then Res:=4; end; if Pressed(keyDown) then begin Res:=Res+1; if Res>4 then Res:=1; end; Until Key[keyEnter]; Logo:=Res; end; Procedure Center(y:Integer;Const s:String); begin DrawString(Base1,160-(Length(s)*8 div 2),y,s); end; Procedure Info; begin ClearBase(Base1); Center(2,'Instructions'); Center(20,'Arrows - moving Hero'); Center(30,'Space - throw stone'); Center(40,'Esc - exit the game'); Center(190,'Press any key'); ClearKeys; Repeat Until IsKeypressed; end; Procedure Story; begin ClearBase(Base1); Center(2,'Ïðåäûñòîðèÿ'); DrawString(Base1,1,20,'Ìíîãî ëåò íàçàä íà Çåìëþ óïàë ìåòåîðèò.'); DrawString(Base1,1,30,'Ïðè èññëåäîâàíèè â ëàáîðàòîðèè ó÷åíûå '); DrawString(Base1,1,40,'îáíàðóæèëè â íåì áèîëîãè÷åñêîå âåùåñ- '); DrawString(Base1,1,50,'òâî âíåçåìíîãî ïðîèñõîæäåíèÿ. Ïîíÿâ âñþ'); DrawString(Base1,1,60,'îïàñíîñòü ýòîãî âèðóñà, îíè ïîïûòàëèñü '); DrawString(Base1,1,70,'íåéòðàëèçîâàòü åãî.Íî âèðóñ ñòàë áûñòðî'); DrawString(Base1,1,80,'ðàñïðîñòðàíÿòüñÿ è çàðàçèë âñåõ ó÷àñòíè '); DrawString(Base1,1,90,'êîâ èññëåäîâàíèÿ. Âûéäÿ çà ñòåíû ëàáîðà-'); DrawString(Base1,1,100,' òîðèè îí ñòàë çàðîæàòü ëþäåé.Çàðàæåííûå'); DrawString(Base1,1,110,'âèðóñîì âíåøíå íå îòëè÷àëèñü îò îáû÷íûõ'); DrawString(Base1,1,120,'ëþäåé, íî ïîä÷èíÿëèñü âíåçåìíîìó ðàçóìó.'); DrawString(Base1,1,130,'Èõ çàäà÷åé áûëî:óíè÷òîæèòü îñòàâøååñÿ '); DrawString(Base1,1,140,'íàñåëåíèå.Òîãäà ëþäè ñòàëè îáúåäèíÿòü- '); DrawString(Base1,1,150,'ñÿ,÷òîáû çàùèòèòü ñåáÿ. Îíè óñòðîèëè '); DrawString(Base1,1,160,'çàñàäó â êðåïîñòè. Íî àãðåññèâíûõ "ëèê-'); DrawString(Base1,1,170,'âèäàòîðîâ íè÷òî íå ìîãëî îñòàíîâèòü.....'); ClearKeys; Repeat Until IsKeypressed; end; END. UNIT SiegeSpr; INTERFACE Const BrickHgt = 10; BrickWdt = 10; BrickSpr:Array [1..BrickHgt,1..BrickWdt] of Byte = ((7,7,7,7,7,7,7,7,7,7), (4,4,4,4,4,4,4,4,4,7), (4,4,4,4,4,4,4,4,4,7), (4,4,4,4,4,4,4,4,4,7), (4,4,4,4,4,4,4,4,4,7), (7,7,7,7,7,7,7,7,7,7), (4,4,4,4,7,4,4,4,4,4), (4,4,4,4,7,4,4,4,4,4), (4,4,4,4,7,4,4,4,4,4), (4,4,4,4,7,4,4,4,4,4)); Const StoneHgt = 8; StoneWdt = 8; StoneSpr:Array [1..StoneHgt,1..StoneWdt] of Byte = ((0,0,8,8,8,8,0,0), (0,8,7,7,8,8,8,0), (8,7,8,8,8,8,8,8), (8,7,8,8,8,8,8,8), (8,8,8,8,8,8,8,8), (8,8,8,8,8,8,8,8), (0,8,8,8,8,8,8,0), (0,0,8,8,8,8,0,0)); Const ManHgt = 20; ManWdt = 16; ManSpr:Array [1..2,1..ManHgt,1..ManWdt] of Byte = (((00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00), (00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00), (00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00), (00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00), (00,00,00,00,00,00, 7, 7, 7, 7,00,00,00,00,00,00), (00,00,00,00,00, 7, 7, 7, 7, 7, 7,00,00,00,00,00), (00,00,00,00,00, 7,15,15,15,15, 7,00,00,00,00,00), (00,00,00,00,00,15, 3, 1, 1, 3,15,00,00,00,00,00), (00,00,00,00,00,15,15,15,15,15,15,00,00,00,00,00), (00,00,00,00,00,15,15, 8, 8,15,15,00,00,00,00,00), (00,00,00,00,00,15,15,13,13,15,15,00,00,00,00,00), (00,00,00,00,00,00,15,15,15,15,00,00,00,00,00,00), (00,00,00,00,12,12,15,15,15,15,12,12,00,00,00,00), (00,12,12,12,12,12,12,14,14,12,12,12,12,12,12,00), (12,12,12,12,12,12,12,14,14,12,12,12,12,12,12,12), (12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12), (12,12, 8,12,12,12,12,12,12,12,12,12,12, 8,12,12), (12,12, 8,12,12,12,12,12, 8,12,12,12,12, 8,12,12), (12,12, 8,12,12,12,12,12,12,12,12,12,12, 8,12,12), (12,12, 8,12,12,12,12,12, 8,12,12,12,12, 8,12,12)), ((00,00,00,15,00,00,00,00,00,00,00,00,15,00,00,00), (00,00,00,15,00,00,00,00,00,00,00,00,15,00,00,00), (00,00,12,12,00,00,00,00,00,00,00,00,12,12,00,00), (00,00,12,12,00,00,00,00,00,00,00,00,12,12,00,00), (00,00,12,12,00,00, 7, 7, 7, 7,00,00,12,12,00,00), (00,00,12,12,00, 7, 7, 7, 7, 7, 7,00,12,12,00,00), (00,12,12,00,00, 7,15,15,15,15, 7,00,00,12,12,00), (00,12,12,00,00,15, 3, 1, 1, 3,15,00,00,12,12,00), (00,12,12,00,00,15,15,15,15,15,15,00,00,12,12,00), (00,12,12,00,00,15,15, 8, 8,15,15,00,00,12,12,00), (00,12,12,00,00,15,15,13,13,15,15,00,00,12,12,00), (00,12,12,12,00,00,15,15,15,15,00,00,12,12,12,00), (00,00,12,12,12,12,15,15,15,15,12,12,12,12,00,00), (00,00,12,12,12,12,12,14,14,12,12,12,12,12,00,00), (00,00,12,12,12,12,12,14,14,12,12,12,12,12,00,00), (00,00,12,12,12,12,12,12,12,12,12,12,12,12,00,00), (00,00,00,12,12,12,12,12,12,12,12,12,12,00,00,00), (00,00,00,12,12,12,12,12, 8,12,12,12,12,00,00,00), (00,00,00,12,12,12,12,12,12,12,12,12,12,00,00,00), (00,00,00,12,12,12,12,12, 8,12,12,12,12,00,00,00))); Const EnemyHgt = 42; EnemyWdt = 16; EnemySpr:Array [1..2,1..EnemyHgt,1..EnemyWdt] of Byte = (((00,00,00,00,00,00,00,00,00,00,00,00,00,00,15,00), (00,00,00,00,00,00,00,00,00,00,00,00,00,00,15,00), (00,00,00,00,00,00,00,00,00,00,00,00,00,10,10,00), (00,00,00,00,00,00,00,00,00,00,00,00,00,10,10,00), (00,00,00,00,00,00, 7, 7, 7, 7,00,00,00,10,10,00), (00,00,00,00,00, 7, 7, 7, 7, 7, 7,00,00,10,10,00), (00,00,00,00,00, 7, 7, 7, 7, 7, 7,00,00,10,10,00), (00,00,00,00,00, 7, 7, 7, 7, 7, 7,00,00,10,10,00), (00,00,00,00,00, 7, 7, 7, 7, 7, 7,00,00,10,10,00), (00,00,00,00,00,15, 7, 7, 7, 7,15,00,00,10,10,00), (00,00,00,00,00,15, 7, 7, 7, 7,15,00,00,10,10,00), (00,00,00,00,00,00,15,15,15,15,00,00,10,10,10,00), (00,00,00,00,10,10,15,15,15,15,10,10,10,10,00,00), (00,10,10,10,10,10,10,10,10,10,10,10,10,10,00,00), (10,10,10,10,10,10,10,10,10,10,10,10,10,10,00,00), (10,10,10,10,10,10,10,10,10,10,10,10,10,10,00,00), (10,10,00,10,10,10,10,10,10,10,10,10,10,00,00,00), (10,10,00,10,10,10,10,10,10,10,10,10,10,00,00,00), (10,10,00,10,10,10,10,10,10,10,10,10,10,00,00,00), (00,10,10,10,10,10,10,10,10,10,10,10,10,00,00,00), (00,10,10,10,10,10,10,10,10,10,10,10,10,00,00,00), (00,10,10,10,10,10,10,10,10,10,10,10,10,00,00,00), (00,00,00,10,10,10,10,10,10,10,10,10,10,00,00,00), (00,00,00, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,00,00,00), (00,00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00,00), (00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00,00), (00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00,00), (00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00,00), (00, 8, 8, 8, 8,00,00,00,00, 8, 8, 8, 8,00,00,00), ( 8, 8, 8, 8, 8,00,00,00,00, 8, 8, 8, 8, 8,00,00), ( 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00,00), ( 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00,00), ( 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00,00), (00, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00,00), (00, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00,00), (00,00, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00), (00,00, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00), (00,00, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8,00), (00,00,00,00,00,00,00,00,00,00,00, 8, 8, 8, 8,00), (00,00,00,00,00,00,00,00,00,00,00, 8, 8, 8, 8,00), (00,00,00,00,00,00,00,00,00,00,00, 8, 8, 8, 8,00), (00,00,00,00,00,00,00,00,00,00,00, 8, 8, 8, 8,00)), ((00,15,00,00,00,00,00,00,00,00,00,00,00,00,00,00), (00,15,00,00,00,00,00,00,00,00,00,00,00,00,00,00), (00,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00), (00,10,10,00,00,00,00,00,00,00,00,00,00,00,00,00), (00,10,10,00,00,00, 7, 7, 7, 7,00,00,00,00,00,00), (00,10,10,00,00, 7, 7, 7, 7, 7, 7,00,00,00,00,00), (00,10,10,00,00, 7, 7, 7, 7, 7, 7,00,00,00,00,00), (00,10,10,00,00, 7, 7, 7, 7, 7, 7,00,00,00,00,00), (00,10,10,00,00, 7, 7, 7, 7, 7, 7,00,00,00,00,00), (00,10,10,00,00,15, 7, 7, 7, 7,15,00,00,00,00,00), (00,10,10,00,00,15, 7, 7, 7, 7,15,00,00,00,00,00), (00,10,10,10,00,00,15,15,15,15,00,00,00,00,00,00), (00,00,10,10,10,10,15,15,15,15,10,10,10,10,00,00), (00,00,10,10,10,10,10,10,10,10,10,10,10,10,10,00), (00,00,10,10,10,10,10,10,10,10,10,10,10,10,10,10), (00,00,10,10,10,10,10,10,10,10,10,10,10,10,10,10), (00,00,00,10,10,10,10,10,10,10,10,10,10,00,10,10), (00,00,00,10,10,10,10,10,10,10,10,10,10,00,10,10), (00,00,00,10,10,10,10,10,10,10,10,10,10,00,10,10), (00,00,00,10,10,10,10,10,10,10,10,10,10,10,10,00), (00,00,00,10,10,10,10,10,10,10,10,10,10,10,10,00), (00,00,00,10,10,10,10,10,10,10,10,10,10,10,10,00), (00,00,00,10,10,10,10,10,10,10,10,10,10,00,00,00), (00,00,00, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,00,00,00), (00,00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00,00), (00,00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00), (00,00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00,00), (00,00,00, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,00), (00,00, 8, 8, 8, 8, 8,00,00,00,00, 8, 8, 8, 8,00), (00,00, 8, 8, 8, 8, 8,00,00,00,00, 8, 8, 8, 8, 8), (00,00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8), (00,00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8), (00,00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8, 8), (00,00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8,00), (00,00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8,00), (00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8,00,00), (00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8,00,00), (00, 8, 8, 8, 8,00,00,00,00,00,00, 8, 8, 8,00,00), (00, 8, 8, 8, 8,00,00,00,00,00,00,00,00,00,00,00), (00, 8, 8, 8, 8,00,00,00,00,00,00,00,00,00,00,00), (00, 8, 8, 8, 8,00,00,00,00,00,00,00,00,00,00,00), (00, 8, 8, 8, 8,00,00,00,00,00,00,00,00,00,00,00))); IMPLEMENTATION END. UNIT VGA13h; INTERFACE Type PScreen = ^TScreen; TScreen = Array [0..199,0..319] of Byte; Const ScreenHeight = 200; ScreenWidth = 320; GetMaxY = ScreenHeight-1; GetMaxX = ScreenWidth-1; MidX = GetMaxX div 2; MidY = GetMaxY div 2; PageSize = ScreenHeight*ScreenWidth; QuarterSize = PageSize div 4; VideoSegment:Word = 0; Base1:Word = 0; Base2:Word = 0; Page1:PScreen = NIL; Page2:PScreen = NIL; Function DetectVGA:Boolean; Procedure SetGraphMode; Procedure SetTextMode; Procedure MakePixelSquare; Procedure CopyBase(Source,Destin:Word); Procedure ClearBase(Base:Word); Procedure FillBase(Base,Ofs,Count:Word;Color:Longint); Procedure MoveBase(Source,Destin,Count:Word); Procedure TileBase(Base,Ofs,Count:Word;Tile:Pointer;Len:Word); Procedure PutPixel(Base:Word;x,y:Integer;Color:Byte); Function GetPixel(Base:Word;x,y:Integer):Byte; Procedure Line(Base:Word;x1,y1,x2,y2:Integer;Color:Byte); Procedure VLine(Base:Word;x,y1,y2:Integer;Color:Byte); Procedure HLine(Base:Word;y,x1,x2:Integer;Color:Byte); Procedure Bar(Base:Word;x1,y1,x2,y2:Integer;Color:Byte); Procedure Polygon(Base:Word;x1,y1,x2,y2,x3,y3,x4,y4:Integer;c:Byte); Function InitVirtualPage:Boolean; Procedure DoneVirtualPage; IMPLEMENTATION Var VirtualPage:Pointer; {$L VGA13H.OBJ} Function DetectVGA; external; Procedure SetGraphMode; external; Procedure SetTextMode; external; Procedure MakePixelSquare; external; Procedure CopyBase; external; Procedure ClearBase; external; Procedure FillBase; external; Procedure MoveBase; external; Procedure TileBase; external; Procedure PutPixel; external; Function GetPixel; external; Procedure HLine; external; Procedure VLine; external; Procedure Polygon; Var xpos:array [0..199,0..1] of Word; mny,mxy,y:Integer; i:Word; s1,s2,s3,s4:Shortint; begin mny:=y1; if y2<mny then mny:=y2; if y3<mny then mny:=y3; if y4<mny then mny:=y4; mxy:=y1; if y2>mxy then mxy:=y2; if y3>mxy then mxy:=y3; if y4>mxy then mxy:=y4; s1:=byte(y1<y2)*2-1; s2:=byte(y2<y3)*2-1; s3:=byte(y3<y4)*2-1; s4:=byte(y4<y1)*2-1; y:=y1; if y1<>y2 then Repeat xpos[y,byte(y1<y2)]:=integer(x2-x1)*(y-y1) div (y2-y1)+x1; y:=y+s1; Until y=y2+s1 else xpos[y,byte(y1<y2)]:=x1; y:=y2; if y2<>y3 then Repeat xpos[y,byte(y2<y3)]:=integer(x3-x2)*(y-y2) div (y3-y2)+x2; y:=y+s2; Until y=y3+s2 else xpos[y,byte(y2<y3)]:=x2; y:=y3; if y3<>y4 then Repeat xpos[y,byte(y3<y4)]:=integer(x4-x3)*(y-y3) div (y4-y3)+x3; y:=y+s3; Until y=y4+s3 else xpos[y,byte(y3<y4)]:=x3; y:=y4; if y4<>y1 then Repeat xpos[y,byte(y4<y1)]:=integer(x1-x4)*(y-y4) div (y1-y4)+x4; y:=y+s4; Until y=y1+s4 else xpos[y,byte(y1<y4)]:=x4; for y:=mny to mxy do HLine(Base,y,xpos[y,0],xpos[y,1],c); end; Procedure Line; Var dx,dy,sx,sy,d,d1,d2,x,y,i:Integer; begin dx:=Abs(x2-x1); dy:=Abs(y2-y1); if x2>=x1 then sx:=+1 else sx:=-1; if y2>=y1 then sy:=+1 else sy:=-1; Mem[Base:(y1 shl 8)+(y1 shl 6)+x1]:=Color; if dy<=dx then begin d:=(dy shl 1)-dx; d1:=dy shl 1; d2:=(dy-dx) shl 1; x:=x1+sx; y:=y1; for i:=1 to dx do begin if d>0 then begin d:=d+d2; y:=y+sy; end else d:=d+d1; Mem[Base:(y shl 8)+(y shl 6)+x]:=Color; x:=x+sx; end; end else begin d:=(dx shl 1)-dy; d1:=dx shl 1; d2:=(dx-dy) shl 1; x:=x1; y:=y1+sy; for i:=1 to dy do begin if d>0 then begin d:=d+d2; x:=x+sx; end else d:=d+d1; Mem[Base:(y shl 8)+(y shl 6)+x]:=Color; y:=y+sy; end; end; end; Procedure Bar; Var Row,Column:Integer; begin for Row:=y1 to y2 do for Column:=x1 to x2 do Mem[Base:(Row shl 8)+(Row shl 6)+Column]:=Color; end; Function InitVirtualPage; Var Temp:Longint; begin VirtualPage:=NIL; Base2:=0; Page2:=NIL; InitVirtualPage:=false; GetMem(VirtualPage,PageSize+15); Temp:=(Longint(Seg(VirtualPage^)) shl 4)+Longint(Ofs(VirtualPage^)); if Temp and $F<>0 then Temp:=(Temp shr 4)+1 else Temp:=Temp shr 4; Base2:=Temp; Page2:=Ptr(Base2,0); ClearBase(Base2); InitVirtualPage:=true; end; Procedure DoneVirtualPage; begin FreeMem(VirtualPage,PageSize+15); VirtualPage:=NIL; Base2:=0; Page2:=NIL; end; {==================================================================} BEGIN VideoSegment:=SegA000; Base1:=VideoSegment; Page1:=Ptr(Base1,0); InitVirtualPage; END. UNIT VGASpr; INTERFACE Uses VGA13h; Type BA=Array [0..$FFF0] of Byte; Var TopX,TopY,BotX,BotY:Integer; Procedure SetClipRect(x1,y1,x2,y2:Integer); Procedure DrawTSpr(Base:Word;x,y:Integer;h,w:Word;Image:Pointer); Procedure DrawOSpr(Base:Word;x,y:Integer;h,w:Word;Image:Pointer); IMPLEMENTATION Procedure SetClipRect; Function Max(a,b:Integer):Integer; begin if a>b then Max:=a else Max:=b; end; Function Min(a,b:Integer):Integer; begin if a<b then Min:=a else Min:=b; end; begin TopX:=Max(0,Min(x1,x2)); BotX:=Min(GetMaxX,Max(x1,x2)); TopY:=Max(0,Min(y1,y2)); BotY:=Min(GetMaxY,Max(y1,y2)); end; Procedure DrawTSpr; Var fx,fy,x1,y1,x2,y2:Word; c:Byte; begin if (x+w-1<TopX) or (y+h-1<TopY) or (x>BotX) or (y>BotY) then Exit; if x<TopX then x1:=Abs(x) else x1:=0; if y<TopY then y1:=Abs(y) else y1:=0; if x+w>BotX then x2:=BotX-x else x2:=w-1; if y+h>BotY then y2:=BotY-y else y2:=h-1; for fy:=y1 to y2 do for fx:=x1 to x2 do begin c:=BA(Image^)[fy*w+fx]; if c<>0 then Mem[Base:((y+fy) shl 8)+((y+fy) shl 6)+(x+fx)]:=c; end; end; Procedure DrawOSpr; Var fx,fy,x1,y1,x2,y2:Word; begin if (x+w-1<TopX) or (y+h-1<TopY) or (x>BotX) or (y>BotY) then Exit; if x<TopX then x1:=Abs(x) else x1:=0; if y<TopY then y1:=Abs(y) else y1:=0; if x+w>BotX then x2:=BotX-x else x2:=w-1; if y+h>BotY then y2:=BotY-y else y2:=h-1; for fy:=y1 to y2 do for fx:=x1 to x2 do Mem[Base:((y+fy) shl 8)+((y+fy) shl 6)+(x+fx)]:=BA(Image^)[fy*w+fx]; end; BEGIN SetClipRect(0,0,GetMaxX,GetMaxY); END. |
Ñòðàíèöû: 1, 2
![]() |
||
ÍÎÂÎÑÒÈ | ![]() |
![]() |
||
ÂÕÎÄ | ![]() |
|
Ðåôåðàòû áåñïëàòíî, ðåôåðàò áåñïëàòíî, êóðñîâûå ðàáîòû, ðåôåðàò, äîêëàäû, ðåôåðàòû, ðåôåðàòû ñêà÷àòü, ðåôåðàòû íà òåìó, ñî÷èíåíèÿ, êóðñîâûå, äèïëîìû, íàó÷íûå ðàáîòû è ìíîãîå äðóãîå. |
||
Ïðè èñïîëüçîâàíèè ìàòåðèàëîâ - ññûëêà íà ñàéò îáÿçàòåëüíà. |