Mi a gond ezzel a free pascal kóddal?
repeat
ch := readkey;
if ch=#0 then begin
ch := readkey;
case ch of
ch := readkey;
repeat
#72: if y-5>=0 then y:=y-5; {fel} until ch<>#72;
#80: if y+5<=440 then y:=y+5; {le}
#75: if x-5>=0 then x:=x-5; {balra}
#77: if x+5<=602 then x:=x+5; {jobbra}
end;
putimage(x,y,p^,copyput);
end;
until ch=#27;
ezzel a ciklussal egy képet/alakzatot mozgatok, de úgy szeretném megcsinálni , hogy addig menjen egy irányba amíg más gombot le nem nyomok.a #72-nél az a repeat ... until ch<> #72 ezzel próbálkoztam, de nem jó, egyébként az ,működik, hogy jobbra barra fel le mozog. Köszönöm előre is a segítséget!
program Pelda30;
uses graph, wincrt;
var gd,gm,i,j,a: integer;
p:pointer;
x,y:integer;
ch:char;
begin
a := 1;
x := 0;
y := 0;
{ grafika inicializalasa }
gd := d4bit;
gm := m640x480;
initgraph(gd,gm,'');
{ rajzolas }
rectangle(10,10,30,30);
{ memoria lefoglalasa }
getmem(p,imagesize(0,0,42,42));
{ kep megjegyzese }
getimage(0,0,42,42,p^);
{ kep mozgatasa a kurzorbillentyuk segitsegevel }
repeat
ch := readkey;
if ch=#0 then begin
ch := readkey;
case ch of
#72: if y-5>=0 then y:=y-5; {fel}
#80: if y+5<=440 then y:=y+5; {le}
#75: if x-5>=0 then x:=x-5; {balra}
#77: if x+5<=602 then x:=x+5; {jobbra}
end;
putimage(x,y,p^,copyput);
end;
until ch=#27;
{ memoria felszabaditasa }
freemem(p,imagesize(0,0,42,42));
{ grafikus mod bezarasa }
closegraph;
end.
itt az egész, az utolsónak: nem értem pontosan hogy gondolod, írnál rá egy példát? előre is köszönöm! :)
Például a te programod a következőképpen fog kinézni: /mármint az a része, amit a kérdésben kiírtál/
repeat
ch:=readkey;
if ch=0 then
begin
ch:=readkey;
repeat
case ch of
#72: if y-5>=0 then y:=y-5;
#80: if y+5<=440 then y:=y+5;
#75: if x-5>=0 then x:=x-5;
#77: if x+5<=602 then x:=x+5;
end;
putimage(x,y,p^,copyput);
until KeyPressed;
end;
until ch=#27;
Ezen persze kell még dolgozni, mert ha a képernyő szélére ért a képed, akkor nem mozog, de újrarajzolja, ezért esetleg villoghat majd, ami hülyén néz ki. Ugyanez történik, ha nem nyílbillentyűt (hanem pl. CTRL+Z-t) üt le a felhasználó. Ezt legegyszerűbb úgy javítani, hogy csinálsz egy b változót, a belső repeat elején hamisra állítod, a case mindegyik if-jében átállítod true-ra (viszont akkor majd kell begin...end!), a putimage-t csak akkor futtatod, ha b igaz, és a belső ciklus kilépési feltételét
Keypressed or (Not(b))
-re cseréled. x és y lehetőleg legyen Integer típusú, mert láttam már problémázni a Pascalt a x-5>=0 feltétel eldöntésén Byte/Word típusban... (ha x<5, nem mindig jól csinálja...)
megpróbáltam úgy ahogy mondtad, de még mindig vmi baja van :S kérlek még 1x nézd meg aztán nem zaklatlak :)
program Pelda30;
uses graph, wincrt;
var gd,gm,i,j: integer;
p:pointer;
x,y:integer;
ch:char;
begin
x := 0;
y := 0;
{ grafika inicializalasa }
gd := d4bit;
gm := m640x480;
initgraph(gd,gm,'');
{ rajzolas }
rectangle(10,10,30,30);
{ memoria lefoglalasa }
getmem(p,imagesize(0,0,42,42));
{ kep megjegyzese }
getimage(0,0,42,42,p^);
{ kep mozgatasa a kurzorbillentyuk segitsegevel }
repeat
ch:=readkey;
if ch=0 then
begin
ch:=readkey;
repeat
case ch of
#72: if y-5>=0 then y:=y-5;
#80: if y+5<=440 then y:=y+5;
#75: if x-5>=0 then x:=x-5;
#77: if x+5<=602 then x:=x+5;
end;
putimage(x,y,p^,copyput);
until KeyPressed;
end;
until ch=#27;
{ grafikus mod bezarasa }
closegraph;
end.
itt az egész, a te javaslatoddal.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!