Артефакты с pygame при попытке обновить только видимые спрайтыPython

Программы на Python
Ответить
Anonymous
 Артефакты с pygame при попытке обновить только видимые спрайты

Сообщение Anonymous »

Я изучаю основы библиотеки pygame и уже испытываю трудности. В «игре» на данный момент есть только игрок и стены. Существует две основные поверхности: «мир» (фактическая игровая карта) и «экран» (который служит окном просмотра для «view_src» с масштабированием и прокруткой, «экран просмотра» — соответствующий прямоугольник).
Вот проблема: я хочу реализовать хотя бы базовую оптимизацию и отображать только те спрайты, которые действительно видимы, поэтому я фильтрую группу «все» по всему, что сталкивается с областью просмотра. Это действует так, как и ожидалось. Но когда я вызываю функции рендеринга в «видимой» специальной группе, я получаю артефакты, тогда как вызов их для «всех» работает нормально.
Вот соответствующее фрагмент игрового цикла:

Код: Выделить всё

        # clear old sprites
all.clear(world, background) # this should clear the OLD position of all sprites, right?

# handle input and generic game logic here
if player.move(key_state, walls) != (0,0): # moves the player's rect if possible
scroll_view(world, player.last_move, view_src) # shifts view_src if applicable

# this does very little and should be unrelated to the issue
all.update()

# draw the new scene
visible = pg.sprite.Group([ spr for spr in all.sprites() if view_src.colliderect(spr.rect) ])
print(visible.sprites()) # confirms the visible sprites are chosen correctly
visible.draw(world) # results in drawing each sprite in its new AND old position
#all.draw(world) # acts as it should if used instead

scaled = pg.transform.scale(world.subsurface(view_src), viewport.size)
screen.blit(scaled, viewport.topleft)
pg.display.flip()
(Я делаю .empty() «видимую» группу в конце цикла)
Даже если я определил «видимую» раньше и вызовите видимый.clear(world, background), а затем перейдите all.draw(world). Я получаю ту же проблему, она работает только в том случае, если вызываются оба .clear() и .draw(). "все". Это уже после консультации с ИИ, который сказал мне, что все работает отлично, так что, надеюсь, старый добрый человек сможет указать мне правильное направление.

Подробнее здесь: https://stackoverflow.com/questions/793 ... rites-only
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»