IPB
ЛогинПароль:

> Шарики, ООП
сообщение
Сообщение #1


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Тема зародилась Задачник по ООП, а это ее продолжения.
Вот структура того, что я написал (измененная)

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 килобайт ) Кол-во скачиваний: 504



Возникли затруднения в написания модуля TSupervisor, а именно с главным циклом и наследием этого объекта.
Вот, что я написал

uses objects,graphl,UnitTGObject,UnitList;
const
background=black;
ballcolor=red;


{------------------------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;



--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Цитата
НО как только первый шар касается нижней границы и меняет направление, то же самое делает и второй шар

Не выходит спроектировать тоже самое (хотя, когда много шаров я видел ситуации, как шар менял направления не долетая до стенки), можешь дать данные для двух шаров, когда это происходит?
Цитата
кстати, меняет он направление не по закону "угол падения равен углу отражения", а на противоположное - на 180 градусов

no1.gif Вот процедура (переделанная под функцию для примера), отвечающая за это:
Код

uses math;
function ChangeDirection(l:real):real;
      function mydiv(a,b:real):longint;
      begin
        mydiv:=trunc(a/b);
      end;
      function mymod(a,b:real):real;
      begin
        mymod:=a-mydiv(a,b)*b;

      end;
const l90=pi/2;
begin

  ChangeDirection:=mydiv(l,l90)*l90 + (pi-mymod(l,l90));
end;

begin
  writeln(radtodeg(ChangeDirection(degtorad(120))):0:2);
  readln;
end.

Как видишь она не получает никаких внешних данных, но это не правильно. Почему? Вот Прикрепленное изображение .
Выходит нам надо передавать этой процедуре угол (T) под каким располагается поверхность об какую ударился шарик. И новый угол полёта = T+L где L - угол до соударения.

Но так как метод ChangeDirection один для всех (и для случаев столкновения с другими шарами), то нужно знать под каким углом(P) соударяются объекты, для шариков он будет таковым:
P:=arctan((y2-y1)/(x2-x1))+90
x1,y1- координаты центра (точка А на рисунке) первого шара
x2,y2- координаты центра (точка В на рисунке) второго шара
Прикрепленное изображение
Угол P должен высчитывать TSupervisor, но в зависимости от столкнувшихся объектов, он будет вычисляться по разному. Как предлагаешь TSupervisor-у без наследия определять этот угол для любых возможных наследников TGObject?

Сообщение отредактировано: Bokul -


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Bokul   Шарики   22.12.2006 5:44
volvo   Так... Ну, у меня после прочтения программы тоже ш…   22.12.2006 7:21
Bokul   :respect: :ROFL: :lol: Спасибо! Буду …   22.12.2006 7:25
volvo   :) Значит, так... По порядку: С такой реализацией…   22.12.2006 20:07
Bokul   Спасибо! :) Учел все замечания, исправил, из…   23.12.2006 6:33
volvo   А вот с этого места - поподробнее... Что это будут…   23.12.2006 7:19
Bokul   :lol: Думал наследием воспользоваться как инс…   23.12.2006 7:50
volvo   :no1: Совершенно не обязательно... Хочешь способ,…   23.12.2006 8:19
Bokul   Пересчет идет где? В TGObject? Для квадрата у…   23.12.2006 8:29
volvo   Зачем? Прямо в ComputeCollision - у тебя же …   23.12.2006 8:38
Bokul   Спасибо! :) Извиняюсь, что заставил себя жда…   24.12.2006 7:49
volvo   Понаблюдав чуть-чуть за шариками, можно увидеть си…   25.12.2006 1:43
volvo   Реализация TSupervisor осталась за кадром, ты не п…   24.12.2006 13:33
Bokul   Да я вроде все модули прикреплял :blink: , вот TSu…   24.12.2006 22:26
Bokul   Да ты - прав, выигрыш видно сразу, особенно ког…   25.12.2006 2:39
volvo   А именно - вот что (эту картинку я наблюдал сам): …   25.12.2006 2:59
Bokul   Не выходит спроектировать тоже самое (хотя, ког…   25.12.2006 4:09
volvo   Ты не забыл, что у каждого объекта есть вектор ско…   25.12.2006 4:40
Bokul   :yes2: Ты предлагаешь передавать объекту точк…   25.12.2006 5:16
volvo   Что-то обсуждение зацикливается... Я же написал те…   25.12.2006 5:59
Bokul   Ага, просто надо разобраться до конца и потом у…   25.12.2006 6:17
volvo   :blink: Var v, v1, v2: TVector; ... v := k * (k…   25.12.2006 6:29
Bokul   Мысли в слух: Ведь мы полностью не сможем скопиро…   26.12.2006 0:48
Bokul   Какие преимущества: больше не надо мучится со спос…   26.12.2006 1:01
volvo   Будет тормозить, конечно... Представь, что у тебя,…   26.12.2006 1:47
volvo   Сорри, ошибочка... Не будет работать для двух объе…   26.12.2006 1:59
Bokul   Уже сделано :) Правда я оставил угол L для совм…   26.12.2006 2:19
volvo   :no1: Ты не понял... Еще раз перечитай... Флажок …   26.12.2006 3:00
Bokul   Реализация Многоугольник окончена. Возник вопрос -…   31.12.2006 23:48


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.04.2024 12:14
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name