Энциклопедия C++ Builder

Машина штукатурно.

ГРАФИЧЕСКИЕ КОМПОНЕНТЫ - часть 16


аргумент aDrawCanvas задает канву рисования, а аргументы aLeft и aTop - позицию спрайта на этой канве.

void SpriteClass::SetSprite(TCanvas *aSpriteCanvas,

int aImageLeft, int aImageTop, int aMaskLeft, int aMaskTop, int aWidth, int aHeight) { SpriteCanvas = aSpriteCanvas;

ImageLeft = aImageLeft;

ImageTop = aImageTop;

MaskLeft = aMaskLeft;

MaskTop = aMaskTop;

Width = aWidth;

Height = aHeight;

} void SpriteClass::Draw(TCanvas *aDrawCanvas,

int aLeft, int aTop) { aDrawCanvas->CopyMode = cmSrcAnd;

aDrawCanvas->CopyRect(Rect(aLeft, aTop,

aLeft+Width, aTop+Height), SpriteCanvas, Rect(MaskLeft, MaskTop, MaskLeft+Width, MaskTop+Height)) ;

aDrawCanvas->CopyMode = cmSrcPaint;

aDrawCanvas->CopyRect(Rect(aLeft, aTop,

aLeft+Width, aTop+Height), SpriteCanvas,

Rect(ImageLeft, ImageTop, ImageLeft+Width.ImageTop+Height));

}

Листинг 7.8. Определение методов класса спрайта в файле Sprite.cpp.

Довольно трудно составить впечатление от работы приложения анимации по снимку одного кадра - тем более в черно-белом исполнении (Рис. 7.4). Книга не является подходящим носителем для распространения компьютерных мультфильмов. Если проблема вас заинтересовала, нет другого способа изучать ее дальше, как придумать и подготовить картинки и разработать собственное приложение, используя приведенные листинги в качестве прототипа.

Рис. 7.4. Снимок с экрана работающего приложения MOVEIT.

Сами фигуры представляют собой массив типа структуры, а не экземпляр какого-то класса. Однако не надо быть гениальным программистом, чтобы ввести логику работы с фигурами в соответствующий класс FigureClass, который будет инкапсулировать, в частности, свойство периметра и метод перемещения. Однако не стоит наследовать SpriteClass от класса фигур. Дело в том, что экземпляры этих классов имеют разную природу: спрайты - это графические объекты, а фигуры - логические конструкции. Если бы вам потребовалось произвести анимацию более, чем двух одинаковых фигур, все они по-прежнему будут разделять единственный класс спрайта, используя поле структуры Fig [ I ] . SD для связи I-фигуры с нужным экземпляром спрайта.

Взгляните на изображения фаз анимации самолета или вертолета. На второй фазе каждой фигуры пропеллер просто отсутствует. Постоянно переключая фазы, можно создать иллюзию вращения пропеллера. Зная, что программа не моделирует фактическое вращение, спросите, тем не менее, у наблюдающего за работой приложения: "В какую сторону вращается пропеллер?" - и любой уверенный ответ убедит вас в том, что время на программирование примера было потрачено не зря. Можно придумать какой-нибудь другой впечатляющий эффект, например, стреляющего пулемета. Расширяя банк данных спрайта дополнительными фазами фигур и соответствующими масками, можно добиваться различных эффектов




Начало  Назад  Вперед



Книжный магазин