[PASCAL]Dziwne zablokowanie ruchu kwadratu


(Moore96) #1

WitamOd dłuższego czasu mam problem z pewnym kwadratem....otóż napisałem coś na wypadek gdyby kwadrat chciał wejść na inny.Lecz po zablokowaniu go by nie mógł wejść w tej drugi kwadrat sam nie może skakać na na wysokość jaką mu zaprogrmowałem.Oto cały kod(sorki,że troche nieczytelny....aha i mogły by być wartości boolean...):

uses crt,graph;


var

sterownik:integer;

tryb:integer;

{do poruszania}

znak:char;

kod_znaku:byte;

ppxk,ppyk,yk:integer;

by,dp,dbp:integer; {dotyka pólki,dotyka boku pólki}

{do procedury rysuj..}

pxk : integer; {punkt x/y kwadratu}

pyk : integer;

sk : integer; {szerkość/wysokość}

wk : integer;

delta_x : integer;

delta_y : integer;

{do procki rp}

pxp,pyp,sp,wp:integer; {to samo tylko do rysowania półki}



procedure rk(kolor : byte); {rysuj kwadrat}

begin

setcolor(kolor);

moveto(pxk, pyk);

lineto(pxk + sk,pyk);

lineto(pxk + sk,pyk + wk);

lineto(pxk, pyk + wk);

lineto(pxk ,pyk);

end;


procedure rp(kolor : byte); {rysuj półkę}

begin

setcolor(kolor);

moveto(pxp, pyp);

lineto(pxp + sp,pyp);

lineto(pxp + sp,pyp + wp);

lineto(pxp, pyp + wp);

lineto(pxp ,pyp);

end;





begin


pxk:=5;

pyk:=299;

sk:=50;

wk:=50;



pxp:=55;

pyp:=150;

sp:=55;

wp:=50;


ppxk:=0;

ppyk:=0;



yk:=0; {do sprawdzania podwójnego skoku}     

by:=1;

dp:=1;


sterownik:=VGA;

tryb:=VGAmed;

initgraph(sterownik,tryb,'E:\Tp\bgi');



while (1=1) do

begin

rectangle(0,0,639,349); {obwudka}

rp(green); {przeszkoda}

rectangle(500,280,599,325); {p˘lka}

rk(green); {bohater}


if keypressed then

begin

znak:=readkey;

kod_znaku:=ord(znak);

case kod_znaku of

72:

begin

inc(yk);

ppyk:=0;

ppyk:=pyk;

delta_y:=-1;

end;

80:delta_x:=0;

75:delta_x:=-1;

77:

begin

if

dbp=1 then

delta_x:=1;

end;

113:

begin

closegraph;

halt;

end;

end;

end;


{poruszenie kwadratu}


if((pxk + delta_x > 0) and

   (pxk + delta_x < 639 - sk) ) then

    pxk := pxk + delta_x;


if((pyk + delta_y > 0) and

   (pyk + delta_y < 349 - wk) ) then

    pyk := pyk + delta_y;


{dotknecie ziemi}

if((pyk >=298)) then by:=2; {czy dotyka ziemi}

if((pyk <297)) then by:=1; {-------||-------}

if((pyk >=298)) then dp:=1; {skok po zejsciu z p˘lki}


{grawitacja}

if((dp=2)) then delta_y:=1; {spadanie z p˘lki}

if((ppyk=pyk+delta_y+120)) then {maxskok}

   delta_y:=1;

if((pyk+delta_y =2)) then {najwyzszy punkt planszy}

   delta_y:=1;

if((yk>=2)) then delta_y:=1; {podw˘jny skok}

if((by=2)) then yk:=0; {wyzerowanie przy dotknieciu ziemi}


{przeszkoda}

if((pxk +delta_x >55) and

   (pxk +delta_x <110) and

   (pyk +delta_y =200)) then

   delta_y:=1;

if((pxk +delta_x >5) and

   (pxk +delta_x <110) and

   (pyk +delta_y =200)) then

   delta_y:=1;


{p˘lka}

if((pxk +delta_x >=450) and {czy jest na p˘lce?}

   (pxk +delta_x <=599) and

   (pyk +delta_y =230)) then

   begin

   delta_y:=0;

   by:=2;

   yk:=-1;

   dp:=2;

   end;

if((pxk >=500-sk) and {czy dotyka boku p˘lki}

   (pyk >280-wk)) then

   dbp:=2;

if((pxk <500-sk) or

   (pyk <280-wk)) then

   dbp:=1;


if(dbp=2) then {jesli tak to zablokuj ruch}

  delta_x:=0;


{czyszczenie}

delay(4);

cleardevice;


end;

readln

end.