pascal ООП для анимации

В этом уроке мы постараемся привести более "жизненные" примеры использования ООП в простых анимациях и играх

Пример №1 - Перемещение объекта по команде от пользователя -- переход к ООП

Есть код, который, используя обновление консоли как в примере с анимацией, может дать пользователю перемещать символ по экрану влево и вправо:

uses Crt;

procedure drawFrame(skin: char; position: integer);
var i: integer;
begin
  for i:=1 to (position-1) do
    write(' ');
  writeln(skin);
end;

function getNewPosition(position: integer): integer;
var command: char;
begin
  readln(command);
  if (command = '2') then
    result := position + 1
  else
    if (position > 1) then
      result := position - 1;
end;

//  *
var position: integer;
  skin, command: char;
begin
  skin := '*'; // внешний вид
  command := '1'; // последняя введенная команда 
  position := 1; // текущая позиция
  while(command <> 'q') do
  begin
    ClrScr();
    drawFrame(skin, position);
    position := getNewPosition(position);
  end;

  writeln('Программа завершена!');

  readln();
end.

его можно переписать в стиле ООП, например, так:

uses Crt;

type
  Animal = class
    public
      constructor create(skinValue: char);
      procedure drawFrame();
      procedure handleCommand();
      function getCommand(): char;
    protected
      skin: char; // внешний вид
      position: integer; // текущая позиция
      command: char; // последняя введенная команда
      function getNewPosition(commandValue: char): integer;
  end;

constructor Animal.create(skinValue: char);
begin
  self.skin := skinValue;
  self.command := ' ';  // значение по умолчанию
end;

procedure Animal.drawFrame();
var i: integer;
begin
  for i:=1 to (self.position-1) do
    write(' ');
  writeln(self.skin);
end;

procedure Animal.handleCommand();
begin
  readln(self.command);
  self.position := self.getNewPosition(self.command);
end;

function Animal.getNewPosition(commandValue: char): integer;
begin
  if (commandValue = '2') then
    result := position + 1
  else
    if (position > 1) then
      result := position - 1;
end;

function Animal.getCommand(): char;
begin
  result := self.command;
end;

var position: integer;
  skin, command: char;

  AnimalItem: Animal;
begin

  AnimalItem := Animal.create('*');
  while(AnimalItem.getCommand() <> 'q') do
  begin
    ClrScr();
    AnimalItem.drawFrame();
    AnimalItem.handleCommand();
  end;


  writeln('Программа завершена!');
  readln();
end.