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.