Урок 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;Теперь будет лучше.
В следующем уроке мы будем делать искусственный интеллект.
Удачи!
Встретимся в следующем уроке!
Добавил(а): 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 | |
Все получилось! Спасибо за урок. У кого не получилось читайте внимательнее! Не делайте тупо копипаст
|
[url=http://pornite.org/audio-for-ladies-from-thumblr/comment-page-82/#comment-140126]Everything what you want to know about drug.[/url] [url=https://homegrown.earth/homegrownfarms/england/north-west/bolton/homegrowndairy/partingtons-dairy-and-deardens-farm-shop/#comment-45886]Best news about meds.[/url] [url=https://lensesonline.kz/product/62/?rating=1]Actual trends of medicine.[/url] 7305aa7