Использование готовых точечных рисунков
При разработке профессиональных (особенно игровых) программ более реалистичная графика получается, если не программировать рисунки графическими примитивами, а подгружать из файлов готовые, созданные в графических редакторах в формате «.bmp», «.jpg» или «.gif».
1. Для загрузки изображения из файла используется функция LoadPicture(’имя файла’); Она возвращает адрес в памяти, куда загружается этот рисунок. Для хранения этого адреса используется переменная-описатель целого типа. Например:
dom:= LoadPicture(’domik.bmp’);
2. Функции PictureWidth(n) и PictureHeight(n) возвращают ширину и высоту рисунка с описателем n.
3. Функция CreatePicture (w,h)создаёт в памяти пустой рисунок размеров w,h и возвращает его адрес в описатель. Чтобы при создании рисунка сразу скопировать в него часть графического окна, нужно создавать его командой CreatePictureFromRect(RectF(x1,y1,x2,y2)), в которой заданы координаты двух диагонально противоположных углов прямоугольного участка окна. (Для использования Rectf нужно подключить библиотеку PointRect)
4. Команда DestroyPicture(n); удаляет рисунок с описателем n из оперативной памяти, описатель рисунка при этом становится недействительным.
5. Изменить размеры рисунка можно командой SetPictureSize(n,w,h).
6. Прямоугольный участок из одного рисунка в другой можно скопировать командой
CopyRect(kuda,RectF(x1,y1,x2,y2), otkuda,RectF(x3,y3,x4,y4)); . Если при этом конечные размеры не совпадают с исходными, то происходит масштабирование рисунка.
7. Вывести рисунок из переменной в графическое окно можно командой 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)); - выводит часть рисунка, масштабируя его размеры.
8. Команда SetPictureTransparent(n,b); устанавливает (b=True) или отключает (b=False) режим прозрачности при рисовании рисунка с описателем n. Если b=True и рисунок имеет белый фон, то при его рисовании фон не отображается.
9. КомандаSavePicture(n,fname); сохраняет рисунок с описателем n в файл с именем fname. Рисунки можно сохранять в формате .bmp, .jpg или .gif .
10. Команды FlipPictureHorizontal(n); и FlipPictureVertical(n); позволяют зеркально отображать рисунок с описателем n горизонтально и вертикально.
11. Очень полезная функция ImageIntersect(n1,n2) типа boolean определяет, пересекаются ли изображения на рисунках с описателями n1 и n2. Рисунки должны иметь одинаковый размер. Белый цвет на рисунке считается прозрачным. Изображения на рисунках считаются пересекающимися, если имеется хотя бы один пиксел, который не прозрачен и имеет одни и те же координаты для обоих рисунков.
При создании анимации требуется поочерёдно показывать кадры. Каждый кадр представляет собой фоновую картинку, на которую наложены предметы и персонажи – каждый в своих координатах. Перерисовывать кадр прямо в видимом окне нельзя, так как будет виден процесс перерисовки. Поэтому поступают одним из таких способов:
1. Создают переменную (экранный буфер) для хранения кадра размером с окно. Переключают на неё процесс рисования. Во время движения в этой переменной создают очередной кадр, а затем копируют его в окно.
Команда SetDrawingSurface(buf); устанавливает рисунок с описателем buf в качестве поверхности рисования. С этого момента все команды рисования работают не в графическом окне, а в данном рисунке.
Команда RestoreDrawingSurface; восстанавливает в качестве поверхности рисования графическое окно.
Рассмотрим эту технологию на примере:
Создать анимацию: снежный шар катится по заснеженной поверхности земли. Уровень поверхности отслеживать по чёрной линии. За пределами окна (x<0 или x>=600) оставить y как в предыдущих точках.
Сначала создадим рисунки и поместим их в тот же каталог, куда сохраним нашу программу:
Двигаться вправо будем в цикле по x. Значение y в данной точке будем определять так: в цикле просмотрим полоску с данным x сверху донизу. Как только встретим белую точку, остановим поиск – это и есть поверхность.
2. Второй способ создания анимации заключается в следующем: на время подготовки кадра отключают режим прорисовки окна командой LockDrawing; . Пока действует эта команда, всё рисование происходит в невидимой копии окна. Когда кадр подготовлен, его можно проявить в окне командой Redraw;. Чтобы отменить данный режим и всё рисование вновь происходило прямо в графическом окне, используется команда UnLockDrawing;. Та же программа (катящийся шар) с применением второй технологии получается короче и работает немного быстрее:
Дата добавления: 2014-12-18; просмотров: 711;