Логин: Пароль:    Регистрация Всеми возможностями сайта можно пользоваться
только после авторизации.
   Забыли пароль?

Поиск
L



Статистика
u
Пользователи онлайн: нет
Гостей онлайн: 2
Всего онлайн: 2
Зарегистрировано юзеров: 6358
Комментариев на сайте: 645
Новый юзер: Realtyvaday



Последние комментарии
c
Aqel прокомментировал "Урок 71 - Работа с сжатыми файлами":
GZip псевдоархив, на мой вопрос тоже не отвечают, как распаковать отдельные файлы/папки...
Pingitrus прокомментировал "Урок 71 - Работа с сжатыми файлами":
Есть еще кто нибудь живой на этом сайте, кто сможет помочь? Так то все работает, zip и rar распаковывает, но у меня есть файл dat который сжат GZip, почему то его не удается распаковать или так не получится так как этот файл не является архивом или является?)) пишет ошибку что неверная функция



Мы в соцсетях
c
Delphi
Урок 27 - Создаем игру Ping-pong - часть(2/3)

  Продолжаем писать игру Пинг-Понг. В этом уроке мы займемся реализацией игрока.

   Вытащим еще один Shape и сделаем ему синий цвет. Вот собственно этим мы и будем отбивать шарик. Перемещать его мы будем мышкой.

шарик


   Для этого создадим событие Form1 OnMouseMove:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Shape2.Top:= Mouse.CursorPos.Y - Form1.ClientOrigin.Y;
end;
   Shape2 - это наш прямоугольник, Mouse.CursorPos - позиции курсора, Form1.ClientOrigin - экранные координаты формы. После компиляции прямоугольник двигается вместе с мышкой, но шарик не отбивается.

   В Delphi есть такая функция:
function InterSectRect(var Dst: TRect; const Src1: TRect; const Src2: TRect);
   Она определяет пересекаются ли Rect'ы, в нашем случае Shape1 и Shape2. Модифицируем код таймера добавив в конец процедуры вот это:

  if InterSectRect(Overlay, Shape2.BoundsRect, Shape1.BoundsRect) then  //если есть пересечение между прямоугольником
  begin                                                                 //и кружком то кружок отправляем обратно 
    VelX:= -VelX;
    VelY:= -VelY;
  end;

   И здесь нам понадобится локальная переменная Overlay: TRect. Вот что должно получится у вас:
procedure TForm1.Timer1Timer(Sender: TObject);
var
	Overlay: TRect;
begin
  PosX:= PosX + VelX;	// Изменяем 
  PosY:= PosY + VelY;	//  позицию

  if PosX > ClientWidth - Shape1.Width then  
    VelX:= -VelX;

  if PosY > ClientHeight - Shape1.Height then 
    VelY:= -VelY;

  if PosX < 0 then		
    VelX:= -VelX;

  if PosY < 0 then		
    VelY:= -VelY;


  Shape1.Left:= Round(PosX);  // Обновляем
  Shape1.Top:=  Round(PosY);  // положение шарика 
  
  if InterSectRect(Overlay, Shape2.BoundsRect, Shape1.BoundsRect) then  
  begin                                                                 
    VelX:= -VelX;	//если есть пересечение между прямоугольником
    VelY:= -VelY;	//и кружком то кружок отправляем обратно 
  end;

end;
   Теперь при столкновении шарик отскакивает! Но он движется по одному и тому же пути, избавимся от этого добавив немного случайности. В FormCreate допишем событие, добавим в конец слово Randomize, тем самым мы говорим Delphi, что будем использовать улучшенный алгоритм генерации случайных чисел и измени проверку пересечения 2 объектов:
  if InterSectRect(Overlay, Shape2.BoundsRect, Shape1.BoundsRect) then  
  begin                                                                 
    VelX:= -VelX - Random(5);
    VelY:= -VelY - Random(5);
  end;
   Теперь будет лучше.

   В следующем уроке мы будем делать искусственный интеллект.

Удачи!
Встретимся в следующем уроке!


Источник: www.thedelphi.ru
Автор: Савельев Александр
Опубликовано: 21 Апреля 2013
Просмотров: 36413

Урок 26 - Создаем игру Ping-pong - часть(1/3) Урок 28 - Создаем игру Ping-pong - часть(3/3)

Зарегистрируйтесь или авторизуйтесь, чтобы добавлять комментарии.



аватар Добавил(а): mikkylovejoe [Новичок] Дата: 2013-06-17
if InterSectRect(Overlay, Shape2.BoundsRect, Shape1.BoundsRect) Что за Overlay? Вы по нее не ранее не писали, и теперь delphi ругается.




аватар Добавил: RinDproramer [Новичок] Дата: 2013-10-30
У меня нечего не ругается. Наверное, ты не объявил эту переменную.




аватар Добавил: Timosha_45 [Новичок] Дата: 2014-05-09
вопрос, при наведении мыши на "ракетку", она за ней не следует а двигается вниз, что делать?




аватар Добавил(а): eltgm [Новичок] Дата: 2014-07-31
что с функцией-то делать?Объявили,а дальше?У меня шарик просто проскакивает ракетку




аватар Добавил(а): darkshark1231 [Новичок] Дата: 2014-10-16
ничего не понял что куда прописывать. Не понятно написано




аватар Добавил: McDias [Новичок] Дата: 2015-02-03
выаыаф




аватар Добавил: McDias [Новичок] Дата: 2015-02-03
Не обязательно писать имя переменной Overlay, можно присвоить и любую другую букву




аватар Добавил(а): Bek1996 [Новичок] Дата: 2016-02-10
Кстати не забудтье написать в раздел var overlay:trect;




аватар Добавил(а): pronin106 [Новичок] Дата: 2017-05-29
Все получилось! Спасибо за урок. У кого не получилось читайте внимательнее! Не делайте тупо копипаст