Python LiveWires изменить размер экрана - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь создать игру с использованием 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:\Users\Fred\Desktop\game\main.py", line 6, in <module>
    games.screen.mainloop()
  File "C:\Users\Fred\Desktop\game\livewires\games.py", line 308, in mainloop
    object._tick()
  File "C:\Users\Fred\Desktop\game\livewires\games.py", line 503, in _tick
    self.tick()
  File "C:\Users\Fred\Desktop\game\livewires\games.py", line 776, in tick
    self._after_death()
  File "C:\Users\Fred\Desktop\game\main.py", line 5, in <module>
    games.init(screen_width = 100, screen_height=500, fps = 50)
  File "C:\Users\Fred\Desktop\game\livewires\games.py", line 884, in init
    screen = Screen(screen_width, screen_height, fps)
  File "C:\Users\Fred\Desktop\game\livewires\games.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.games, чтобы сбросить счетчик экрана до 0, я получаю сообщение об ошибке в pygame.

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


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

Ответы [ 2 ]

0 голосов
/ 16 июня 2018

Вы можете исследовать этот способ, вызывая метод display.set_mode из pygame , как в конструкторе класса Screen (l. 165 в 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() или, если вам нужна выборочная очистка, вы можете использовать переопределенный класс 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) )
...
0 голосов
/ 09 июня 2018

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

    games.screen.quit()

Это закроет экран, а затем просто вызовет функцию games.init (), чтобы воссоздать экран с вашим новым размером.Возможно, вы захотите создать отдельное значение, которое увеличивается при каждом прохождении уровня - например,

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

или что-то еще.

Надеюсь, это поможет.

...