Текст с эффектами
Оформил: XVeL
Автор: Релорт
WEB-сайт: http://daddy.mirgames.ru
Содержание 1.
Введение. 2.
Благодарность и информация. 3.
Часть 1. Базовый класс. 4.
Часть 2. Эффект и отрисовка. 5.
Заключение.
Введение. Вам когда-нибудь хотелось
организовать вывод текста, да не простого, а с наворотами. Так
вот эта статья как раз про это. Читайте!
Благодарность... Сайту Daddy.h1.ru
(MirGames.ru) за то, что там можно найти информацию по DelphiX
и скачать файлы со шрифтами :) Большое спасибо!
… и
информация. Прошу прошения у тех, кто писал на
Relort@xaker.ru в последнее время, за то, что не ответил. В
течение последнего месяца я не мог «достучатся» до своего
ящика. И вот буквально вчера узнал, что тот на время накрылся
:( Так что повторите свои отклики, просьбы, пожелания на новый
электронный адрес.
Также убедительная просьба присылать
интересующие вас темы, и если я что-либо смогу по ним сказать,
то обязательно это сделаю, оформив ответы в статьи.
ОК?
Часть 1. Базовый
класс. Лирическое отступление: давайте договоримся, что
все новые классы и тому подобное мы будем размешать в
отдельных файлах. ОК? По крайне мере я собираюсь делать именно
так... Итак, создаем новый проект, кидаем на форму TDXDraw,
TDXTimer. Теперь создаем новый Unit и обзываем его, например,
TextWithEffect_Unit.pas. Приготовления закончены.
Приступаем. Рассуждаем: текст состоит из слов, слова из
букв. Вот почему первым созданием в Unit’е будет:
TLetterEffect = record
Visible: Boolean; //видима ли буква
CurTime, Delay: Integer; //...
Scale: Integer; //это и будет нашим эффектом (уменьшение)
end;
TLetterEffectArray = array of TLetterEffect;
PLetterEffectArray = ^TLetterEffectArray;
То есть описание буквы текста и определение массива букв. Сразу за ним пишем:
TTextWithEffect = class
private
FontSurface: TDirectDrawSurface;
TextSurface: TDirectDrawSurface;
FText: String;
FFontSize: Integer;
FState: Integer;
FFileName: String;
LetterEffect: TLetterEffectArray;
procedure SetText(const Value: String);
procedure Error(ErrorType: Integer);
procedure SetFontSize(const Value: Integer);
procedure SetFileName(const Value: String);
public
property Text: String read FText write SetText;
property FontSize: Integer read FFontSize write SetFontSize;
property FileName: String read FFileName write SetFileName;
procedure Draw(Surface: PDirectDrawSurface);
constructor Create(DD: PDirectDraw);
destructor Destroy;
end;
Надеюсь
здесь все понятно? Нет!? Ну тогда ладно: FontSurface –
поверхность (TDirectDrawSurface), содержащая
алфавит. TextSurface - поверхность (TDirectDrawSurface),
содержащая текст к выводу. LetterEffect – буквы
текста. Text – текст к отрисовке. FontSize – размер
каждой буквы текста. Здесь надо оговорится: каждая буква
текста берется из файла с именем FileName (третье свойство
TTextWithEffect), т. е. FileName – имя файла с алфавитом (см.
архив, прилагаемый к статье, файл Font.bmp); и для заполнение
TextSurface’а необходим размер каждой буквы. Ну и так
далее...
А сейчас самое интересное: создание эффекта и
просмотр результата.
Часть 2. Эффект и
отрисовка.
Для данного примера я опишу лишь один
эффект – уменьшение букв с течением времени. Этот эффект
довольно просто реализовать с учетом вышеописанного класса
TLetterEffect. В том классе за текущее состояние эффекта буквы
отвечала переменная Scale. Все что нам нужно – уменьшать ее во
времени (но до определенного момента). А вот и сама
процедура, принимающая в качестве аргумента указатель на
массив букв. Вот...
//Эффект
procedure ScaleDown(L: PLetterEffectArray);
var
i: Integer;
begin
for i:=0 to High(L^) do
begin
if L^[i].Scale < 0 then
begin
inc(L^[i].CurTime);
if L^[i].CurTime <= L^[i].Delay then
dec(L^[i].Scale, 1);
exit;
end;
end;
end;
// ну и отрисовка
procedure TTextWithEffect.Draw(Surface: PDirectDrawSurface);
var
i: Integer;
rc: TRect;
rc1: Trect;
s: Integer;
begin
if FontSurface = nil then exit;
if FText = '' then exit;
// рисуем текст без эффекта
Surface^.Draw(32, 32, TextSurface.ClientRect, TextSurface, True);
// вносим изменения в эффект
ScaleDown(@LetterEffect);
// и выводим текст с эффектом побуквенно
for i:=0 to High(LetterWithEffect) do
begin
s := LetterEffect[i].Scale;
if s = 32 then exit;
rc1 := Rect(i*16,0,(i+1)*16,16);
if s < 0 then
begin
rc := Rect(i*16+32-s, 64-s, ((i+1)*16)+32+s, 80+s);
Surface^.StretchDraw(rc, rc1, TextSurface, True);
end
else Surface^.Draw(i*16+32, 64, rc1, TextSurface, True)
end;
end;
Заключение. Посмотрите файл
TWE_Ex.exe. Вот чего можно добиться расширив данный пример
:) !!!
Ну вот вроде бы как и все. Мы добрались до
завершения статьи. Если что непонятно, необходимо пояснение
или пример пишите. Отвечу всем. Пример
к статье Автор: Релорт Relort@yandex.ru Февраль
2003.
|