def __init__(self, col, row): pygame.sprite.Sprite.__init__(self) self.image_path = os.path.join(Config.get('resources_path'), Config.get('imgfolder'), 'player.png') self.image = pygame.image.load(self.image_path).convert() color = self.image.get_at((0, 0)) self.image.set_colorkey(color, pygame.RLEACCEL) self.rect = self.image.get_rect() self.col = col self.row = row
def BUTTON(screen, position, text): bwidth = 310 bheight = 65 left, top = position pygame.draw.line(screen, (150, 150, 150), (left, top), (left+bwidth, top), 5) pygame.draw.line(screen, (150, 150, 150), (left, top-2), (left, top+bheight), 5) pygame.draw.line(screen, (50, 50, 50), (left, top+bheight), (left+bwidth, top+bheight), 5) pygame.draw.line(screen, (50, 50, 50), (left+bwidth, top+bheight), [left+bwidth, top], 5) pygame.draw.rect(screen, (100, 100, 100), (left, top, bwidth, bheight)) font_path = os.path.join(Config.get('resources_path'), Config.get('fontfolder'), 'simkai.ttf') font = pygame.font.Font(font_path, 50) text_render = font.render(text, 1, (255, 0, 0)) return screen.blit(text_render, (left+50, top+10))
def __init__(self, sprite_name, col, row): pygame.sprite.Sprite.__init__(self) # 导入box.png/target.png/wall.png self.image_path = os.path.join(Config.get('resources_path'), Config.get('imgfolder'), sprite_name) self.image = pygame.image.load(self.image_path).convert() color = self.image.get_at((0, 0)) self.image.set_colorkey(color, pygame.RLEACCEL) self.rect = self.image.get_rect() # 元素精灵类型 self.sprite_type = sprite_name.split('.')[0] # 元素精灵的位置 self.col = col self.row = row
def endInterface(screen): screen.fill(Config.get('bg_color')) clock = pygame.time.Clock() font_path = os.path.join(Config.get('resources_path'), Config.get('fontfolder'), 'simkai.ttf') text = '机智如你~恭喜通关!' font = pygame.font.Font(font_path, 30) text_render = font.render(text, 1, (255, 255, 255)) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() screen.blit(text_render, (120, 200)) clock.tick(60) pygame.display.update()
def isValidPos(self, col, row): if col >= 0 and row >= 0 and col < self.num_cols and row < self.num_rows: block_size = Config.get('block_size') temp1 = self.walls + self.boxes temp2 = pygame.Rect(col * block_size, row * block_size, block_size, block_size) return temp2.collidelist(temp1) == -1 else: return False
def main(): pygame.init() pygame.mixer.init() pygame.display.set_caption('推箱子') screen = pygame.display.set_mode([Config.get('WIDTH'), Config.get('HEIGHT')]) pygame.mixer.init() audio_path = os.path.join(Config.get('resources_path'), Config.get('audiofolder'), 'EineLiebe.mp3') pygame.mixer.music.load(audio_path) pygame.mixer.music.set_volume(0.4) pygame.mixer.music.play(-1) startInterface(screen) levels_path = Config.get('levels_path') for level_name in sorted(os.listdir(levels_path)): runGame(screen, level_name) switchInterface(screen) endInterface(screen) # if __name__ == '__main__': # main()
def loadLevel(self, game_level): with open(os.path.join(self.levels_path, game_level), 'r') as f: lines = f.readlines() # 游戏地图 self.game_map = gameMap(max([len(line) for line in lines]) - 1, len(lines)) # 游戏surface height = Config.get('block_size') * self.game_map.num_rows width = Config.get('block_size') * self.game_map.num_cols self.game_surface = pygame.Surface((width, height)) self.game_surface.fill(Config.get('bg_color')) self.game_surface_blank = self.game_surface.copy() for row, elems in enumerate(lines): for col, elem in enumerate(elems): if elem == 'p': self.player = pusherSprite(col, row) elif elem == '*': self.game_map.addElement('wall', col, row) elif elem == '#': self.game_map.addElement('box', col, row) elif elem == 'o': self.game_map.addElement('target', col, row)
def switchInterface(screen): screen.fill(Config.get('bg_color')) clock = pygame.time.Clock() while True: button_1 = BUTTON(screen, (95, 150), '进入下关') button_2 = BUTTON(screen, (95, 305), '退出游戏') for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.MOUSEBUTTONDOWN: if button_1.collidepoint(pygame.mouse.get_pos()): return elif button_2.collidepoint(pygame.mouse.get_pos()): quitGame() clock.tick(60) pygame.display.update()
def scroll(self): x, y = self.player.rect.center width = self.game_surface.get_rect().w height = self.game_surface.get_rect().h if (x + Config.get('WIDTH') // 2) > Config.get('WIDTH'): if -1 * self.scroll_x + Config.get('WIDTH') < width: self.scroll_x -= 2 elif (x + Config.get('WIDTH') // 2) > 0: if self.scroll_x < 0: self.scroll_x += 2 if (y + Config.get('HEIGHT') // 2) > Config.get('HEIGHT'): if -1 * self.scroll_y + Config.get('HEIGHT') < height: self.scroll_y -= 2 elif (y + 250) > 0: if self.scroll_y < 0: self.scroll_y += 2
def __init__(self, screen): self.screen = screen self.levels_path = Config.get('levels_path') self.initGame()
def runGame(screen, game_level): clock = pygame.time.Clock() game_interface = gameInterface(screen) game_interface.loadLevel(game_level) font_path = os.path.join(Config.get('resources_path'), Config.get('fontfolder'), 'simkai.ttf') text = '按R键重新开始本关' font = pygame.font.Font(font_path, 15) text_render = font.render(text, 1, (255, 255, 255)) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: quitGame() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: next_pos = game_interface.player.move('left', is_test=True) if game_interface.game_map.isValidPos(*next_pos): game_interface.player.move('left') else: box = game_interface.game_map.getBox(*next_pos) if box: next_pos = box.move('left', is_test=True) if game_interface.game_map.isValidPos(*next_pos): game_interface.player.move('left') box.move('left') break if event.key == pygame.K_RIGHT: next_pos = game_interface.player.move('right', is_test=True) if game_interface.game_map.isValidPos(*next_pos): game_interface.player.move('right') else: box = game_interface.game_map.getBox(*next_pos) if box: next_pos = box.move('right', is_test=True) if game_interface.game_map.isValidPos(*next_pos): game_interface.player.move('right') box.move('right') break if event.key == pygame.K_DOWN: next_pos = game_interface.player.move('down', is_test=True) if game_interface.game_map.isValidPos(*next_pos): game_interface.player.move('down') else: box = game_interface.game_map.getBox(*next_pos) if box: next_pos = box.move('down', is_test=True) if game_interface.game_map.isValidPos(*next_pos): game_interface.player.move('down') box.move('down') break if event.key == pygame.K_UP: next_pos = game_interface.player.move('up', is_test=True) if game_interface.game_map.isValidPos(*next_pos): game_interface.player.move('up') else: box = game_interface.game_map.getBox(*next_pos) if box: next_pos = box.move('up', is_test=True) if game_interface.game_map.isValidPos(*next_pos): game_interface.player.move('up') box.move('up') break if event.key == pygame.K_r: game_interface.initGame() game_interface.loadLevel(game_level) game_interface.draw(game_interface.player, game_interface.game_map) if game_interface.game_map.levelCompleted(): return screen.blit(text_render, (5, 5)) pygame.display.flip() clock.tick(100)