Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПОУК / 09 семестр / Книги и методические указания / Руководство программиста в Photon.doc
Источник:
Скачиваний:
364
Добавлен:
04.03.2014
Размер:
7.99 Mб
Скачать

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

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

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

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

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

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

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

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

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

Как описано в разделе "Базы данных виджетов" главы "Доступ к модулям 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() возвращает указатель в базе данных виджетов. Не закрывайте базу данных до тех пор, пока Вы используете образы из неё.

Использование файла

Вы также можете загрузить кадры из файла – из структуры PhImage_t – функцией PxLoadImage(). Эта функция поддерживает множество форматов, включая gif, pcx, jpg, bmp, и png. Полный список см. в /usr/photon/dll/pi_io_*.

Циклическая прокрутка кадров

Вне зависимости от того, как Вы получили кадры, мультипликация выполняется одинаково:

  1. Создайте в Вашем приложении виджет PtTimer. PhAB отображает его как чёрный прямоугольник, он не появится, когда Вы запустите своё приложение.

  2. Задайте для таймера начальный (Pt_ARG_TIMER_INITIAL) интервал и интервалы повтора (Pt_ARG_TIMER_REPEAT).

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

Например, ответная реакция таймера может быть такой:

/* Отображение следующего образа для нашего примера мультипликации. */

/* Стандартные хеадеры */

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

/* Инструментальные хеадеры */

#include <Ph.h>

#include <Pt.h>

#include <Ap.h>

/* Локальные хеадеры */

#include "globals.h"

#include "abimport.h"

#include "proto.h"

int display_image( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) {

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

widget = widget, apinfo = apinfo, cbinfo = cbinfo;

cur_image++;

if (cur_image >= num_images) cur_image=0;

PtSetResource (ABW_base_image, Pt_ARG_LABEL_IMAGE, images[cur_image], 0 );

PtFlush ();

return( Pt_CONTINUE );

}

ABW_base_image – это имя виджета PtLabel, в котором появляется мультипликация.