坚持一个主循环,如果你真的不需要线程,不要使用它们。
您已经发现您的游戏由不同的屏幕组成(我们称它们为Scene
这样,以免我们将其与绘制内容的实际屏幕混淆),因此下一个合乎逻辑的步骤是将它们从主循环中分离出来。
假设您有以下场景:
那么你应该为每一个创建一个类,然后该类将负责绘图/事件处理/此部分中需要的任何内容。
一个简单的例子:
import pygame
pygame.init()
class Scene(object):
screen = None
class Intro(Scene):
def __init__(self):
self.c = (32, 32, 100)
def draw(self):
Scene.screen.fill(self.c)
def update(self):
# since scenes are classes, they have a state that we can modify
r,g,b = self.c
r += 1
g += 1
b += 2
if r > 255: r = 0
if g > 255: g = 0
if b > 255: b = 0
self.c = r, g, b
def handle(self, event):
# move to Menu-scene when space is pressed
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
# returning a scene from handle or update changes the current scene
return Menu()
class Menu(Scene):
def draw(self):
# draw menu
Scene.screen.fill((200, 200, 100))
def update(self):
pass
# do something
def handle(self, event):
# handle menu input
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
return Game()
if event.key == pygame.K_b:
return Intro()
class Game(Scene):
pass # implement draw update handle
Scene.screen = pygame.display.set_mode((800, 600))
scene = Intro()
while True:
if pygame.event.get(pygame.QUIT): break
for e in pygame.event.get():
scene = scene.handle(e) or scene
scene = scene.update() or scene
scene.draw()
pygame.display.flip()
这样,您就有了一个主循环,但游戏的不同部分由单独的类管理。在上面的简单示例中,每个场景都知道在某个事件上要激活哪个其他场景,但这不是必需的。您可以创建某种SceneHandler
管理场景之间的过渡的方法。此外,您可能希望拥有某种游戏状态对象,以便在场景中传递(例如,在游戏结束场景中显示您从游戏场景中获得的分数)。