Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции программирование.doc
Скачиваний:
15
Добавлен:
01.03.2025
Размер:
1.01 Mб
Скачать

Текст в графическом окне

В графическое окно можно выводить и текст. Команда TextOut(x,y,s) выводит строку s в позицию (x,y) (точка (x,y) задает верхний левый угол прямоугольника, который будет содержать текст из строки s). Если нужно вывести число, его предварительно превращают в строку с помощью str, inttostr или floattostr.

Перед выводом текста нужно настроить шрифт:

1. SetFontColor(color); - устанавливает цвет шрифта.

2. SetFontSize(sz); - устанавливает размер шрифта в пунктах

3. SetFontName(name); - устанавливает наименование шрифта. По умолчанию установлен шрифт, имеющий наименование MS Sans Serif. Наиболее распространенные шрифты – это Times, Arial и Courier New (наименование шрифта можно набирать без учета регистра).

4. SetFontStyle(fs); - устанавливает стиль шрифта. Стили шрифта задаются следующими именованными константами: fsNormal – обычный; fsBold – жирный; fsItalic – наклонный; fsBoldItalic – жирный наклонный; fsUnderline – подчеркнутый; fsBoldUnderline – жирный подчеркнутый; fsItalicUnderline – наклонный подчеркнутый; fsBoldItalicUnderline – жирный наклонный подчеркнутый.

5. Функции TextWidth(s); и TextHeight(s); возвращают ширину и высоту строки s в пикселях при текущих настройках шрифта. Это может понадобиться, например, чтобы подогнать размеры текста к рисунку (или наоборот).

Использование готовых точечных рисунков

При разработке профессиональных (особенно игровых) программ более реалистичная графика получается, если не программировать рисунки графическими примитивами, а подгружать из файлов готовые, созданные в графических редакторах в формате «.bmp», «.jpg» или «.gif».

  1. Для загрузки изображения из файла используется функция LoadPicture(’имя файла’); Она возвращает адрес в памяти, куда загружается этот рисунок. Для хранения этого адреса используется переменная-описатель целого типа. Например:

dom:= LoadPicture(’domik.bmp’);

  1. Функции PictureWidth(n) и PictureHeight(n) возвращают ширину и высоту рисунка с описателем n.

  2. Функция CreatePicture (w,h)создаёт в памяти пустой рисунок размеров w,h и возвращает его адрес в описатель. Чтобы при создании рисунка сразу скопировать в него часть графического окна, нужно создавать его командой CreatePictureFromRect(RectF(x1,y1,x2,y2)), в которой заданы координаты двух диагонально противоположных углов прямоугольного участка окна. (Для использования Rectf нужно подключить библиотеку PointRect)

  1. Команда DestroyPicture(n); удаляет рисунок с описателем n из оперативной памяти, описатель рисунка при этом становится недействительным.

  2. Изменить размеры рисунка можно командой SetPictureSize(n,w,h).

  3. Прямоугольный участок из одного рисунка в другой можно скопировать командой CopyRect(kuda,RectF(x1,y1,x2,y2), otkuda,RectF(x3,y3,x4,y4)); . Если при этом

  4. Вывести рисунок из переменной в графическое окно можно командой DrawPicture несколькими способами:

а) DrawPicture(n,x,y); - выводит рисунок с описателем n в позицию (x,y) графического окна.

б) DrawPicture(n,x,y,w,h); - выводит рисунок с описателем n в позицию (x,y), масштабируя его размеры к ширине w и высоте h. Если w<0, то рисунок зеркально отражается относительно вертикальной прямой, проходящей через x, если же h<0, то рисунок зеркально отражается относительно горизонтальной прямой, проходящей через y.

в) DrawPicture(n,x,y, RectF(x1,y1,x2,y2)); - выводит часть рисунка с описателем n, заключенную в прямоугольнике (x1,y1,x2,y2), в позицию (x,y) графического окна.

