Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
02.04.2015
Размер:
8.79 Mб
Скачать
      1. Освобождение образов

Структура PhImage_t включает член flags, который упрощает освобождение памяти, используемой образом. Эти флаги указывают, какие члены Вы хотите освободить:

  • Ph_RELEASE_IMAGE

  • Ph_RELEASE_PALETTE

  • Ph_RELEASE_TRANSPARENCY_MASK

  • Ph_RELEASE_GHOST_BITMAP

Вызов функции PhReleaseImage() с каким-то образом в качестве аргумента освобождает какие-либо ресурсы, соответствующие биту, установленному во флагах образа.

  • Функция PhReleaseImage() не освобождает саму структуру PhImage_t, а только размещённые в памяти члены её.

  • Функция PhReleaseImage() корректно освобождает память, выделенную функцией PgShmemCreate()

Член flags для образов, созданных функциями ApGetImageres() и PxLoadImage(), не установлен. Если Вы хотите вызвать функцию PhReleaseImage(), чтобы освободить размещённые в памяти члены, Вы должны установить флаг самостоятельно:

my_image->flags = Ph_RELEASE_IMAGE |

Ph_RELEASE_PALETTE |

Ph_RELEASE_TRANSPARENCY_MASK |

Ph_RELEASE_GHOST_BITMAP;

Если образ хранится в виджете, размещённые в памяти члены автоматически освобождаются, когда задаётся новый образ или виджет удаляется, обеспечивая, что соответствующие биты в члене flags структуры PhImage_t устанавливаются перед тем, как образ добавляется к виджету.

    1. Мультипликация

В этом разделе описано, как Вы можете создавать простую мультипликацию. Здесь есть два основных шага:

  • создание серии "кадров" объекта в движении

  • циклический проход по кадрам

 Для мультипликации лучше использовать образы, а не побитовые образы, поскольку образы не являются прозрачными (при условии, что Вы не создали маску прозрачности). Это означает, что нет необходимости перерисовывать задний фон при замене одного образа на другой. В результате, когда Вы используете образы, отсутствует мерцание. Относительно других методов борьбы с мерцанием см. раздел "Мультипликация без мерцания" ниже.

Также возможно создание мультипликации использованием виджета PtRaw и Photon'овских примитивов рисования. См. раздел "Виджет PtRaw" выше в этой главе.

      1. Создание серии кадров

Чтобы анимировать образ, Вам потребуется серия кадров его в движении. Например, Вы можете использовать виджет PtLabel (с ресурсом Pt_ARG_LABEL_TYPE, установленным в значение Pt_IMAGE или Pt_TEXT_IMAGE) для мультипликации. Создайте один виджет PtLabel там, где Вы хотите, чтобы мультипликация появилась, и создайте другой виджет PtLabel для каждого кадра. Вы можете разместить эти кадры в базе данных виджетов или в файле.

          1. Использование базы данных виджетов

Как описано в разделе "Базы данных виджетов" главы "Доступ к модулям PhAB из программного кода", Вы можете использовать модуль картинки в качестве базы данных виджетов. Чтобы использовать его для мультипликации, выполните в PhAB следующее:

  1. Создайте модуль картинки для его использования в качестве базы данных

  2. Создайте внутреннюю связь к модулю картинки

  3. Создайте кадры объекта в движении. Используйте тот же тип виджета, который Вы применяете, когда появляется анимация. Присвойте каждому кадру уникальное имя экземпляра.

В Вашей функции инициализации откройте базу данных, вызвав функцию ApOpenDBase(). Затем загрузите образы функций ApGetImageRes(). Например:

/* global данные */

PhImage_t *images[4];

ApDBase_t *database;

int cur_image = -1,

num_images = 4;

int app_init( int argc, char *argv[]) {

int i;

char image_name[15];

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

argc = argc, argv = argv;

database = ApOpenDBase (ABM_image_db);

for (i = 0; i < num_images; i++) {

sprintf (image_name, "image%d", i);

images[i] = ApGetImageRes (database, image_name);

}

return (PT_CONTINUE);

}

 Функция ApGetImageRes() возвращает указатель в базе данных виджетов. Не закрывайте базу данных до тех пор, пока Вы используете образы из неё.

Соседние файлы в папке Литература_1