def update(self): pygame.display.update() Base.CurrentScreen.fill(self.background) self.clock.tick(Con.FPS) Base.addTime()
def gameloop(self, playerNum=1): pygame.init() result = None self.running = True self.manager = Controller.LocalManager(self.frame) # pygame.display.set_caption(self.caption) sw, sh = self.frame.get_size() player_1 = Player(self.frame) # # 创建玩家 self.manager.addPlayer(player_1) # for i in range(playerNum - 1): # self.manager.addPlayer(Player(self.frame)) # # 创建敌人 for i in range(self.enemy_num): # one_enemy = Enemy(self.frame) # self.manager.addEnemy(one_enemy) # try: self.manager.startGame() while self.running: events = pygame.event.get() for event in events: if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: return if event.key == pygame.K_LALT: Base.setting() if event.type == pygame.QUIT: return # 更新敌人和玩家状态 situation, process, result = self.manager.updateSituation() # if situation == WIN: raise Exception("Winning!") if situation == LOST: raise Exception("Lost...") # 计算信息 message = f'Enemies:{self.enemy_num} ' \ f'Escapes:{self.manager.enemyHandler.escapeCount()} ' \ f'Second:{Base.getTimeSec():.1f} ' \ f'Process:{process:.2%}' # 摆放顶部文字 text1 = self.Font.render(message, True, Con.TextColor) w, h = text1.get_size() sizeratio = w / sw text1after = pygame.transform.scale(text1, (int(sw), int(h / sizeratio))) aw = text1after.get_rect().width Base.CurrentScreen.blit(text1after, (int(sw / 2 - aw / 2), 0)) # 为了第一人称时方便观看数据,打印到root # 显示帧率 if Con.FPSShowing: Base.printFPS(int(self.clock.get_fps())) # 刷新页面 self.flush(player_1.pos) self.clock.tick(Con.FPS) Base.addTime() finally: traceback.print_exc() self.close() return result
def showMenu(self): while True: events = pygame.event.get() for e in events: if e.type == pygame.QUIT: self.close() return False, None if e.type == pygame.VIDEORESIZE: if Con.FullScreen: # 全屏不缩放 continue if Con.ScreenSize[0] != e.size[0]: # 横改变 width = e.size[0] height = int(e.size[0] / Con.ScreenSizeRatio) else: # 纵改变 height = e.size[1] width = int(e.size[1] * Con.ScreenSizeRatio) size = max(width, Con.MinSize[0]), max(height, Con.MinSize[1]) self.resize(size, pygame.RESIZABLE) if e.type == pygame.MOUSEBUTTONDOWN: if Base.mouseInRect(self.startRect): return ['c', 's'][self.chooseServer], [self.cUI, self.sUI][self.chooseServer].getText() if Base.mouseInRect(self.backRect): self.close() return False, None if Base.mouseInRect(self.toggleRect): self.toggle() if e.type == pygame.KEYDOWN: if e.key in self.fullKeys: self.fullScreen() if e.key in self.toggleSCKeys: self.toggle() if e.key in self.quitKeys: self.close() return False, None if e.key in self.refreshKeys: self.__init__() if e.key in self.startKeys: return ['c', 's'][self.chooseServer], [self.cUI, self.sUI][self.chooseServer].getText() if e.key in self.settingKeys: self.setting() Base.CurrentScreen.fill(Con.BackGround) # 显示对应UI ui = self.sUI if self.chooseServer else self.cUI ui.update(events) ui.pack() # 摆放底部文字 bottom = 'Create ' + ["CLIENT", "SERVER"][self.chooseServer] + ' [SPACE] to toggle' textbottom = self.font.render( bottom, True, Con.TextColor, self.sOrcColor.calcColor() ) w, h = textbottom.get_size() sw, sh = Base.CurrentScreen.get_size() mouseposx, mouseposy = pygame.mouse.get_pos() textbottommovedistansex = sw - w textbottompos = (int(textbottommovedistansex * mouseposx / sw), sh - textbottom.get_height()) # 浮动式摆法 Base.CurrentScreen.blit(textbottom, textbottompos) self.startRect = pygame.Rect([*textbottompos, *textbottom.get_size()]) # 返回按钮 back = self.font.render('Back', True, Con.TextColor) backPos = (0, 0) Base.CurrentScreen.blit(back, backPos) self.backRect = pygame.Rect([*backPos, *back.get_size()]) # 切换按钮 toggle = self.font.render('Toggle', True, Con.TextColor, self.sOrcColor.calcColor()) togglePos = ( int(Base.CurrentScreen.get_width() - toggle.get_width()), 0 ) Base.CurrentScreen.blit(toggle, togglePos) self.toggleRect = pygame.Rect([*togglePos, *toggle.get_size()]) # 显示帧率 if Con.FPSShowing: Base.printFPS(int(self.clock.get_fps())) # 刷新 Base.flushAll() pygame.display.update() self.clock.tick(Con.FPS) Base.addTime()