Стэн Трухильо - Графика для Windows средствами DirectDraw

Здесь есть возможность читать онлайн «Стэн Трухильо - Графика для Windows средствами DirectDraw» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Графика для Windows средствами DirectDraw: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Графика для Windows средствами DirectDraw»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Графика для Windows средствами DirectDraw — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Графика для Windows средствами DirectDraw», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать
Функция DrawScene()

Функция DrawScene()отвечает за подготовку нового кадра во вторичном буфере, обновление курсора и переключение страниц. Функция DrawScene()выполняется в основном потоке, поэтому она должна синхронизировать доступ к первичной поверхности и очереди событий мыши с потоком ввода. Функция DrawScene()приведена в листинге 7.4.

Листинг 7.4. Функция DrawScene()

void CursorWin::DrawScene() {

//------ Проверить клавишу ESCAPE -------

static char key[256];

keyboard->GetDeviceState(sizeof(key), &key);

if (key[DIK_ESCAPE] & 0x80) PostMessage(WM_CLOSE);

//------ Обычные задачи ------

ClearSurface(backsurf, 0);

BltSurface(backsurf, dm_surf, 539, 0);

static coil_idx;

BltSurface(backsurf, coil[coil_idx], coilx, coily);

coil_idx=(coil_idx+1)%coil_frames;

//------ Начало синхронизированной секции ------

critsection.Lock();

//------ Сохранить область вторичного буфера под курсором

RECT src;

src.left=curx;

src.top=cury;

src.right=curx+cursor_width;

src.bottom=cury+cursor_height;

cursor_under->BltFast(0, 0, backsurf, &src, DDBLTFAST_WAIT);

//------ Нарисовать курсор во вторичном буфере

backsurf->BltFast(curx, cury, cursor, 0, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);

primsurf->Flip(0, DDFLIP_WAIT);

while (primsurf->GetFlipStatus(DDGFS_ISFLIPDONE)!=DD_OK);

// ничего не делать (ждать, пока закончится

// переключение страниц)

int x, y;

BOOL newclick=FALSE;

int count=mouseclickqueue.GetCount();

while (count--) {

MouseClickData mc=mouseclickqueue.RemoveTail();

if (mc.button==0) {

x=mc.x;

y=mc.y;

newclick=TRUE;

}

}

critsection.Unlock();

//------ Конец синхронизированной секции -------

//------ Сделать паузу в соответствии с выбранной задержкой ----

if (delay_value[dm_index]!=0) Sleep(delay_value[dm_index]);

//------ Обновить меню задержки --------

if (newclick) {

int max_index=sizeof(delay_value)/sizeof(int)-1;

int menux=screen_width-dm_width+dm_margin;

int menuw=dm_width-dm_margin*2;

if (x>=menux && x<=menux+menuw) {

int index=(y-dm_header)/dm_entrysize;

if (index>=0 && index<=max_index && index!=dm_index) {

dm_index=index;

UpdateDelaySurface();

}

}

}

}

Функция DrawScene()состоит из семи этапов:

1. Проверка клавиши Escape.

2. Подготовка нового кадра во вторичном буфере.

3. Обновление курсора (также во вторичном буфере).

4. Переключение страниц.

5. Проверка очереди событий мыши.

6. Проверка очереди событий мыши.

7. Обновление поверхности меню задержки.

Первый этап выполняется функцией GetDeviceState()интерфейса DirectInputDevice. Если будет обнаружено нажатие клавиши Escape, функция посылает сообщение WM_CLOSE, сигнализируя о завершении приложения.

Подготовка вторичного буфера (этап 2) включает его стирание и последующее копирование в него внеэкранной поверхности. Для перебора поверхностей из массива coilиспользуется статическая целая переменная (массив coilподготавливается функцией CustomSurfaces(), которую мы не рассматриваем).

На этапах 3, 4 и 5 программа обращается к ресурсам, используемым потоком ввода, поэтому необходимо воспользоваться критической секцией. Объект класса CCriticalSection( critsection), объявленный в классе CursorWin(см. листинг 7.1), блокируется функцией Lock(). Эта функция пытается получить доступ к критической секции. Если попытка оказывается удачной, функция захватывает критическую секцию и завершается. После этого можно смело работать с совместными ресурсами — поток заведомо обладает монопольным правом доступа к ним. Если функции Lock()будет отказано в доступе (из-за того что критическая секция в данный момент захвачена потоком ввода), функция Lock()блокирует основной поток до освобождения критической секции.

На этапе 3 мы сохраняем содержимое области вторичного буфера, занятой курсором, а затем рисуем курсор в буфере. Обе операции выполняются функцией BltFast()интерфейса DirectDrawSurface.

На этапе 4 выполняется переключение страниц, однако оно происходит сложнее, чем обычно. Это связано с тем, что функция Flip()интерфейса DirectDrawSurfaceна самом деле не выполняет переключения. Она лишь приказывает видеокарте переключить страницы и после этого завершается. Фактическое переключение страниц происходит после того, как будут закончены все ранее начатые операции блиттинга во вторичный буфер. Для наших целей этого недостаточно. Нам нужно, чтобы переключение страниц было закончено до кода критической секции, потому что в противном случае поток ввода сможет обновить первичную поверхность во время переключения страниц. С помощью цикла whileи функции GetFlipStatus()интерфейса DirectDrawSurfaceмы опрашиваем DirectDraw до тех пор, пока переключение страниц не закончится (в DirectDraw не предусмотрена блокировка по этой операции, но даже если бы она и была, переключение страниц происходит слишком быстро и не оправдывает блокировки потока).

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Графика для Windows средствами DirectDraw»

Представляем Вашему вниманию похожие книги на «Графика для Windows средствами DirectDraw» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Графика для Windows средствами DirectDraw»

Обсуждение, отзывы о книге «Графика для Windows средствами DirectDraw» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x