Тема зародилась Задачник по ООП, а это ее продолжения. Вот структура того, что я написал (измененная)
1 TGObject -// движущейся графический объект, умеет: // - инитиализировать себя constructor init(speed,color:byte; angle,time:real); // - двигаться procedure moveto; //- высчитывать свое новое положение, перекрывается в наследниках procedure calculation; virtual; //abstract; //- вызывается с Supervisor, только в случае столкновения. // Меняем скорость и угол полета. procedure ChangeDirection(speed:byte; angle:real); // рисуем себя, перекрывается в наследниках procedure show; virtual; // abstract; // стираем себя, перекрывается в наследниках procedure hide; virtual; // abstract; // стирает себя с экрана destructor done; virtual;
2 TBall - наследник TGObject, теперь это движущейся шарик // - добавили новое поле r -радиус, инициализацию остальных полей наследуем constructor init(x,y:integer; speed,color:byte; angle,time:real; r:byte); procedure moveto;// перекрываем, наслудуем procedure calculation; virtual;// перекрываем procedure show; virtual; // тоже перекрываем procedure hide; virtual; // тоже перекрываем destructor done; virtual; // перекрываем, наслудуем
3 TItem - элемент списка указателей на объекты TBall // инициализирует свою информационную часть constructor constructor init(Info:TPGObject; Sled:TPItem); destructor done;// удаляем информационную часть
4 TList - содержит список указателей на объеты типа TBall constructor init;//-инициализирует список function AddItem(Data:TPGObject):boolean; // добавляем новый элемент function DeleteItem(pdel:TPItem):boolean; // удаляем элемент destructor done;//удаляем весь список
Исходники в виде модулей для FPC - Balls.rar ( 15.06 килобайт )
Кол-во скачиваний: 503
Возникли затруднения в написания модуля TSupervisor, а именно с главным циклом и наследием этого объекта. Вот, что я написал
{------------------------TSupervisor------------------} type TPSuperVisor=^TSuperVisor; TSuperVisor=object GObjectsList:TList; Rect:TRect; constructor init(xa,ya,xb,yb:integer); function AddGObject(p:TPGObject):boolean; function DeleteGObject(p:TPGObject):boolean; function ChangeDirection; function Calculation; function WriteResults; procedure main; destructor done; end; constructor TSuperVisor.init; begin GObjectsList.init; Rect.assign(xa,ya,xb,yb); SetColor(white); Rectangle(xa,ya,xb,yb); end;
function TSuperVisor.AddGObject(p:TPGObject); begin AddGObject:=GObjectsList.AddItem(p); end;
function TSuperVisor.DeleteGObject(p:TPGObject):boolean; begin DeleteTPGObject:=GObjectsList.DeleteItem(p); end;
procedure TSuperVisor.main; begin end;
destructor TSuperVisor.done; begin GObjectsList.done; ClearDevice; end;
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
Т.е. при вызове ChangeDirection флажок изменения ставим в true, при вызове MoveTo - в false.
Ты не понял... Еще раз перечитай... Флажок нужен, чтобы MoveTo (в смысле, пересчет координат) не вызывался еще раз после переноса указателя из одного списка в другой (при обработке второго списка), но ведь не только тот объект, который изменил направление, должен пересчитать координаты? Пересчитывать должны ВСЕ, но ни один не должен этого делать дважды...
Цитата
Т.е. при вызове ChangeDirection флажок изменения ставим в true
С этим согласен... После ChangeDirection устанавливаем флаг в True, и переносим объект в другой список... А вот сбрасывать надо именно так, как я показал - а не по MoveTo...
Цитата
Может тогда сделать четыре списка?
Надо подумать... У тебя тут угол, а не проекция Vx... Все-таки, скорее всего будет достаточно двух, и при нулевом Vx - проверять оба списка...