class MainView(View): logo = None btn_start = None btn_exit = None context = None def __init__(self, context): self.btn_start = Button('Start Game', self._on_start) self.btn_exit = Button('Exit Game', self._on_exit) self.context = context self.logo = pygame.image.load('img/logo.png') w, h = self.logo.get_size() # 调整界面适应 Logo 大小以及显示按钮 self.context.screen = pygame.display.set_mode( (int(w * 1.5), int(h * 2)), 0, 32) # 设置界面标题 pygame.display.set_caption('Python Snake Game v1.0') View.__init__(self, context.screen) def on_draw(self): # 绘制界面 self._on_draw() # 绘制按钮 self.btn_start.on_draw(self.context.screen) self.btn_exit.on_draw(self.context.screen) def on_event(self, event): # 监控各种事件 self.btn_start.on_event(event) self.btn_exit.on_event(event) def _on_exit(self): # 控制退出状态 print('exit game') self.context.running = False def _on_start(self): # 切换界面到游戏界面 print('start game') self.context.view = GameView(self.context) def _on_draw(self): ''' 计算各个按钮的位置以及Logo的位置 ''' s_w, s_h = self.context.screen.get_size() l_w, l_h = self.logo.get_size() x, y, bs_w, bs_h = self.btn_start.get_box() x, y, be_w, be_h = self.btn_exit.get_box() y_start = l_h + 50 ''' 界面元素排版 ''' self.btn_start.pos = (s_w / 2 - bs_w / 2, y_start) self.btn_exit.pos = (s_w / 2 - be_w / 2, y_start + bs_h + 4) self.context.screen.blit(self.logo, (s_w / 2 - l_w / 2, s_h / 2 - l_h / 2))
class GameOverView(View): btn_replay = None btn_exit = None context = None game_over = None def __init__(self, context): self.btn_replay = Button('Replay Game', self._on_start) self.btn_exit = Button('Exit Game', self._on_exit) font = pygame.font.SysFont('arial', 32) self.game_over = font.render('Game Over', True, (0, 0, 0)) self.context = context def on_draw(self): s_w, s_h = self.context.screen.get_size() l_w, l_h = self.game_over.get_size() x, y, bs_w, bs_h = self.btn_replay.get_box() x, y, be_w, be_h = self.btn_exit.get_box() # 所有元素高度 y_h = bs_h + be_h + l_h + 4 + 50 y_start = s_h / 2 - y_h / 2 + 50 ''' 界面元素排版 ''' self.btn_replay.pos = (s_w / 2 - bs_w / 2, y_start) self.btn_exit.pos = (s_w / 2 - be_w / 2, y_start + bs_h + 4) self.context.screen.blit(self.game_over, (s_w / 2 - l_w / 2, s_h / 2 - y_h / 2)) # 绘制按钮 self.btn_replay.on_draw(self.context.screen) self.btn_exit.on_draw(self.context.screen) def _on_exit(self): # 控制退出状态 print('exit game') self.context.running = False def _on_start(self): # 切换界面到游戏界面 print('start game') self.context.view = GameView(self.context) def on_event(self, event): # 监控各种事件 self.btn_replay.on_event(event) self.btn_exit.on_event(event)
''' 初始化音频播放器 ''' # 初始化 pygame.mixer.init() def click_test(): print('button clicked') button = Button(text='Start Game', callable=click_test) # 1. 游戏死循环 while running: # 2. 获取事件流 for event in pygame.event.get(): button.on_event(event) # 3. 处理事件流 if event.type == QUIT: # 结束运行 running = False screen.fill((0xff, 0xff, 0xff)) button.on_draw(screen) # 3. 刷新显示窗口 pygame.display.flip() clock.tick(60) # 4. 退出框架 pygame.quit()