Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2012, 22:07   #1
citruswa
 
Регистрация: 29.02.2012
Сообщений: 6
По умолчанию Движение объектов в Delphi

Добрый день. Окончательно запутался в классах, полиморфизме и кучи ошибок.. Прошу помощи, как исправить эти ошибки?

Есть три фигуры (см.картинку). Их надо привести в одновременное движение,при ударе о стенку они должны отражаться (угол падения=углу отражения).


Unit1:
PHP код:
unit Unit1;
interface
uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
Dialogs,Unit2StdCtrlsExtCtrlsUnit2;

type TForm1 = class(TForm)
    
Image1TImage;
    
Button1TButton;
    
Button2TButton;
    
Button3TButton;
    
Timer1TTimer;
    
procedure Button1Click(SenderTObject);
    
procedure FormActivate(SenderTObject);
    
procedure Button2Click(SenderTObject);
    
procedure Timer1Timer(SenderTObject);
    
procedure Button3Click(SenderTObject);
  
end;

var
  
Form1TForm1;
  
Ellipse1:Tellipse;
  
Ellipse2:TEllipse2;
  
Ellipse3:Tellipse3;
  
x1,y1,dx1,dy1,x2,y2,dx2,dy2,x3,y3,dx3,dy3:Integer;fl:Boolean;
implementation
{$R *.dfm}

procedure TForm1.Button1Click(SenderTObject);
begin
  close
;
end;

procedure TForm1.FormActivate(SenderTObject);
begin
 flag
:=true;
  
Timer1.Enabled:=False;
  
Image1.Canvas.Pen.Color:=clWhite;
  
Image1.Canvas.Rectangle(0,0,800,400);
  
Image1.Canvas.Pen.Color:=clBlack;
end;

procedure TForm1.Button2Click(SenderTObject);
begin
fl
:=True;
  
Timer1.Enabled:=False;
  
Image1.Canvas.Pen.Color:=clwhite;
  
Image1.Canvas.Rectangle(0,0,800,400);
  
Image1.Canvas.Pen.Color:=clBlack;
  
Randomize;
  
dx1:=randomrange(1,4);
  
dy1:=randomrange(-4,-1);
  
dx2:=randomrange(-4,-1);
  
dy2:=randomrange(1,4);
  
dx3:=randomrange(1,4);
  
dy3:=randomrange(1,4);
  
x1:=70;  y1:=300x2:=302y2:=300x3:=186y3:=100;
  
xr1:=400yr1:=100xr2:=350yr2:=200xr3:=400yr3:=300;
  
xr4:=450yr4:=200;
  
xa:=600;  ya:=200;  b:=100;
end;

  
Ellipse1.Free;
  
Ellipse1:=Ellipse1.Create(x1,y1,dx1,dy1:integer;Image1);
  
Ellipse1.draw;

  
Ellipse2.Free;
  
Ellipse2:=Ellipse2.Create(x1,y1,dx1,dy1,x2,y2,dx2,dy2:integer;Image1);
  
Ellipse2.draw;

  
Ellipse3.Free;
  
Ellipse3:=Ellipse3.Create(x1,y1,dx1,dy1,x3,y3,dx3,dy3:integer;Image1);
  
Ellipse3.draw;

procedure TForm1.Timer1Timer(SenderTObject);
begin
if fl then
  begin
   Image1
.Canvas.Pen.Color:=clwhite;
   
Image1.Canvas.Rectangle(0,0,800,400);
   
Image1.Canvas.Pen.Color:=clBlack;
   
Ellipse1.move;
   
Ellipse2.move;
   
Ellipse3.move;
  
end;
end;

procedure TForm1.Button3Click(SenderTObject);
begin
 flag
:=not flag;
  
Timer1.Interval:=1;
  if 
not flag then
  Timer1
.Enabled:=True;
  if 
flag then
  Timer1
.Enabled:=False;
end;
end
citruswa вне форума Ответить с цитированием
Старый 09.03.2012, 22:07   #2
citruswa
 
Регистрация: 29.02.2012
Сообщений: 6
По умолчанию

Unit2
PHP код:
unit Unit2;
interface
Uses graphics,ExtCtrls;

Type
     TEllipse
=Class
         
x,y,dx,dy:integer;
         
procedure Draw(Image1:Timage);virtual;
        
constructor Create(ax,ay,adx,ady:integer;aImage:TImage);
        
procedure Movevirtual;
     
end;

     
TEllipse2=Class(TEllipse)
        
x1,y1,dx1,dy1:integer;
        
procedure Draw(Image1:Timage);virtual;
        
constructor Create(ax,ay,adx,ady,ax1,ay1,adx1,ady1:integer;aImage:TImage);
        
procedure Movevirtual;
     
end;

     
TEllipse3=Class(TEllipse)
            
x2,y2,dx2,dy2:integer;
            
procedure Draw(Image1:Timage);virtual;
            
constructor Create(ax,ay,adx,ady,ax2,ay2,adx2,ady2:integer;aImage:TImage);
            
procedure Movevirtual;
     
end;
implementation

 Constructor TEllipse
.Create;
    
Begin x:=axy:=aydx:=adxdy:=ady;End;

 
procedure TEllipse.draw;
 var 
t,s,c:Real;
     
i:Integer;
 
begin
  Image1
.Canvas.Moveto(x,y);
  for 
i:=1 to 360 do
   
begin
    t
:=pi/180*i;
    
s:=sin(t);
    
c:=cos(t);
    
x:=round(s*s*s)+x;
    
y:=round(c*c*c)+y;
    
