Перемещение тела в GraphABC по клику мыши - PascalABC.NET/GraphABC

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

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

Имеется персонаж, который перемещается по клику правой кнопки мыши. При постановки множества целей, куда должен пройти персонаж, он идет последовательно (повторное нажатие правой кнопки мыши не прерывает его ход). Нужно чтобы персонаж при повторном клике шел на новый пункт назначения, а не последовательно на старый и потом уже на новый пункт. Код ниже.
P.S. скорость перемещения персонажа завязано на высоту окна

Решение задачи: «Перемещение тела в GraphABC по клику мыши»

textual
Листинг программы
uses GraphABC, Timers;
 
type
  tAnime = class
    x, y : Real; /// Координаты центра и радиус, а так же размер шага при движении
    r, stepSize : Integer; /// Радиус и размер шага при движении
    nx, ny : Real; /// Координаты, к которым движемся
    dx, dy : Real; /// Приращение, на которое изменяются координаты при каждом шаге
    toGo : Integer; /// Количество оставшихся шагов 
    bw : Integer; /// Толщина границы
    clr, bclr : Color; /// Цвет заполнения и границы
    
    constructor (x_, y_, r_, s_, bw_ : Integer; clr_, bclr_ : Color);
    begin
      x := x_; y := y_; r := r_; stepSize := s_; bw := bw_; clr := clr_; bclr := bclr_;
    end;
    
    procedure Show;
    begin
      Pen.Color := bclr; Pen.Width := bw; Brush.Color := clr;
      Circle(Round(x), Round(y), r);
    end;
    
    procedure MoveTo(x_, y_ : Integer);
    begin
      nx := x_; ny := y_;
      var steps := sqrt((x-nx)*(x-nx)+(y-ny)*(y-ny))/stepSize;
      (dx,dy,toGo) := ((nx-x)/steps,(ny-y)/steps,Trunc(steps));
    end;
    
    procedure Move;
    begin
      if abs(x-nx) + abs(y-ny) = 0 then Exit; // Уже пришли
      toGo -= 1;
      if toGo = 0 then // Последний шаг. Просто становимся в координаты цели.
        (x,y) := (nx,ny)
      else
        (x,y) := (x+dx,y+dy);
    end;
  end;
 
var
  body : tAnime;
  
procedure tickTimer;
begin
  Window.Clear;
  body.Move;
  body.Show;
  Redraw;
end;
 
procedure MouseDown(x, y, m : integer);
begin
  body.MoveTo(x, y);
end;
 
var
  timer := new Timer(5, tickTimer);
 
begin
  window.SetSize(1000,700);
  window.CenterOnScreen;
  LockDrawing;
 
  OnMouseDown := MouseDown;
 
  body := new tAnime(500, 500, 30, 7, 2, clGreen, clDarkGreen);
 
  timer.Enabled := True;
end.

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

  1. Объявлены переменные и конструктор класса tAnime
  2. В конструкторе инициализируются переменные класса tAnime
  3. Определены процедуры класса tAnime: Show, MoveTo, Move
  4. Объявлены переменные и процедура для работы с графикой и мышью
  5. Создается экземпляр класса tAnime
  6. Задаются размеры окна и его центровка на экране
  7. Задаются обработчики событий для мыши
  8. Запускается таймер, который вызывает процедуру tickTimer
  9. В процедуре tickTimer выполняется движение объекта и отображение на графике
  10. При клике мыши вызывается процедура MouseDown, которая задает новые координаты для движения объекта

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


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

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

7   голосов , оценка 4.571 из 5
Похожие ответы