2мес
Pascal ABC Почему объекты ведут себя по разному в описанных и главной процедуре?
Вот есть программка, в ней объект, который графически изменяется. Только в главной процедуре у него есть анимация, а через обработчик клавиатуры он просто меняет цвет через время за которое эта анимация должна произойти.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
uses graphWPF;
type
pos = record
x, y: integer;
end;
cube_base = class
private
ind_clr_off, ind_clr_on: color;
position: pos;
status: boolean;
procedure draw;
begin
fillrectangle(position.x - 40, position.y, 120, 120, rgb($AA, $AA, $AA));
if status then
fillrectangle(position.x, position.y + 40, 40, 40, ind_clr_on)
else
fillrectangle(position.x, position.y + 40, 40, 40, ind_clr_off);
end;
public
constructor Create(x, y: integer);
begin
position.x := x;
position.y := y;
ind_clr_off := rgb($32, $CD, $32); ind_clr_on := rgb($FF, $8C, $00);
draw;
end;
procedure switch;
begin
status := not status;
if status then
for var swc := 0 to 40 do
begin
fillrectangle(position.x, position.y + 40 + swc, 40, 40, ind_clr_off);
fillrectangle(position.x, position.y + swc, 40, 40, ind_clr_on);
fillrectangle(position.x - 40, position.y, 120, 40, rgb($AA, $AA, $AA));
fillrectangle(position.x - 40, position.y + 80, 120, 40, rgb($AA, $AA, $AA));
write(swc);
sleep(5);
end
else
for var swc := 40 downto 0 do
begin
fillrectangle(position.x, position.y + 40 + swc, 40, 40, ind_clr_off);
fillrectangle(position.x, position.y + swc, 40, 40, ind_clr_on);
fillrectangle(position.x - 40, position.y, 120, 40, rgb($AA, $AA, $AA));
fillrectangle(position.x - 40, position.y + 80, 120, 40, rgb($AA, $AA, $AA));
write(swc);
sleep(5);
end;
end;
end;
var
blocklist := new List<cube_base>;
procedure keymap(key: key);
begin
if key = system.Windows.Input.Key.Space then
blocklist.Item[0].switch;
end;
begin
window.Top := 0;
window.Left := 0;
writeln('run');
OnKeyDown := keymap;
blocklist += new cube_base( 100, 100);
blocklist.Item[0].switch;
sleep(1000);
blocklist.Item[0].switch;
end.