Na FreeHostingu Endora běžà desĂtky tisĂc webĹŻ. PĹ™idejte se ještÄ› dnes!
VytvoĹ™it web zdarmaNa FreeHostingu Endora běžà desĂtky tisĂc webĹŻ. PĹ™idejte se ještÄ› dnes!
VytvoĹ™it web zdarmaGetImage zkopíruje do bufferu v paměti pravoúhlý výřez obrazovky.PutImage dělá opak. Buffer naplněný předchozím voláním procedury GetImage zkopíruje zpět na obrazovku.Procedure PutPixel(x,y:integer; var bitmapa; jak:word);Parametry X a Y jsou jasné - to je poloha na obrazovce na kterou se výřez vykreslí (označuje levý horní roh).
| 0 | COPYput, Normalput | přemaluje to, co je na obrazovce (na pozadí) |
| 1 | XORput | Nonekvivalence výřezu a pozadí |
| 2 | ORput | Logický součet výřezu a pozadí |
| 3 | ANDput | Logický součin výřezu a pozadí |
| 4 | NOTput | Negace |
PutImage(x,y,obrazek^,ANDput);PutImage(x,y,obrazek^,ORput); bude ve výsledku vypadat stějně jako staré známé PutImage(x,y,obrazek^,COPYput);uses Crt,Graph; Procedure NakresliPodklad; {Necim zaplacam pozadi} var x,y:longint; begin for y:=0 to GetMaxY do for x:=0 to GetMaxX do PutPixel(x,y,byte(x*y)); end; Procedure NakresliSprajt; const Mnohouhelnik:array[1..5] of PointType = ( (X:75; Y:0),(X:125; Y:160),(X:25; Y:30),(X:125; Y:30),(X:35; Y:160) ); begin SetFillStyle(1,14); SetColor(14); FillPoly(5,mnohouhelnik); end; Procedure UlozSprajt(var p:pointer;var v,si,vy:word); begin v:=ImageSize(25,0,125,160); GetMem(p,v); GetImage(25,0,125,160,p^); si:=125-25+1; vy:=160-0+1; end; Procedure BufferProPozadi(var pozadi:pointer;velikost:word); begin GetMem(pozadi,velikost); end; Procedure VytvorMasku(var s,m:pointer;v:word); var ss,mm:^byte; w:word; h:byte; begin {$IFDEF FPC}h:=8;{$ELSE}h:=4;{$ENDIF} GetMem(m,v); {maska je stejne velika jako samotny sprajt} Move(s^,m^,h); ss:=s; {namirime ukazatele na zacatek sprajtu} mm:=m; {i na zacatek masky} inc(ss,h); {preskocime "zahlavi"} inc(mm,h); {--"--} for w:=1 to v-h do {pro kazdy pixel sprajtu...} begin if ss^=0 then begin mm^:=255 end else begin mm^:=0; end; {na misto odpovidajici dire dej 255,} inc(ss); {jinak 0} inc(mm); end; end; Procedure CekejNaPaprsek;assembler; asm Mov dx,3DAh @l1: in al,dx and al,08h jnz @l1 @l2: in al,dx and al,08h jz @l2 end; var gd,gm:integer; sprajt:pointer; maska:pointer; {pozadi:pointer;} pozadi:array[0..1] of pointer; velikost,si{rka},vy{ska}:word; xp,yp:integer; deltaX,deltaY:integer; _xp,_yp:array[0..1] of integer; b:longint; begin {$IFDEF FPC} gd:=d8bit; gm:=m640x480; InitGraph(gd,gm,''); {$ELSE} gd:=InstallUserDriver('SVGA256',nil); {pro gr. operace bude vyuzivat soubor SVGA256.BGI} gm:=2; {640x480 256 barev} InitGraph(gd,gm,''); {$ENDIF} NakresliSprajt; UlozSprajt(sprajt,velikost,si,vy); {tento sprajt ulozim do pameti} VytvorMasku(sprajt,maska,velikost); {vytvorim jeho bitovou masku} BufferProPozadi(pozadi[0],velikost); {a pripravim si buffer na ukladani pozadi} BufferProPozadi(pozadi[1],velikost); {budu je ale potrebovat dva, protoze stridave} {zobrazuju videostranku 0 a 1} NakresliPodklad; {$IFDEF FPC} SetActivePage(1); NakresliPodklad; SetActivePage(0); {$ENDIF} xp:=90; yp:=90; _xp[0]:=xp; _yp[0]:=yp; _xp[1]:=xp; _yp[1]:=yp; deltaX:=5; deltaY:=5; b:=0; GetImage(xp,yp,xp+si-1,yp+vy-1,pozadi[0]^); GetImage(xp,yp,xp+si-1,yp+vy-1,pozadi[1]^); repeat {$IFDEF FPC} SetVisualPage(longint(b xor 1)); {vzdy se koukam na jinou videostranku nez na tu} SetActivePage(longint(b)); {kterou prave menim} CekejNaPaprsek; {Silne doporucuju po zmene videostranky pockat na navrat paprsku} {$ENDIF} {Pokud cekani vypustite, tak zacne animace blikat!} { 1. krok - obnova pozadi} PutImage(_xp[b],_yp[b],pozadi[b]^,COPYput); { 2. krok - ulozeni pozadi} GetImage(xp,yp,xp+si-1,yp+vy-1,pozadi[longint(b)]^); { 3. krok - vycisteni pozadi pomoci masky (schvalne to zkuste vynechat :-) } PutImage(xp,yp,maska^,ANDput); { 4. krok - dokresleni sprajtu na vycistene pozadi } PutImage(xp,yp,sprajt^,ORput); _xp[b]:=xp; {minulou pozici musim uchovavat pro kazdou} _yp[b]:=yp; {videostranku zvlast} inc(xp,deltaX); inc(yp,deltaY); if xp+si>GetMaxX then begin deltaX:=-deltaX;inc(xp,deltaX);end else if xp<0 then begin deltaX:=-deltaX;inc(xp,deltaX);end; if yp+vy>GetMaxY then begin deltaY:=-deltaY;inc(yp,deltaY);end else if yp<0 then begin deltaY:=-deltaY;inc(yp,deltaY);end; {$IFDEF FPC} b:=b xor 1; {Prepinac zobrazovanych stranek} {$ENDIF} until keypressed; while keypressed do readkey; CloseGraph; end.Pokud nemáte soubor SVGA256.BGI, tak si ho můžete stáhnout zde (verze z roku 1994 od Jordana Hargraphixe).
{ESI ukazuje na sprajt, EDI na obrazovku} @dalsi: mov al,[esi] cmp al,0 je @preskoc mov [edi],al @preskoc: inc esi inc edi dec ecx jnz @dalsi
cmove
@dalsi:
mov ax,[esi]
mov bx,[edi]
cmp ax,0
cmove ax,bx
mov [edi],ax
inc esi
inc edi
dec ecx
jnz @dalsi
{ESI ukazuje na sprajt, EBX na masku, EDI na obrazovku} @dalsi: mov edx,ds:[ebx] and [edi],edx mov edx,[esi] or [edi],edx inc esi inc edi inc ebx dec ecx jnz @dalsi