Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
«РОСТОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к курсу программирования
для студентов физического факультета
Сравнительное объектно-ориентированное проектирование
Delphi vs C++ vs C#
Часть 2
Ростов-на-Дону
2006
Методические указания разработаны кандидатом физико-математических наук, доцентом кафедры теоретической и вычислительной физики Г.В. Фоминым.
Ответственный редактор доктор физ.-мат. наук, профессор В.П. Саченко
Компьютерный набор и верстка Г.В. Фомин
Печатается в соответствии с решением кафедры теоретической и вычислительной физики физического факультета РГУ, протокол №1 от 17 января 2006 г.
Сравнительное объектно-ориентированное проектирование
Delphi vs C++ vs C#
Часть 2
Содержание настоящего пособия является продолжением его 1-ой части «Сравнительное объектно-ориентированное проектирование Delphi vs C++ vs C#».
Как и в первой части, здесь публикуются прокомментированные коды нескольких классов, написанных на трех языках. Слушателю предлагается создать приложения, тестирующие эти классы, предварительно разобравшись в структуре самих классов и их возможностях.
Спрайты
Это классы, реализующие алгоритм воспроизведения коллекции графических объектов, упорядоченных в третьем измерении (так называемое z-упорядочение). Каждый спрайт занимает свой «слой» в измерении, перпендикулярном экрану (z-направление), как отдельное окно. Однако в отличие от окна спрайт принадлежит коллекции, связанной лишь с одним окном.
Delphi
В Delphi код приложения разбивается на отдельные модули. Каждый модуль состоит из интерфейсной секции, секции реализации и, возможно, секции инициализации. В интерфейсной секции размещаются описания типов, переменных, заголовков процедур и функций, доступных тем частям приложения, которые ссылаются на данный модуль. В секции реализации размещается код, реализующий объявленные в интерфейсе методы классов, процедуры и функции, а также локальные типы, переменные, процедуры и функции, доступные только коду самого модуля.
unit uSprite;
{В модуле описаны классы TSpriteList, TSprite и их наследники,
предназначенные для Z-упорядочения графических изображений
на любой канве (например канве объекта типа TPaintBox).
Конструктор класса TSpriteList имеет один параметр -
канву, на которой производится отрисовка.
Конструктор класса TSprite имеет два параметра, определяющие
прямоугольник спрайта и список, которому спрайт принадлежит.}
interface
//Модули VCL, в которых описаны используемые в интерфейсе типы
uses Controls,Graphics,Classes,Types;
type
// Предварительное объявление класса TSprite
TSprite=class;
// Тип переменных, содержащих ссылки на классы типа TSprite
TSpriteClass=class of TSprite;
// Список спрайтов
TSpriteList=class
private
// Поля
// Хранит канву ("контекст устройства"), используемую для отображения спрайтов списка
FCanvas:Controls.TControlCanvas;
// Хранит режим отображения графического объекта при его копировании на канву
FCanvasCopyMode:Graphics.TCopyMode;
// Хранит прямоугольник, ограничивающий область отображения спрайтов списка
FClientRect:Types.TRect;
// Хранит список указателей на спрайты
FList:Classes.TList;
// Хранит текущее число спрайтов в списке
FCount:integer;
// Метод
// Возвращает спрайт списка под номером aZ
function GetSprite(aZ:integer):TSprite;
public
// Свойства
// Возвращает спрайт из списка как элемент массива
property Sprites[aZ:integer]:TSprite read GetSprite;default;
// Возвращает текущее число спрайтов в списке
property Count:integer read FCount;
// Возвращает ссылку на список указателей спрайтов
property List:Classes.TList read FList;
// Возвращает ссылку на канву, с которой связаны спрайты списка
property Canvas:Controls.TControlCanvas read FCanvas;
// Возвращает прямоугольник, ограничивающий область изображения спрайтов списка
property ClientRect:Types.TRect read FClientRect;
// Конструктор
// Создает и инициализирует экземпляр списка спрайтов, связанного с данной канвой
constructor Create(const aCanvas:Controls.TControlCanvas);
// Методы
// Реализует действия перед освобождением объекта
procedure BeforeDestruction;override;
// Создает и добавляет в список объект класса aSpriteClass,
// занимающего прямоугольник SpriteRect
function AddSprite(const aSpriteClass:TSpriteClass;
const SpriteRect:Types.TRect):TSprite;
// Перемещает спрайт внутри списка в z-направлении (с одного слоя в другой)
procedure MoveSprite(const fromZ,toZ:integer);
// Удаляет спрайт с индексом aZ (слой) из списка
procedure DeleteSprite(const aZ:integer);virtual;
// Очищает список от указателей на спрайты
procedure Clear;virtual;
end;
// Тип обработчика события, наступающего перед смещением спрайта
OnMoveEvent=function(Sender:TSprite;var NewLocation:Types.TPoint):
Boolean of object;
// Абстрактный класс спрайта регулирует изображение и перемещение спрайта.
// Изображению спрайта на канве предшествует сохранение в памяти фона,
// который перекрывается изображением.
// Требуемый участок фона сохраняется в объекте типа TBitmap.
// Изображение спрайта исчезает в момент восстановления фона –
// обратного копирования на канву сохраненного участка.
TSprite=class(TObject)
private
// Поля
// Хранит состояние видимости спрайта
FVisible: boolean;
// Хранит номер слоя, занимаемого спрайтом
FZ: integer;
// Хранит маску - наличие пересечений с одним из выше лежащих спрайтов
FMask: boolean;
// Хранит ссылку на список, которому принадлежит спрайт
FSpriteList: TSpriteList;
// Хранит Bitmap, содержащий фон спрайта
FImage: Graphics.TBitmap;
// Хранит координаты левого верхнего угла спрайта
FLocation: Types.TPoint;
// Хранит размеры спрайта
FSize: Types.TSize;
// Хранит ссылку на обработчик смещения спрайта
FOnMove: OnMoveEvent;
// Методы
// Готовит спрайт к изображению
procedure BeginPaint;
// Завершает процесс изображения спрайта
procedure EndPaint;
// Устанавливает маску для спрайта из слоя aZ
procedure SetMask(const aZ:integer);
// Определяет факт перекрытия спрайтов из слоев First и Second
function Intersect(const First,Second:integer):boolean;
// Устанавливает состояние видимости спрайта
procedure SetVisible(const aVisible: Boolean);
// Возвращает прямоугольник спрайта
function GetSpriteRect:Types.TRect;
// Конструктор
// Создает и инициализирует спрайт, принадлежащий списку Sprites
// с прямоугольником SpriteRect
constructor Create(const SpriteRect: Types.TRect;const Sprites: TSpriteList);
protected
// Методы
// Восстанавливает изображение фона спрайта
procedure Restore;virtual;
// Изображает спрайт
procedure Paint;virtual;
// Формирует реальное изображение спрайта (в этом классе метод абстрактный)
procedure PaintPicture;virtual;abstract;
public
// Свойства
// Возвращает слой спрайта
property Z:integer read FZ;
// Устанавливает и возвращает обработчик при перемещении спрайта
property OnMove:OnMoveEvent read FOnMove write FOnMove;
// Устанавливает и возвращает состояние видимости спрайта
property Visible:Boolean read FVisible write SetVisible;
// Возвращает положение левого верхнего угла спрайта
property Location:Types.TPoint read FLocation;
// Возвращает размеры спрайта
property SpriteSize:Types.TSize read FSize;
// Возвращает прямоугольник спрайта
property SpriteRect:Types.TRect read GetSpriteRect;
// Возвращает ссылку на список, которому спрайт принадлежит
property SpriteList:TSpriteList read FSpriteList;
// Методы
// Выполняет инициализирующие действия сразу после создания спрайта
procedure AfterConstruction;override;
// Выполняет действия непосредственно перед освобождением спрайта
procedure BeforeDestruction;override;
// Перемещает спрайт на вектор drift
function Move(const drift: Types.TSize): boolean;virtual;
// Перемещает спрайт в новое положение NewLocation
function MoveTo(const NewLocation: Types.TPoint): boolean;virtual;
end;
// Тип массива, хранящего карту следов (пикселей) спрайтов на канве
TTraceMap=Array of array of Boolean;
// Список спрайтов, оставляющих след на канве
TTracedSpriteList=class(TSpriteList)
private
// Поле
// Хранит карту следов на канве
FTraceMap:TTraceMap;
public
//Возвращает карту следов на канве
property TraceMap:TTraceMap read FTraceMap;
// Методы
// Выполняет инициализирующие действия сразу после создания списка
procedure AfterConstruction;override;
// Выполняет действия непосредственно перед освобождением списка
procedure BeforeDestruction;override;
// Удаляет спрайт с индексом aZ (слой) из списка
procedure DeleteSprite(const aZ:integer);override;
// Очищает список от указателей на спрайты
procedure Clear;override;
end;
// Тип массива точек следа спрайта
TTracePoints=array of Types.TPoint;
// Класс, спрайты которого оставляют след перемещения
// по канве списка типа TTracedSpriteList
TTracedSprite=class(TSprite)
private
// Поля
// Хранит указание, оставляет ли спрайт след
FTraced:Boolean;
// Хранит точки со следом
FTracePoints:TTracePoints;
// Хранит указание, имеет ли след определенный цвет
FTraceColored:Boolean;
// Хранит цвет следа
FTraceColor:Graphics.TColor;
// Хранит центр спрайта
FCenter:Types.TPoint;
// Метод
// Устанавливает цвет спрайта
procedure SetTraceColor(const aTraceColor:Graphics.TColor);
public
// Свойства
// Возвращает и устанавливает указание на наличия следа
property Traced:Boolean read FTraced write FTraced;
// Возвращает и устанавливает указатель на точки следа
property TracePoints:TTracePoints read FTracePoints;
// Возвращает и устанавливает указание, имеет ли след определенный цвет
property TraceColored:Boolean read FTraceColored write FTraceColored;
// Возвращает и устанавливает цвет следа
property TraceColor:Graphics.TColor read FTraceColor write SetTraceColor;
// Возвращает центр спрайта
property Center:Types.TPoint read FCenter;
// Методы
// Выполняет инициализирующие действия сразу после создания спрайта
procedure AfterConstruction;override;
// Выполняет действия непосредственно перед освобождением спрайта
procedure BeforeDestruction;override;
// Перемещает спрайт на вектор drift
function Move(const drift:Types.TSize):boolean;override;
// Воспроизводит след
procedure PutTrace;
end;
const DefaultColor=$ffffff;//Цвет эллипса по умолчанию
type
// Класс, изображающий спрайт в форме сплошного эллипса