Смекни!
smekni.com

Методические указания к курсу программирования для студентов физического факультета Сравнительное объектно-ориентированное проектирование (стр. 1 из 8)

Министерство образования и науки Российской Федерации

Федеральное агентство по образованию

Государственное образовательное учреждение

высшего профессионального образования

«РОСТОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

к курсу программирования

для студентов физического факультета

Сравнительное объектно-ориентированное проектирование

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

// Класс, изображающий спрайт в форме сплошного эллипса