Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Движение по карте

Автор: Сергей Меркурьев 15.08.2010 13:41

Решил сделать небольшой проектик.
В общем хочу сделать подобие движение по игровой карте (как в стратегиях и других играх). Работаю с OnMouseMove. Может я сделал немного глупо, но я растянул карту (Image) на всю её ширину и длину. Другого мне в голову пока, что не пришло.
Вот код движения карты вправо

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not(PtInRect(Rect(Form1.Left,
Form1.Top,
Form1.Left + Form1.Width-20,
Form1.Top + Form1.Height), ClientToScreen(Point(x, y))))
then Timer1.Enabled := true
else Timer1.Enabled := false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
If Image1.Left >= 640 - PW then
Image1.Left := Image1.Left - 7;
end;

Но почему-то когда Image двинется немного вправо, то координаты меняются и изображение двигать можно даже на середине.
Что тут можно сделать?

Автор: volvo 15.08.2010 13:44

Вот почему ты вызываешь Form1.Top, и так далее, но ClientToScreen(Point(x, y)) ? Чей ClientToScreen вызывается, не расскажешь? smile.gif

Автор: Сергей Меркурьев 15.08.2010 13:49

ClientToScreen вызывается на Image.

Цитата
Вот почему ты вызываешь Form1.Top

А что мне вызывать? У меня ведь форма меньше самого изображения, а мышь вроде всегда именно на форме находится.

Автор: volvo 15.08.2010 14:55

А попробуй-ка вот это:

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Timer1.Enabled :=
PtInRect(Rect(form1.Width - 20, 0, form1.Width, form1.Height), Point(image1.Left + X, Y))
end;

(до Дельфи доберусь только послезавтра, так что пока - теоретически. Потом проверю...)


Автор: Сергей Меркурьев 15.08.2010 16:17

volvo, так всё работает ;)
У меня ещё небольшой вопрос есть, когда происходит движение иногда проскальзывают белые полосы. Можно что-нибудь с этим сделать?

Автор: volvo 15.08.2010 16:33

Можно попробовать установить у формы DoubleBuffered := True, это немного снизит "мерцания".

Автор: Сергей Меркурьев 15.08.2010 16:37

Большое спасибо за помощь, мерциния теперь вовсе исчезли smile.gif