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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2011, 10:03   #1
phasha
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 130
По умолчанию как заставить окружность двигаться в обратную сторону?

Код:
procedure tcircle.move(sender: TObject);
begin
  stepx:=Random(7)-3;
  stepy:=-10;//шаг вверх
  if ((placement.X+stepx-radius>0)and(placement.X+stepx+radius<width))//чтобы не превышать границ
       and
       ((placement.Y+stepy-radius>0)and(placement.Y+stepy+radius<height))
       then begin
       show(true);
       placement:=Point(placement.X+stepx,placement.Y+stepy);//координаты точки
       show;
       end;
      if placement.y=radius then stepy:=stepy*(-1);//шаги в обратную
end;
phasha вне форума Ответить с цитированием
Старый 17.10.2011, 11:40   #2
phasha
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 130
По умолчанию

Код:
if placement.y=radius then stepy:=stepy*(-1);//шаги в обратную
не могу сформулировать условие((
phasha вне форума Ответить с цитированием
Старый 17.10.2011, 11:42   #3
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    IMG1: TImage;
    Timer1: TTimer;
    procedure FormActivate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    procedure move(sender: TObject);
    procedure Show(Visible:boolean);
  public
    placement : TPoint;
    step      : TPoint;
    radius    : integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.move(Sender: TObject);
begin
  step.x:=Random(7)-3;
  show(false);

  if ((placement.X-radius>0) and (placement.X+radius<width)) and //чтобы не превышать границ
     ((placement.Y-radius>0) and (placement.Y+radius<height))then
   show(true) else
   step.y:=step.y*(-1);//шаги в обратную
   placement:=Point(placement.X+step.x,placement.Y+step.y);//координаты точки
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
   placement.X:= IMG1.Width div 2;
   placement.Y:= IMG1.Height div 2;
   radius     := 25;
   step.y     := -10;
end;

procedure TForm1.Show(Visible: boolean);
begin
   if Visible then
   img1.Canvas.Ellipse(placement.X-radius,placement.Y-radius,
     placement.X+radius,placement.Y+radius) else
   img1.Canvas.FillRect(img1.BoundsRect);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   move(sender);
end;

end.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 17.10.2011, 12:34   #4
phasha
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 130
По умолчанию

попробовал ваш способ,у меня круги двигались по полосе границы((я похоже не то что то сделал(,в Unit2 описано движениемои круги.rar
phasha вне форума Ответить с цитированием
Старый 17.10.2011, 13:24   #5
phasha
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 130
По умолчанию

Код:
unit Unit2;

interface
 uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ExtCtrls;
  type tcircle=class
  radius:Integer;
  color:TColor;
  placement:TPoint;
  dx,dy:Integer;
  canvas:TCanvas;
  speed:Integer;
  stepx,stepy:Integer;
  timer:ttimer;
  tag:Integer;
  height,width:Integer;
  constructor create(r,h,w,t,x,y:Integer;col:TColor;c:TCanvas);
  destructor destroy; override;
  procedure move(sender:TObject);
  procedure show(transparent:Boolean=false);    end;
implementation

{ tcircle }

constructor tcircle.create(r, h, w, t, x, y: Integer; col: TColor;
  c: TCanvas);
begin   inherited create;
height:=h;width:=w;dx:=x;dy:=y;tag:=t;color:=col;canvas:=c;radius:=r;
placement:=Point(random(width-2*radius-1)+radius +1,random(height-2*radius-1)+radius+1);
speed:=100;
timer:=ttimer.create(nil);
timer.interval:=speed;
timer.ontimer:=move;
timer.enabled:=True;
end;

destructor tcircle.destroy;
begin
timer.enabled:=False;
timer.free;
  inherited;
end;

procedure tcircle.move(sender: TObject);
var stepy,stepx:Integer;
begin
  stepx:=10;
  stepy:=10;
  if ((placement.X+stepx-radius>0)and(placement.X+stepx+radius<width))
       and
       ((placement.Y+stepy-radius>0)and(placement.Y+stepy+radius<height))
       then begin
       show(true);
       placement:=Point(placement.X+stepx,placement.Y+stepy);
       show;
       end else  begin
       stepy:=stepy*(-1);
       stepx:=stepx*(-1);
       show(true);
       placement:=Point(placement.X+stepx,placement.Y+stepy);
       show;
end;      end;

procedure tcircle.show(transparent: Boolean);
begin
      if transparent then begin
        canvas.Brush.Color:=clWhite;
        canvas.Pen.Mode:=pmWhite;
        canvas.Ellipse(placement.X-radius+dx,placement.Y-radius+dy,placement.X+radius+dx,placement.Y+radius+dy);
      end
      else begin
        canvas.Brush.Color:=color;
        canvas.Pen.Mode:=pmCopy;
        canvas.Ellipse(placement.X+dx-radius,placement.Y-radius+dy,placement.X+radius+dx,placement.Y+radius+dy);
        canvas.TextOut(placement.X+dx-trunc(canvas.TextWidth(inttostr(tag))),placement.Y+dy-trunc(canvas.TextHeight('1')/2),IntToStr(tag));
      end;
end;

end.
еще раз изменил,теперь они бьются об стенки,зато не останавливаются...
как сделать так чтоб круги ВСЕ таки отскакивали от границ и двигались дальше?(((в тупике
phasha вне форума Ответить с цитированием
Старый 17.10.2011, 13:49   #6
phasha
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 130
По умолчанию

Код:
procedure tcircle.move(sender: TObject);
var stepy,stepx:Integer;
begin
  stepx:=10;
  stepy:=10;
  if ((placement.X+stepx-radius>0)and(placement.X+stepx+radius<width)) then
        stepx:=stepx*(-1);
   if ((placement.Y+stepy-radius>0)and(placement.Y+stepy+radius<height))
       then    stepy:=stepy*(-1);
       show(true);
       placement:=Point(placement.X+stepx,placement.Y+stepy);
       show;
end;
уже ближе но все равно не то((
phasha вне форума Ответить с цитированием
Старый 17.10.2011, 13:58   #7
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
уже ближе но все равно не то((
Если хотите нормального результата (см. мой код) вынесите вот эти переменные за тело функции
Код:
var stepy,stepx:Integer;
begin
  stepx:=10;
  stepy:=10;
Каждый раз, когда идёт вызов метода (функции) значение stepy становиться 10 в не зависимо от того что у вас stepy:=stepy*(-1);
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 17.10.2011, 15:07   #8
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

думаю что Вам нужно чтото на подобии этого=> (см. вложение)
Вложения
Тип файла: zip MoveCircle.zip (205.2 Кб, 9 просмотров)
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 17.10.2011, 18:54   #9
phasha
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 130
По умолчанию

спасибо))яркий пример))
phasha вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заставить Image двигаться по прямой к указанной точке? Yougan Общие вопросы Delphi 6 30.05.2011 23:59
Foreach в обратную сторону. KobolD Общие вопросы .NET 5 13.11.2010 10:24
как заставить компонент Shape двигаться по ступенькам Ogurez Помощь студентам 1 31.10.2010 11:07
Как двигаться по данным после select? _ozzy_ SQL, базы данных 5 30.06.2008 09:33
Как двигаться по записям после Select? _ozzy_ БД в Delphi 5 17.06.2008 15:53