Как увеличить камеру с помощью HUD в opengl / pyglet? - PullRequest
0 голосов
/ 01 января 2019

Я делаю 2d стратегическую игру в pyglet и реализую движение камеры с помощью функции glTranslatef:

def background_motion(dt):
    if stars.left:
        pyglet.gl.glTranslatef(15, 0, 0)
        stars.translation[0] += 15
    if stars.right:
        pyglet.gl.glTranslatef(-15, 0, 0)
        stars.translation[0] -= 15
    if stars.up:
        pyglet.gl.glTranslatef(0, -15, 0)
        stars.translation[1] -= 15
    if stars.down:
        pyglet.gl.glTranslatef(0, 15, 0)
        stars.translation[1] += 15

И заставил HUD оставаться в таком положении:

def on_draw():
    window.clear()
    stars.image.draw()
    for s in game.ships:
        s.draw()
    pyglet.gl.glTranslatef(-stars.translation[0], -stars.translation[1], 0)

    #HUD Start
    overlay.draw(stars.image.x,stars.image.y,game.ships,stars.scale,stars.image.width)
    if game.pause:
        pause_text.draw()
    #HUD End

    pyglet.gl.glTranslatef( stars.translation[0], stars.translation[1], 0)

Iпопробовал подобный подход, когда дело доходит до масштабирования, и когда масштабирование работает, HUD также масштабируется:

def on_mouse_scroll(x, y, scroll_x, scroll_y):
    if scroll_y > 0:
        stars.scale += 0.01

    elif scroll_y < 0:
        stars.scale -= 0.01

@window.event
def on_draw():
    window.clear()
    pyglet.gl.glScalef(stars.scale,stars.scale, 0, 1)
    stars.image.draw()
    for s in game.ships:
        s.draw()
    scale_reverse = 1 + (1 - stars.scale)
    pyglet.gl.glScalef(scale_reverse, scale_reverse, 0, 1)
    pyglet.gl.glTranslatef(-stars.translation[0], -stars.translation[1], 0)

    #HUD Start
    overlay.draw(stars.image.x,stars.image.y,game.ships,stars.scale,stars.image.width)
    if game.pause:
        pause_text.draw()
    #HUD End

    pyglet.gl.glTranslatef( stars.translation[0], stars.translation[1], 0)
    pyglet.gl.glScalef(stars.scale, stars.scale, 0, 1)
    stars.scale = 1

Как я могу сделать так, чтобы HUD не масштабировался?

1 Ответ

0 голосов
/ 01 января 2019

Обратите внимание, что рисование с помощью glBegin / glEnd последовательностей, а также стека с фиксированной матрицей и фиксированной матрицы устарело с десятилетий.Прочтите о конвейере с фиксированными функциями и посмотрите Спецификации вершин и Шейдеры , чтобы узнать о современном способе рендеринга.


В любом случае,Я рекомендую использовать glPushMatrix / glPopMatrix, чтобы сохранить матрицу до рисования HUD и восстановить ее после.
Таким образом, вы можете установить матрицу идентичности с помощью glLoadIdentity до того, как вы нарисуете HUD.
Было бы даже возможно использовать совершенно другую (перевод и масштаб) матрицу для HUD:

#HUD Start
pyglet.gl.glPushMatrix()
pyglet.gl.glLoadIdentity()

overlay.draw(stars.image.x,stars.image.y,game.ships,stars.scale,stars.image.width)
if game.pause:
    pause_text.draw()

pyglet.gl.glPopMatrix()
#HUD End
...