г) DrawPicture(n,x,y,w,h, RectF(x1,y1,x2,y2)); - выводит часть рисунка, масштабируя его размеры.

  1. Команда SetPictureTransparent(n,b); устанавливает (b=True) или отключает (b=False) режим прозрачности при рисовании рисунка с описателем n. Если b=True и рисунок имеет  белый фон, то при его рисовании фон не отображается.

  2. Команда SavePicture(n,fname); сохраняет рисунок с описателем n в файл с именем fname. Рисунки можно сохранять в формате .bmp, .jpg или .gif .

  3. Команды FlipPictureHorizontal(n); и FlipPictureVertical(n); позволяют зеркально отображать рисунок с описателем n горизонтально и вертикально.

  4. Очень полезная функция ImageIntersect(n1,n2) типа boolean определяет, пересекаются ли изображения на рисунках с описателями n1 и n2. Рисунки должны иметь одинаковый размер. Белый цвет на рисунке считается прозрачным. Изображения на рисунках считаются пересекающимися, если имеется хотя бы один пиксел, который не прозрачен и имеет одни и те же координаты для обоих рисунков.

При создании анимации требуется поочерёдно показывать кадры. Каждый кадр представляет собой фоновую картинку, на которую наложены предметы и персонажи – каждый в своих координатах. Перерисовывать кадр прямо в видимом окне нельзя, так как будет виден процесс перерисовки. Поэтому поступают одним из таких способов:

1. Создают переменную (экранный буфер) для хранения кадра размером с окно. Переключают на неё процесс рисования. Во время движения в этой переменной создают очередной кадр, а затем копируют его в окно.

Команда SetDrawingSurface(buf); устанавливает рисунок с описателем buf в качестве поверхности рисования. С этого момента все команды рисования работают не в графическом окне, а в данном рисунке.

Команда RestoreDrawingSurface; восстанавливает в качестве поверхности рисования графическое окно.

Рассмотрим эту технологию на примере:

Создать анимацию: снежный шар катится по заснеженной поверхности земли. Уровень поверхности отслеживать по чёрной линии. За пределами окна (x<0 или x>=600) оставить y как в предыдущих точках.

Сначала создадим рисунки и поместим их в тот же каталог, куда сохраним нашу программу:

Двигаться вправо будем в цикле по x. Значение y в данной точке будем определять так: в цикле просмотрим полоску с данным x сверху донизу. Как только встретим белую точку, остановим поиск – это и есть поверхность.

program shar_katitsa;

uses graphABC;

var

x,y,yy:integer;

kadr,fon,shar:integer;

begin

SetWindowSize(600,400); CenterWindow;

fon:= LoadPicture('фон.bmp');

shar:= LoadPicture('шар.bmp');

SetPictureTransparent(shar,true);

kadr:= LoadPicture('фон.bmp');

SetDrawingSurface(kadr);

y:=150; //начальное положение поверхности

for x:=-80 to 680 do

begin

SetDrawingSurface(kadr); DrawPicture(fon,0,0);

for yy:=0 to 399 do

if (x>=0)and (x<600) and (getpixel(x,yy)=clblack) then

begin

y:=yy; break;

end;

DrawPicture(shar,x-75,y-148);

RestoreDrawingSurface; DrawPicture(kadr,0,0);

end;

end.

2. Второй способ создания анимации заключается в следующем: на время подготовки кадра отключают режим прорисовки окна командой LockDrawing; . Пока действует эта команда, всё рисование происходит в невидимой копии окна. Когда кадр подготовлен, его можно проявить в окне командой Redraw;. Чтобы отменить данный режим и всё рисование вновь происходило прямо в графическом окне, используется команда UnLockDrawing;. Та же программа (катящийся шар) с применением второй технологии получается короче и работает немного быстрее:

program shar_katitsa;

uses graphABC;

var

x,y,yy:integer;

fon,shar:integer;

begin

SetWindowSize(600,400); CenterWindow;

fon:= LoadPicture('фон.bmp');

shar:= LoadPicture('шар.bmp');

SetPictureTransparent(shar,true);

LockDrawing;

y:=150; //начальное положение поверхности

for x:=-80 to 680 do

begin

DrawPicture(fon,0,0);

for yy:=0 to 399 do

if (x>=0)and (x<600) and (getpixel(x,yy)=clblack) then

begin

y:=yy; break;

end;

DrawPicture(shar,x-75,y-148);

Redraw;

end;

end.