Переписывание простой функции рисования в Pygame 2D на C ++ - PullRequest
1 голос
/ 16 июня 2010

У меня есть 2D список векторов (скажем, 20x20 / 400 точек), и я рисую эти точки на экране следующим образом:

for row in grid:
    for point in row:
        pygame.draw.circle(window, white, (particle.x, particle.y), 2, 0)

pygame.display.flip() #redraw the screen   

Это работает отлично, но гораздо медленнее, чем я ожидал.

Я хочу переписать это на C ++ и, надеюсь, научиться кое-чему (я делаю блок на C ++ atm, так что это поможет) в пути. Какой самый простой способ подойти к этому? Я посмотрел на Direct X и до сих пор следовал куче уроков и нарисовал несколько элементарных треугольников. Однако я не могу найти простое (точка рисования).

Ответы [ 2 ]

1 голос
/ 16 июня 2010

Когда я впервые увлекался игровым / графическим программированием, я полюбил Allegro .У него огромный набор функций и довольно простая кривая обучения.

1 голос
/ 16 июня 2010

DirectX не имеет функций для рисования только одной точки. Он работает только с вершинными и индексными буферами. Если вам нужен более простой способ сделать одну точку, вам нужно написать оболочку.
Для рисования списков точек вам нужно использовать DrawPrimitive ( D3DPT_POINTLIST , ...). однако, не будет простого способа просто построить точку. Вам нужно подготовить буфер, заблокировать его, заполнить данными, а затем нарисовать буфер. Или вы можете использовать динамические буферы вершин - для оптимизации производительности. Существует вызов DrawPrimitiveUP, который должен отображать примитивы, хранящиеся в системной памяти (вместо использования буферов), но, насколько я знаю, он не работает (может молча отбрасывать примитивы) с чистыми устройствами , так что вам придется использовать программную обработку вершин.

В OpenGL у вас есть glVertex2f и glVertex3f. Ваш вызов будет выглядеть так (может быть ошибка опечатки или синтаксическая ошибка - я не компилировал / не запускал его):

glBegin(GL_POINTS);
glColor3f(1.0, 1.0, 1.0);//white
for (int y = 0; y < height; y++)
    for (int x = 0; x < width; x++)
        glVertex2f(points[y][x].x, points[y][x].y);//plot point
glEnd();

OpenGL НАМНОГО проще для экспериментов и экспериментов, чем DirectX. Я бы рекомендовал взглянуть на SDL и использовать его в сочетании с OpenGL. Или вы можете использовать GLUT вместо SDL.

Или вы можете попробовать использовать Qt 4. У него очень хорошие процедуры рендеринга 2D.

...