Вот проблема: я хочу реализовать хотя бы базовую оптимизацию и отображать только те спрайты, которые действительно видимы, поэтому я фильтрую группу «все» по всему, что сталкивается с областью просмотра. Это действует так, как и ожидалось. Но когда я вызываю функции рендеринга в «видимой» специальной группе, я получаю артефакты, тогда как вызов их для «всех» работает нормально.
Вот соответствующее фрагмент игрового цикла:
Код: Выделить всё
# 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()
Даже если я определил «видимую» раньше и вызовите видимый.clear(world, background), а затем перейдите all.draw(world). Я получаю ту же проблему, она работает только в том случае, если вызываются оба .clear() и .draw(). "все". Это уже после консультации с ИИ, который сказал мне, что все работает отлично, так что, надеюсь, старый добрый человек сможет указать мне правильное направление.
Подробнее здесь: https://stackoverflow.com/questions/793 ... rites-only
Мобильная версия