Image1.Canvas.ellipse(x,y,dx,dy);
   
end;
 
end;

 
procedure TEllipse.move;
 
begin
  inherited draw
;
  
x:=x+dx;
  
y:=y+dy;
  if ((
ya<305) and (ya>=300)) or ((ya>95) and (ya<=100)) then
   dy
:=-dy;
  if ((
xa<705) and (xa>=700)) or ((xa>95) and (xa<=100)) then
   dx
:=-dx;
 
end;

 
Constructor TEllipse2.Create;
    
Begin
    inherited create
(ax,ay,adx,ady:integer;aImage:TImage); x1:=axy1:=aydx1:=adxdy1:=adyEnd;

    
procedure TEllipse2.draw;
    
begin Image1.Canvas.Ellipse(x1,y1,dx1,dy1);end;

    
procedure TEllipse2.move;
 
begin
  inherited draw
;
   
x1:=x1+dx1;
   
y1:=y1+dy1;
  if ((
y<400) and (y>=395)) or ((y3>0) and (y3<=5)) then
   dy
:=-dy;
  if ((
x2<800) and (x2>=795)) or ((x>0) and (x<=5)) then
   dx
:=-dx;
 
end;

     
constructor TEllipse3.Create;
 
begin
  inherited create
(aImage,xs,ys,dxs,dys);
   
x2:=axy2:=aydx2:=adxdy2:=ady;
 
end;

 
procedure TEllipse2.draw;
 
begin
  Image
.Canvas.MoveTo(x,y);
  
Image.Canvas.Ellipse(x2,y2,dx2,dy2);
 
end;

 
procedure TEllipse3.draw;
 
begin
  Image
.Canvas.MoveTo(x,y);
  
Image.Canvas.Ellipse(x3,y3,dx3,dy3)
 
end;

 
procedure TEllipse3.move;
 
begin
  TEllipse3
.draw;
   
x2:=x2+dx2;
   
y2:=y2+dy2;
  if ((
y3<400) and (y3>=396)) or ((y>0) and (y<=4)) then
   dy
:=-dy;
  if ((
x4<800) and (x4>=796)) or ((x2>0) and (x2<=4)) then
   dx
:=-dx;
 
end;

end
citruswa вне форума Ответить с цитированием
Старый 10.03.2012, 01:00   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Если ошибки компиляции - то прикрепляйте проект.
Если ошибки логики, то сами где-то намудрили... тут мало кто поможет, ибо Вы даже задание не расписали, не понятно что за движение (вверх-вниз или вправо-влево или ещё как), что за удар(с изменением формы, с изменением ориентации одной фигуры из группы относительно другой или без)

Не понял, зачем передаёте в конструктор AImage? если нигде его не используете, ибо прорисовка на Image1, который передаёте в процедуру draw. А в элипс2 и элипс3 в процедуре draw вообще используете неизвестный в тамошнем контексте Image (напомню, что в том контексте есть только Image1)

сей код вообще фееричен, лежит просто так в модуле, вне методов.
Код:
  Ellipse1.Free; 
  Ellipse1:=Ellipse1.Create(x1,y1,dx1,dy1:integer;Image1); 
  Ellipse1.draw; 

  Ellipse2.Free; 
  Ellipse2:=Ellipse2.Create(x1,y1,dx1,dy1,x2,y2,dx2,dy2:integer;Image1); 
  Ellipse2.draw; 

  Ellipse3.Free; 
  Ellipse3:=Ellipse3.Create(x1,y1,dx1,dy1,x3,y3,dx3,dy3:integer;Image1); 
  Ellipse3.draw;
Тут непонятно зачем так сделано:
Код:
    procedure TEllipse2.move; 
 begin 
  inherited draw; // <-
...
Это не скомпилится мне кажется
Код:
 procedure TEllipse3.move; 
 begin 
  TEllipse3.draw; // <-
Код:
Timer1.Interval:=1;
надо устанавливать в инспекторе объектов или при FormCreate

это
Код:
 flag:=not flag; 
  if not flag then 
  Timer1.Enabled:=True; 
  if flag then 
  Timer1.Enabled:=False;
можно заменить единственным
Код:
Timer1.Enabled := not Timer1.Enabled;
Идентация и имена переменных, да и вообще композиция кода оставляют желать многого.

Последний раз редактировалось phomm; 10.03.2012 в 01:13.
phomm вне форума Ответить с цитированием
Старый 10.03.2012, 10:16   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Окончательно запутался в классах, полиморфизме
Код:
   TEllipse=Class 
         x,y,dx,dy:integer; 
         procedure Draw(Image1:Timage);virtual; 
        constructor Create(ax,ay,adx,ady:integer;aImage:TImage); 
        procedure Move; virtual; 
     end; 

     TEllipse2=Class(TEllipse) 
        x1,y1,dx1,dy1:integer; 
        procedure Draw(Image1:Timage);OVERRIDE;
        constructor Create(ax,ay,adx,ady,ax1,ay1,adx1,ady1:integer;aImage:TImage); 
        procedure Move; OVERIDE;
     end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
движение графических объектов elka Общие вопросы C/C++ 9 25.04.2012 17:24
свободное движение объектов С++ ruber54 Помощь студентам 4 12.12.2011 21:33
Движение графических объектов Krivo1993 Помощь студентам 4 31.01.2011 13:58
движение объектов в поле Chart weezmei Помощь студентам 0 22.05.2010 01:09
Движение 2-x объектов (Delphi) VadEr Помощь студентам 2 06.06.2009 17:19