uses Graph, CRT;Почему в выделенной строчке неверная ссылка на процедуру? как сделать верно?
{----------------------------SetGraph_BEGIN---------------------------------}
type
SetGraph=object
Procedure Hide(x1,y1,x2,y2: integer);
Procedure Show(x1,y1,x2,y2,rec_color: integer);
end;
Procedure SetGraph.Hide;
begin
Setcolor(0);
Rectangle(x1,y1,x2,y2);
end;
Procedure SetGraph.Show;
begin
SetColor(rec_color);
Rectangle(x1,y2,x2,y2);
end;
{----------------------------SetGraph_END-----------------------------------}
var d,r,px1,px2,py1,py2,pcolor: integer;
Procedure Move;
begin
SetGraph.hide(px1,py1,px2,py2); { <--- }
px1:=x1+a;
pY1:=y1+b;
px2:=x2+c;
py2:=y2+d;
SetGraph.show(px1,py1,px2,py2,pcolor);;
end;
begin
d:=detect;
initgraph(d,r,'');
px1:=(GetMaxX div 5)*3;
py1:=(GetMaxY div 5)*3;
px2:=px1*4;
py2:=px1*4;
pcolor:=3
SetGraph.show(px1,py1,px2,py2,pcolor);
repeat begin
if keypressed then begin
case readkey of
77: move(1,0,1,0);
75: move(-1,0,-1,0);
80: move(0,1,0,1);
72: move(0,-1,0,-1);
end
end
end until readkey=#27;
closegraph;
end.
Skrip
uses Graph, CRT;Или сделал бы Move методом SetGraph...
{----------------------------SetGraph_BEGIN---------------------------------}
type
SetGraph=object
Procedure Hide(x1,y1,x2,y2: integer);
Procedure Show(x1,y1,x2,y2,rec_color: integer);
end;
Procedure SetGraph.Hide;
begin
Setcolor(0);
Rectangle(x1,y1,x2,y2);
end;
Procedure SetGraph.Show;
begin
SetColor(rec_color);
Rectangle(x1,y2,x2,y2);
end;
{----------------------------SetGraph_END-----------------------------------}
var d,r,px1,px2,py1,py2,pcolor: integer;
Procedure Move(Obj: SetGraph; px1,py1,px2,py2: integer);
begin
Obj.hide(px1,py1,px2,py2);
px1:=x1+a;
pY1:=y1+b;
px2:=x2+c;
py2:=y2+d;
Obj.show(px1,py1,px2,py2,pcolor);
end;
Var
sg: SetGraph;
begin
d:=detect;
initgraph(d,r,'');
px1:=(GetMaxX div 5)*3;
py1:=(GetMaxY div 5)*3;
px2:=px1*4;
py2:=px1*4;
pcolor:=3
sg.show(px1,py1,px2,py2,pcolor);
repeat begin
if keypressed then begin
case readkey of
77: move(sg, 1,0,1,0);
75: move(sg, -1,0,-1,0);
80: move(sg, 0,1,0,1);
72: move(sg, 0,-1,0,-1);
end
end
end until readkey=#27;
closegraph;
end.
volvo, спасибо.
Не за что... А что делаешь, если не секрет? Может быть есть более красивое решение ...
Ни чего особенного. Прямоугольник должен перемещаться вверх-вниз, вправо-влево(в соответствии с нажатой клавишей). Програмка то простая (уже седня делал), но с помощью ООП что-то не получается.
volvo, подскажи теперь почему, кроме черного экрана я ничего не вижу.
Всё, разобрался! Я там с координатами намудрил.
Посмотри вот это тоже ...
Прикрепленные файлы
000.PAS ( 1.26 килобайт )
Кол-во скачиваний: 266
volvo, еще раз спасибо ( и не надо отмахиваться :D ), часа полтора думал что такое :D , а все оказалось так легко.
Вот только не могу понять как работает
Procedure TSetGraph.Move;
Begin
Hide;
Inc(xst, pxst);
Inc(xfn, pxfn);
Inc(yst, pyst);
Inc(yfn, pyfn);
Show(pColor);
end;
volvo, ага, понятно, прсто я не знал доконца все свойства Inc.
Это ведь тоже самое что к примеру xst:=xst+pxst
Skrip
Почти... http://forum.pascal.net.ru/index.php?showtopic=3170
volvo
Понятно.
Вот рабочий (в отличии от самого первого) код программки.
Есть ли еще способ передвигать квадратик так, чтобы рисунок за квадратиком не стирался.
З.Ы. Имеется ввиди такой способ, который не вычерчивает рисунок за квадратиком каждый раз при перемещении квадратика. :D
uses Graph,crt;
{----------------------------SetGraph_BEGIN---------------------------------}
type
SetGraph=object
Procedure Hide(x1,y1,x2,y2: integer);
Procedure Show(x1,y1,x2,y2,rec_color: integer);
end;
Procedure SetGraph.Hide;
begin
Setcolor(0);
Rectangle(x1,y1,x2,y2);
end;
Procedure SetGraph.Show;
begin
SetColor(rec_color);
Rectangle(x1,y1,x2,y2);
end;
{----------------------------SetGraph_END-----------------------------------}
var d,r,px1,px2,py1,py2,pcolor: integer;
rect: setgraph;
Procedure Move(a,b,c,d: integer);
begin
rect.hide(px1,py1,px2,py2);
inc(px1,a);
inc(pY1,B);
inc(px2,c);
inc(py2,d);
rect.show(px1,py1,px2,py2,pcolor);
SetColor(white); { <--- }
Rectangle(0,0,GetMaxX,GetMaxY); { <--- }
Line(0,0,GetMaxX,GetMaxY); { <--- }
line(getmaxX,0,0,getmaxY); { <--- }
end;
begin
d:=detect;
initgraph(d,r,'');
px1:=(GetMaxX div 2)-30;
py1:=(GetMaxY div 2)-30;
px2:=(GetMaxX div 2)+30;
py2:=(GetMaxY div 2)+30;
pcolor:=3;
move(0,0,0,0);
repeat begin
if keypressed then begin
case readkey of
#77: move(1,0,1,0);
#75: move(-1,0,-1,0);
#80: move(0,1,0,1);
#72: move(0,-1,0,-1);
end
end
end until readkey=#27;
closegraph;
end.
Skrip
Я присоединил файл, посмотри его...
Прикрепленные файлы
005.PAS ( 1.34 килобайт )
Кол-во скачиваний: 287
volvo
там же выделена та часть кода на которую тадо обратить внимание, а она осталась на своем месте.
"Рисунок"(выделенный код) не должен каждый раз перечерчиваться, (вызывая прцедуру Move). Он должен начертиться один раз (не в процедуре Мове)и усё, про него желательно забыть
Skrip
Ну так вынеси ее за пределы Move
Вот так?
Прикрепленные файлы
005.PAS ( 1.34 килобайт )
Кол-во скачиваний: 272
volvo, дааа... смешно... . Глупость сказал... сначало надо было разобраться с setwritemode, а потом... Короче поспешишь, людей насмешишь.