Спрайты

Спрайт - это частично прозрачное изображение или набор изображений, который может накладываться и перемещаться по заднему плану или по другому спрайту без необходимости перерисовывать все основное окно. Другими словами спрайт - это перемещаемый игровой объект. Спрайты используются практически во всех 2D играх.

Вы можете создать собственный класс спрайтов, например, используя изображения, организовать их анимирование через таймер и автоматизировать перерисовку экрана. Однако в Symbian OS есть уже готовый класс для работы со спрайтами: RWsSprite. Он обеспечивает автоматическую перерисовку спрайтов и анимацию, посредствам смены изображений через заданные интервалы времени.

Создать новый спрайт очень просто. Для этого нужно:

  • Создать новый RwsSprite.
  • Создать необходимое число TSpriteMembers и добавить их к спрайту.
  • Активировать спрайт.

Каждый спрайт имеет один или более членов (members) TSpriteMember, которые определяют параметры каждого изображения, присоединенного к спрайту. Каждый член состоит из:

  • Изображения члена спрайта (iBitmap).
  • Маски для изображения (iMaskBitmap). Если маска не нужна, используется значение NULL.
  • Параметра, определяющего тип маски (прямая или инвертированная) (iInvertMask). Установите EFalse, если в прозрачные области обозначены черным цветом.
  • Смещения, определяющего центр спрайта (iOffset).
  • Интервала, определяющего длительность отображения спрайта перед переходом к следующему члену (iInterval).
  • Режима рисования (iDrawMode; используется только если не используется маска).

Приведенный ниже код показывает, как создать спрайт на основании загруженных из MBM файла изображений, и как активировать его.

// .h
RWsSprite iMySprite;
TSpriteMember iMySpriteMembers[7];
// .cpp
void CMyGameAppView::ConstructL(const TRect& aRect)
{
CreateWindowL();
SetRect(aRect);
// Файл mbm содержит:
// SpriteImage1.bmp
// * и маску.
// SpriteImage1Mask.bmp
// . . .
_LIT(KMySpriteMBM,"MySprite.mbm");
TFileName mbmFileName(KMySpriteMBM);
CompleteWithAppPath(mbmFileName);
// Создаем спрайт
iMySprite= RWsSprite( CEikonEnv::Static()->WsSession());
User::LeaveIfError( iMySprite.Construct( Window(), TPoint(0,0),0));
// Загружаем изображение (рисунок+маска) и задаем параметры для каждого члена.
// Всего 7 членов.
for( TInt i=0; i<7; i++)
{
// Загружаем изображение
iMySpriteMembers[i].iBitmap=new( ELeave) CFbsBitmap();
User::LeaveIfError( iMySpriteMembers[i].iBitmap->Load(mbmFileName, i*2, EFalse));
// Загружаем маску
iMySpriteMembers[i].iMaskBitmap=new( ELeave) CFbsBitmap();
User::LeaveIfError( iMySpriteMembers[i].iMaskBitmap->Load(mbmFileName, i*2+1, EFalse));
// Задаем параметры члена
iMySpriteMembers[i].iInvertMask= EFalse;
iMySpriteMembers[i].iOffset= TPoint(0,0);
// Будем менять изображение каждые 1/10 секунды
iMySpriteMembers[i].iInterval=TimeIntervalMicroSeconds32(100000);
// Присоединяем член к спрайту
User::LeaveIfError( iMySprite.AppendMember(iMySpriteMembers[i]));
}
// Все члены добавлены. Активируем спрайт. Спрайт будет
// нарисован и анимирован до тех пор пока Вы его не уничножите
// с помощью метода iMySprite.Close()
User::LeaveIfError(iMySprite.Activate());
ActivateL();
}

Когда спрайт создан, он автоматически обновляется и анимируется, пока не будет уничтожен. Для смены позиции спрайта на экране нужно:

void CMyGameAppView::MoveMySpriteTo(const TPoint&amp; aPos)
{
iMySprite.SetPosition(aPos);
}

Иногда бывает необходимо сменить набор изображений спрайта. Поскольку изображения в каждом члене спрайта представляют собой обычные точечные рисунки (CFbsBitmap), и серверу окна посылаются указатели на эти рисунки, состав рисунков может быть в любое время изменен. Для этого нужно изменить параметры iBitmap и iMaskBitmap члена спрайта. После изменения рисунков нужно вызвать iMySprite.UpdateMember(index), чтобы сделанные изменения вступили в силу (и спрайт перерисовался), в противном случае представление спрайта не изменится до момента перерисовки.

Обратите внимание, описанным выше способом Вы не можете изменить размер изображения. Чтобы сделать это, необходимо создать новый член TSpriteMember и заменить им обновляемый с помощью метода UpdateMember(TInt aIndex, const TSpriteMember& aMemberData).

Использование анимации и видео клипов

В состав Series 60 Developer Platform 2.0 входит простой API, позволяющий проигрывать видео. Эта возможность может быть использована для создания разных игровых заставок. Проигрывание видео достаточно тяжелая задача (в зависимости от формата видео), поэтому не всегда возможно использовать его в игре. Кроме того, память устройства ограничена, поэтому старайтесь избегать использования видео клипов. При использовании клипа, вы должны сначала распаковать его и представить, например, в виде массива CFbsBitMaps, который потом использовать при проигрывании клипа.

С помощью CVideoPlayerUtility можно просто реализовать проигрывание видео. Для запуска ролика Вам нужно:

  1. Создать объект CVideoPlayerUtility.
  2. Открыть файл с видео роликом с помощью CVideoPlayerUtility::OpenFileL.
  3. После того как открытие и предварительная подготовка будут завершены, Вызовите CVideoPlayerUtility::Play для запуска ролика.

При создании CVideoPlayerUtility используются методы MVideoPlayerUtilityObserver:

  • MvpuoPrepareComplete: Подготовка к открытию файла завершена. Этот повторный вызов возникает в ответ на CVideoPlayerUtility::Prepare.
  • MvpuoOpenComplete: Открытие файла прошло успешно или возникла ошибка. Это событие возникает в результате работы CVideoPlayerUtility::OpenFileL.
  • MvpuoFrameReady: Вызывается когда запрашиваемый CVideoPlayerUtility::GetFrameL кадр готов.
  • MvpuoPlayComplete:Проигрывание ролика завершено или возникла ошибка. Событие не возникает при вызове CVideoPlayerUtility::Stop.
  • MvpuoEvent: Общее уведомление о событии. События определены поставщиком контроллера.

Ниже показан минимально необходимый набор действий для проигрывания видео ролика

void CMyGameView::MvpuoOpenComplete(TInt aError)
{
if(aError!= KErrNone)
{
// Ошибка при открытии
}else{
// Открытие прошло успешно
}
}
void CMyGameView::MvpuoFrameReady(CFbsBitmap&amp; aFrame, TInt aError)
{
if(aError!= KErrNone)
{
// Ошибка при получении кадра
}else{
// aFrame содержит требуемый кадр.
}
}
 
void CMyGameView::MvpuoPrepareComplete(TInt aError)
{
if(aError!= KErrNone)
{
// Ошибка при подготовке. Воспроизведение невозможно
}else{
// Подготовка завершена, проигрываем ролик
iMyVideoPlayer->Play();
}
}
 
void CMyGameView::MvpuoEvent(const TMMFEvent&amp; aEvent)
{
// Произошло какое-то событие. Описание события у разработчика контроллера
}
void CMyGameView::MvpuoPlayComplete(TInt aError)
{
if(aError!= KErrNone)
{
// Воспроизведение завершено с ошибкой.
}
}
 
void CMyGameView::PlayMyVideoFileL(TDesC&amp; aFileName)
{
delete iMyVideoPlayer;
iMyVideoPlayer=NULL;
iMyVideoPlayer= CVideoPlayerUtility::NewL(
*this,
EMdaPriorityNormal,
EMdaPriorityPreferenceTimeAndQuality,
iCoeEnv->WsSession(),
iCoeEnv->ScreenDevice(),
Window(),
Rect(),
Rect());
// MvpuoOpenComplete вызывается после закрытия.
iMyVideoPlayer->OpenFileL(aFileName);
}

Перевод:aRix




Наши соцсети

Подписаться Facebook Подписаться Вконтакте Подписаться Twitter Подписаться Google Подписаться Telegram

Популярное

Ссылки

Новости [1] [2] [3]... Android/ iOS/ J2ME[1] [2] [3]) Android / Архив

Рейтинг@Mail.ru Яндекс.Метрика
MobiLab.ru © 2005-2018
При использовании материалов сайта ссылка на www.mobilab.ru обязательна