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

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

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

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

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

textual
Листинг программы
uses
  ABCObjects, GraphABC;
 
var
  ground, player: PictureABC;
  //Здесь будут храниться все елки, что есть на поле
  firtree: array [0..100] of PictureABC;
  
  i, j, h, w, x, y: integer;
  last: point;
 
procedure KeyDown(Key: integer);
begin
  //Запоминаем последнюю позицию игрока
  last := player.Position;
  case Key of
    VK_Left: player.MoveOn(-5, 0);
    VK_Right: player.MoveOn(5, 0);
    VK_Up: player.MoveOn(0, -5);
    VK_Down: player.MoveOn(0, 5);
  end;
  //Проверяем, не столкнулся ли он с какой-нибудь елкой
  for var i := 0 to 100 do
    //Если столкнулся, то возвращаем его на шаг назад
    if firtree[i].Intersect(player) Then 
    begin
      player.Position := last;
      player.MoveTo(player.Position.X, player.Position.Y);
    end;
  //Перерисовываем область вокруг игрока
  var rct := new RectangleABC(player.Left - 5, player.Top - 5, player.Width + 10, player.Height + 5);
  rct.Bordered := False;
  rct.Color := clTransparent;
  rct.RedrawNow;
  rct.Destroy;
  rct := nil;
end;
 
begin
  Randomize;
  w := 100;
  h := 100;
  TextOut(WindowCenter.X - 35, WindowCenter.Y - 15, 'Loading...');
  LockDrawingObjects;
  for i := 0 to w do 
    for j := 0 to h do 
      ground := new PictureABC(i * 30, j * 30, 'ground.png');
  player := new PictureABC(0, 0, 'player.png');
  for i := 0 to 100 do 
  begin
    x := Random((w * ground.Width) div 105) * 105;
    y := Random((h * ground.Height) div 145) * 150;
    firtree[i] := new PictureABC(x, y, 'firtree.png');
  end;
  RedrawObjects;
  OnKeyDown := KeyDown;
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