powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / рисование игрового поля
2 сообщений из 2, страница 1 из 1
рисование игрового поля
    #32793355
anais
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пишу игру Lines на VC. всё работает за исключением перерисовки, она работает медленно.
у меня есть классы - растер(CRaster) (работа с картинками),
шарик(CBall) - реализует перерисовку разных шариков (выделенных, текущих и т.д.),
поле(CField) - вызывает методы шарика, проверяет наличие 5 и более шариков в ряд.

функции перерисовки поля вызываю всякий раз в OnDraw() класса СLinesView.
то есть на этом теряю - т.к. при передвижение шарика, перерисовываю всё поле, а не результат передвижения шарика - 2 клетки. подскажите как сделать правильно.

рисунки храню в формате bmp - каждый шарик имеет картинку, пустой квадратик тоже представляет собой картинку, при прорисовки проверяется массив поля, в зависимости от значения выбирается картинка - пустой квадрат или какой-либо цветной шарик. то есть у меня получается что она и таже картинка загружается несколько раз.

слышала, что можно делать как-то через буффер, но не поняла как.
...
Рейтинг: 0 / 0
рисование игрового поля
    #32793426
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторслышала, что можно делать как-то через буффер, но не поняла как.

Проблема в том, кто скорость обмена с видеопамятью низкая, поэтому рисовать всё напрямую туда - слишком долго.

Рисуют в Win32 через HDC, (GetDC)
И чтобы небыло тормозов, используют дублирующий буфер.
А именно ещё один девайсконтехт DC:

HDC hdccomp = CreateCompatibleDC(hdc);
и рисуют в него.
Чтобы в него рисовать, в нём надо завести битмапу
HBITMAP bm = CreateCompatibleBitmap(hdc, width, height);
width и height - ширина и высота родного окна
И запихать её в контехт. При этом старую сохранить.
HBITMAP obm = (HBITMAP)SelectObject(hdc,bm);

потом все рисования делаются в hdccomp (и попадают на bm)

после того, как всё нарисовано делаем:
BitBlt(hdc,0,0,width,height,hdccomp,0,0,SRCCOPY);
Это быстрая функция. Копирует данные между текущими битмапами двух DC.

После этого надо всё отпустить и убить.

SelectObject(hdc,obm);
DeleteDC(hdc);

авторфункции перерисовки поля вызываю всякий раз в OnDraw() класса СLinesView.
то есть на этом теряю - т.к. при передвижение шарика, перерисовываю всё поле, а не результат передвижения шарика - 2 клетки. подскажите как сделать правильно.

Могу нагнять, но вроде так:
OnDraw звать руками не надо, а надо посылать WM_PAINT, перед этим сказав
InvalidateRect(hWnd, rect, TRUE);
где - rect - это прямоугольник, который надо перерисовать.
Тогда всё окно перерисовываться не будет.

Или.
Непосредственно где-то хранить и обновлять данные о клетках, которые надо перерисовывать в OnDraw, и в OnDraw смотреть, у которых клеток стоит этот флаг - перерисовывать.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / рисование игрового поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]