Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Текст с эффектами

Delphi , Графика и Игры , DirectX и DelphiX

Текст с эффектами

Оформил: 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.

Статья Текст с эффектами раздела Графика и Игры DirectX и DelphiX может быть полезна для разработчиков на Delphi и FreePascal.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: DirectX и DelphiX ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100
29.03.2024 11:43:12/0.034404039382935/0