Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Убегающая картинка


Автор: Turgenev 29.11.2012, 14:47
Хочется сделать, чтобы картинка плавно убегала от курсора. Если реализовать это путем прибавления числа к координатам картинки при наведении на нее курсора, то все это будет скачкообразно. Если число уменьшить, то картинка не будет успевать убегать от курсора и все это будет очень медленно. Все что я здесь написал я проверил программным путем. Хочется сделать чтобы картинка убегала методом анимации. Ниже приведу код проги анимации, в котором хочу сделать чтобы картинка korb убегала от курсора так же, как она двигается по fon. Подскажите пожалуйста как это сделать.
Код

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
   fon:tbitmap;
  KORB:TBITMAP;
  x:integer;
  shx:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
shx:=6;
fon:=tbitmap.Create;
korb:=tbitmap.Create;
fon.LoadFromFile('fon.bmp');
korb.LoadFromFile('korb.bmp');
korb.transparent:=true;
image1.Canvas.Draw(0,0,fon);
image1.Canvas.Draw(x,60,korb);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
x:=x+shx;
if x>500 then shx:=shx*-1;
if x<0 then shx:=shx*-1;
image1.Canvas.Draw(0,0,fon);
image1.Canvas.Draw(x,60,korb);
end;
end.
 

Автор: DarkProg 29.11.2012, 14:57
Что-то вы по странному пути пошли. Вы что хотите реализовать чтобы картинка всегда убегала от пользователя?
Тогда вам надо реагировать на событие OnMouseMove. Не надо никаких таймеров.
Вдобавок ещё будет мерцать если постоянно перерисовывать. Возьмите TImage и двигайте его. Если надо, то несколько TImage.

Автор: Turgenev 29.11.2012, 16:06
Ну если OnMouseMove что будет дерганно убегать, а надо плавно.
Код

procedure TForm1.Button3MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var index:integer;
begin
index := random(4);
case index of
0: Button3.Left := Button3.Left +5;
1: Button3.Left := Button3.Left -5;
2: Button3.Top := Button3.Top +5;
3: Button3.Top := Button3.Top -5;
end;

Это дерганно, надо анимированно, плавно. И картинка не мерцает в примере первого сообщения

Автор: DarkProg 30.11.2012, 12:47
Ну так её дёргает потому что каждый раз при любом смещении хотя бы на 1 пиксель мыши у вас в произвольную сторону дёргает на 5 пикселей...

К примеру такой код не совсем даёт нужный эффект, но хотя бы что-то
Код

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  Button1.Left:=X+1;
  Button1.Top:=Y+1;
end;

Автор: Turgenev 1.12.2012, 15:17
DarkProg, а что изменилось в твоем коде относительно моего, за исключением рандома и кол-ва пикселей? Ты так же прибавляешь к координатам кнопки числа и в своем примере я так же могу убрать 5 и поставить 1, только в твоем кнопка стандартно будет убегать в левый верхний угол

Автор: DarkProg 2.12.2012, 19:48
Цитата(Turgenev @  1.12.2012,  16:17 Найти цитируемый пост)
DarkProg, а что изменилось в твоем коде относительно моего, за исключением рандома и кол-ва пикселей?

Ну во первых у меня не будет дёргать если вести мышкой по экрану. Если двигать более чем на 1 пиксель, то точно будет дерготня.
Во вторых я привязался к координатам мыши на форме. Я точно знаю где мыша и соответственно двигаюсь относительно координат. Можно хранить несколько значений координат и предсказывать откуда пользователь надвигает мышой, тогда можно будет плавненько отодвигаться.

В твоём примере у тебя при движении дёргает в произвольную сторону, в результате чего происходит хаос...

Цитата(Turgenev @  1.12.2012,  16:17 Найти цитируемый пост)
только в твоем кнопка стандартно будет убегать в левый верхний угол 

кнопка всегда будет чуть ниже чем указатель мыши ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)