Экран изменения размера Python livewires

Я пытаюсь создать игру с помощью livewires, в которой есть несколько уровней. На каждом уровне экран должен быть разного размера, так что либо я могу создать новый экран, либо я могу изменить его размер. Когда я попробовал новый экран, Вот так (mcve):

from livewires import games
games.init(screen_width = 500, screen_height=100, fps = 50)
#dosomething
games.screen.quit()
games.init(screen_width = 100, screen_height=500, fps = 50)    
games.screen.mainloop()

Я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "C:UsersFredDesktopgamemain.py", line 6, in <module>
    games.screen.mainloop()
  File "C:UsersFredDesktopgamelivewiresgames.py", line 308, in mainloop
    object._tick()
  File "C:UsersFredDesktopgamelivewiresgames.py", line 503, in _tick
    self.tick()
  File "C:UsersFredDesktopgamelivewiresgames.py", line 776, in tick
    self._after_death()
  File "C:UsersFredDesktopgamemain.py", line 5, in <module>
    games.init(screen_width = 100, screen_height=500, fps = 50)
  File "C:UsersFredDesktopgamelivewiresgames.py", line 884, in init
    screen = Screen(screen_width, screen_height, fps)
  File "C:UsersFredDesktopgamelivewiresgames.py", line 159, in __init__
    raise GamesError("Cannot have more than on Screen object")

livewires.games.GamesError: Cannot have more than on Screen object

games.screen.width и height не может быть установлен (вы можете только получить их), поэтому я не могу сделать это так, и когда я изменяю добавить строку в livewires.игры для сброса количества экранов вместо 0 я получаю ошибку в pygame.

кто-нибудь знает способ изменить размер, или же уничтожить и воссоздать экран в livewires?


Примечание: я использую отредактированную версию Майкла Доусона. Скачать для pygame и livewires используется.

2 ответов


есть способ, который вы можете исследовать, вызвав метод display.set_mode С , С которым Pygame, как в Screen конструктор классов (Л. 165 in game.py из пакета, который вы предоставили)

games.init(screen_width = 500, screen_height=100, fps = 50)

#[...] level stuffs...

games.screen._width = 100  # this setup the width property directly in the screen
games.screen._height = 500 # this setup the height property 
games.screen._display = pygame.display.set_mode((100, 500)) # this update the display

одним из недостатков этого решения является то, что если вы сохраняете некоторые живые спрайты во время изменения экрана, они не будут корректно обновлять метод стирания во время отображения, и это может оставить некоторые строки во время рисования. Чтобы избежать этого, вы можете позвонить games.screen.clear() или, если вам нужен выборочная очистка, вы можете использовать overriden Sprite класс, который может обрабатывать правильный метод, вызывая screen.blit_and_dirty.

class MySprite(games.Sprite):
    def __init__(self, screen, *args, **kwargs):
        self.screen = screen
        super().__init__(*args, **kwargs)

    def _erase(self):
        """
        This method overrides the class method by using blit_and_dirty instead of blit_background
        """
        self.screen.blit_and_dirty(self.screen._background, self._rect)

чтобы использовать этот класс, вы просто должны наследовать от него и добавить параметр экрана:

class Ball(MySprite):
    def __init__(self, screen):
        super().__init__(screen, games.load_image('ball.png'), x=40, y=40, dx=2, dy=2)

    def update(self): 
        if self.left<=0 or self.right>=self.screen.get_width():
            self.dx*=-1

        if self.top<=0 or self.bottom>=self.screen.get_height():
            self.dy*=-1

и вы можете объявить экземпляр, как показано ниже :

games.init(screen_width = 500, screen_height=100, fps = 50)
games.screen.add(Ball(games.screen) )
...

все, что вам нужно сделать, это вызов:

    games.screen.quit()

это закроет экран, а затем просто позвоните в игры.функция init () для воссоздания экрана с новым размером. Вы можете создать отдельное значение, которое увеличивается каждый раз, когда вы пройти уровень, например

    height = (original value) + (level * increase)
    width = (original value) + (level * increase)
    games.init(screen_height = height, screen.width = width, fps = 50)

или что-то в этом роде.

надеюсь, что это помогает.