Python livewires 调整屏幕大小
Python livewires resize screen
我正在尝试使用 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 中收到错误。
有谁知道调整大小,或者销毁并重新创建 Livewire 屏幕的方法吗?
注意:我使用的是 Michael Dawsons 编辑过的版本。 Download for pygame and livewires used.
您只需拨打:
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)
什么的。
希望对您有所帮助。
您可以探索一种方法,通过从 pygame 调用方法 display.set_mode
,就像在 Screen
class 构造函数(game.py 中的 l.165 来自您提供的包)
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
class,它可以通过调用 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,你只需要继承它,并添加屏幕参数:
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) )
...
我正在尝试使用 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 中收到错误。
有谁知道调整大小,或者销毁并重新创建 Livewire 屏幕的方法吗?
注意:我使用的是 Michael Dawsons 编辑过的版本。 Download for pygame and livewires used.
您只需拨打:
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)
什么的。
希望对您有所帮助。
您可以探索一种方法,通过从 pygame 调用方法 display.set_mode
,就像在 Screen
class 构造函数(game.py 中的 l.165 来自您提供的包)
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
class,它可以通过调用 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,你只需要继承它,并添加屏幕参数:
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) )
...