Почему не работает столкновение? - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Почему не работает столкновение?

Решение задачи: «Почему не работает столкновение?»

textual
Листинг программы
  1. uses
  2.   ABCObjects, GraphABC;
  3.  
  4. var
  5.   ground, player: PictureABC;
  6.   //Здесь будут храниться все елки, что есть на поле
  7.   firtree: array [0..100] of PictureABC;
  8.  
  9.   i, j, h, w, x, y: integer;
  10.   last: point;
  11.  
  12. procedure KeyDown(Key: integer);
  13. begin
  14.   //Запоминаем последнюю позицию игрока
  15.   last := player.Position;
  16.   case Key of
  17.     VK_Left: player.MoveOn(-5, 0);
  18.     VK_Right: player.MoveOn(5, 0);
  19.     VK_Up: player.MoveOn(0, -5);
  20.     VK_Down: player.MoveOn(0, 5);
  21.   end;
  22.   //Проверяем, не столкнулся ли он с какой-нибудь елкой
  23.   for var i := 0 to 100 do
  24.     //Если столкнулся, то возвращаем его на шаг назад
  25.     if firtree[i].Intersect(player) Then
  26.     begin
  27.       player.Position := last;
  28.       player.MoveTo(player.Position.X, player.Position.Y);
  29.     end;
  30.   //Перерисовываем область вокруг игрока
  31.   var rct := new RectangleABC(player.Left - 5, player.Top - 5, player.Width + 10, player.Height + 5);
  32.   rct.Bordered := False;
  33.   rct.Color := clTransparent;
  34.   rct.RedrawNow;
  35.   rct.Destroy;
  36.   rct := nil;
  37. end;
  38.  
  39. begin
  40.   Randomize;
  41.   w := 100;
  42.   h := 100;
  43.   TextOut(WindowCenter.X - 35, WindowCenter.Y - 15, 'Loading...');
  44.   LockDrawingObjects;
  45.   for i := 0 to w do
  46.     for j := 0 to h do
  47.       ground := new PictureABC(i * 30, j * 30, 'ground.png');
  48.   player := new PictureABC(0, 0, 'player.png');
  49.   for i := 0 to 100 do
  50.   begin
  51.     x := Random((w * ground.Width) div 105) * 105;
  52.     y := Random((h * ground.Height) div 145) * 150;
  53.     firtree[i] := new PictureABC(x, y, 'firtree.png');
  54.   end;
  55.   RedrawObjects;
  56.   OnKeyDown := KeyDown;
  57. end.

Объяснение кода листинга программы

  1. В коде используется язык программирования PascalABC.Net.
  2. Переменные ground и player объявлены как PictureABC, что предполагает, что они представляют собой объекты PictureABC.
  3. Объявлен массив firtree типа PictureABC размером 100, который, как предполагается, будет содержать все деревья на поле.
  4. Объявлены переменные i, j, h, w, x, y типа integer, которые используются для управления положением и размером объектов на экране.
  5. Объявлена переменная last типа point, которая используется для хранения последней позиции игрока.
  6. Определена процедура KeyDown, которая вызывается при нажатии клавиши. Она проверяет, была ли нажата клавиша со стрелкой, и если да, то перемещает игрока в соответствующем направлении. Затем проверяется, столкнулся ли игрок с каким-либо деревом, и если да, то его позиция откатывается назад.
  7. Для проверки столкновения используется метод Intersect класса PictureABC.
  8. После проверки столкновения перерисовывается область вокруг игрока с помощью объекта RectangleABC.
  9. В основной части кода создаются объекты ground и player, а затем создаются 100 объектов firtree, представляющих деревья, с случайными координатами на экране.
  10. Задается функция OnKeyDown, которая будет вызываться при нажатии клавиши.
  11. Код завершается вызовом функции RedrawObjects, которая перерисовывает все объекты на экране.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.333 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут