Спрайт - это частично прозрачное изображение или набор изображений, который может накладываться и перемещаться по заднему плану или по другому спрайту без необходимости перерисовывать все основное окно. Другими словами спрайт - это перемещаемый игровой объект. Спрайты используются практически во всех 2D играх.
Вы можете создать собственный класс спрайтов, например, используя изображения, организовать их анимирование через таймер и автоматизировать перерисовку экрана. Однако в Symbian OS есть уже готовый класс для работы со спрайтами: RWsSprite. Он обеспечивает автоматическую перерисовку спрайтов и анимацию, посредствам смены изображений через заданные интервалы времени.
Создать новый спрайт очень просто. Для этого нужно:
Каждый спрайт имеет один или более членов (members) TSpriteMember, которые определяют параметры каждого изображения, присоединенного к спрайту. Каждый член состоит из:
Приведенный ниже код показывает, как создать спрайт на основании загруженных из 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& 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 можно просто реализовать проигрывание видео. Для запуска ролика Вам нужно:
При создании CVideoPlayerUtility используются методы MVideoPlayerUtilityObserver:
Ниже показан минимально необходимый набор действий для проигрывания видео ролика
void CMyGameView::MvpuoOpenComplete(TInt aError) { if(aError!= KErrNone) { // Ошибка при открытии }else{ // Открытие прошло успешно } } void CMyGameView::MvpuoFrameReady(CFbsBitmap& aFrame, TInt aError) { if(aError!= KErrNone) { // Ошибка при получении кадра }else{ // aFrame содержит требуемый кадр. } } void CMyGameView::MvpuoPrepareComplete(TInt aError) { if(aError!= KErrNone) { // Ошибка при подготовке. Воспроизведение невозможно }else{ // Подготовка завершена, проигрываем ролик iMyVideoPlayer->Play(); } } void CMyGameView::MvpuoEvent(const TMMFEvent& aEvent) { // Произошло какое-то событие. Описание события у разработчика контроллера } void CMyGameView::MvpuoPlayComplete(TInt aError) { if(aError!= KErrNone) { // Воспроизведение завершено с ошибкой. } } void CMyGameView::PlayMyVideoFileL(TDesC& aFileName) { delete iMyVideoPlayer; iMyVideoPlayer=NULL; iMyVideoPlayer= CVideoPlayerUtility::NewL( *this, EMdaPriorityNormal, EMdaPriorityPreferenceTimeAndQuality, iCoeEnv->WsSession(), iCoeEnv->ScreenDevice(), Window(), Rect(), Rect()); // MvpuoOpenComplete вызывается после закрытия. iMyVideoPlayer->OpenFileL(aFileName); }
Перевод:aRix