|
|
|
рисование игрового поля
|
|||
|---|---|---|---|
|
#18+
пишу игру Lines на VC. всё работает за исключением перерисовки, она работает медленно. у меня есть классы - растер(CRaster) (работа с картинками), шарик(CBall) - реализует перерисовку разных шариков (выделенных, текущих и т.д.), поле(CField) - вызывает методы шарика, проверяет наличие 5 и более шариков в ряд. функции перерисовки поля вызываю всякий раз в OnDraw() класса СLinesView. то есть на этом теряю - т.к. при передвижение шарика, перерисовываю всё поле, а не результат передвижения шарика - 2 клетки. подскажите как сделать правильно. рисунки храню в формате bmp - каждый шарик имеет картинку, пустой квадратик тоже представляет собой картинку, при прорисовки проверяется массив поля, в зависимости от значения выбирается картинка - пустой квадрат или какой-либо цветной шарик. то есть у меня получается что она и таже картинка загружается несколько раз. слышала, что можно делать как-то через буффер, но не поняла как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2004, 09:50 |
|
||
|
рисование игрового поля
|
|||
|---|---|---|---|
|
#18+
авторслышала, что можно делать как-то через буффер, но не поняла как. Проблема в том, кто скорость обмена с видеопамятью низкая, поэтому рисовать всё напрямую туда - слишком долго. Рисуют в 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 смотреть, у которых клеток стоит этот флаг - перерисовывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2004, 10:32 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=424&tid=2034060]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 325ms |

| 0 / 0 |
