ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX



Клипы - часть 8


for (int x = 0; x « iWidth; x++) (

// ВНИМАНИЕ: Предполагается, что RGB-маски // поверхности и DIB-секции совпадают, что // на самом деле не всегда справедливо. // Нам следовало бы рассматривать маску // ds.ddpfPixelFormat.dwRGBBitMask.

*pDIBPix++ = *pSurfPix++;

*pDIBPix++ = *pSurfPix++;

*pDIBPix++ = *pSurfPix++;

} } break;

default:

// Мы не должны сюда попасть

break;

} pDIBLine -= iDIBScan;

pSurfLine += iSurfScan;

}

// Разблокировать буфер

m hr = m pBackBuffer-»Get!nterface()

»Unlock(ds.lpSurface) ;

/b> ill5' Глава 11. Клипы

// Проверить, возвращен ли информационный // заголовок растра if (ppBMI) {

*ppBMI = pBMI;

} else {

delete pBMI;

}

// Проверить, возвращен ли указатель //на графические данные растра if (ppBits) *ppBit3- = pBits;

// Вернуть логический номер растра return hBmp;

}

Если объем кода начисто отбил у вас охоту снимать клипы, вспомните о том, что функция уже написана! Вам остается только вызвать ее. Подробное описание ее работы выходит за рамки главы и даже всей книги в целом. Я написал эту функцию, руководствуясь документацией по непосредственному режиму Direct3D и некоторыми примерами, входящими в комплект DirectX 2 SDK. 0 непосредственном режиме подробнее рассказывается в главе 13.

Допустим, нам удалось сохранить текущий вид макета. Что происходит дальше? Мы создаем объект CMovieFrame для хранения этого изображения и включаем кадр в список кадров объекта CMovieTake.

Просмотр клипа

Просмотреть записанную последовательность кадров относительно просто. Если вы знакомились с исходным текстом функции Grablmage, то эта задача может показаться вам тривиальной. Тем не менее существуют детали, которые заметно влияют на скорость работы. Перед тем как воспроизводить набор кадров, мы вызываем функцию CMovie::Stop, чтобы остановить процесс записи. Возможно, это покажется вам несущественным, однако в данной функции имеется одна исключительно важная строка (удастся ли вам найти ее?):

void CMovie::Stop()

(

if (m Displaying) {

m bIsPlaying = FALSE;




Содержание  Назад  Вперед