def main(): """ Main Program """ # Call this function so the Pygame library can initialize itself pygame.init() # Create a 500x500 sized screen screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.RESIZABLE) pygame.display.set_caption("my-py-game") # Create the player paddle object player = Player(64, 64) # List of moving sprites moving_sprites = pygame.sprite.Group() moving_sprites.add(player) # List of all sprites all_sprites_list = pygame.sprite.Group() # List of all bullets bullet_list = pygame.sprite.Group() level_changed = True current_level_x = 0 current_level_y = 0 font = pygame.font.Font(None, 30) clock = pygame.time.Clock() done = False while not done: # --- Event Processing --- for event in pygame.event.get(): if event.type == pygame.QUIT: done = True # if event.type == pygame.VIDEORESIZE: # old_screen_saved = screen # screen = pygame.display.set_mode((event.w, event.h), # pygame.RESIZABLE) # # On the next line, if only part of the window # # needs to be copied, there's some other options. # screen.blit(old_screen_saved, (0, 0)) # del old_screen_saved if event.type == pygame.MOUSEBUTTONDOWN: # Fire a bullet if the user clicks the mouse button # Get the mouse position pos = pygame.mouse.get_pos() mouse_x = pos[0] mouse_y = pos[1] # Create the bullet based on where we are, and where we want to go. bullet = Bullet(player.rect.centerx, player.rect.centery, mouse_x, mouse_y) # Add the bullet to the lists all_sprites_list.add(bullet) bullet_list.add(bullet) moving_sprites.add(bullet) if event.type == pygame.KEYDOWN: if event.key == pygame.K_a: player.changespeed(-PLAYER_SPEED, 0) player.set_direction('left') if event.key == pygame.K_d: player.changespeed(PLAYER_SPEED, 0) player.set_direction('right') if event.key == pygame.K_w: player.changespeed(0, -PLAYER_SPEED) if event.key == pygame.K_s: player.changespeed(0, PLAYER_SPEED) if event.type == pygame.KEYUP: if event.key == pygame.K_a: player.changespeed(PLAYER_SPEED, 0) if event.key == pygame.K_d: player.changespeed(-PLAYER_SPEED, 0) if event.key == pygame.K_w: player.changespeed(0, PLAYER_SPEED) if event.key == pygame.K_s: player.changespeed(0, -PLAYER_SPEED) # --- Game Logic --- if level_changed: if current_level_x == 0 and current_level_y == 0: # print('Entering level 1') current_level = Level(1) else: # print('Entering level 2') current_level = Level(2) current_level.draw_bg_tiles(screen) current_level.draw_walls(screen) pygame.display.flip() level_changed = False # Dirty rects are all the rects that need to be updated at the end of this frame dirty_rects = [] # get tiles intersecting player bg_to_draw = [] for bg_tile in current_level.bg_tiles: if bg_tile.rect.colliderect(player.rect): bg_to_draw.append(bg_tile) for bullet in bullet_list: if bg_tile.rect.colliderect(bullet.rect): bg_to_draw.append(bg_tile) # add those tiles to dirty rects dirty_rects.extend([bg_tile.rect for bg_tile in bg_to_draw]) dirty_rects.append(player.rect) player.move(current_level.wall_tiles) # Changing between levels if player.rect.y < -TILE_WIDTH / 2 and current_level_y == 0: level_changed = True current_level_y += 1 player.rect.y = SCREEN_HEIGHT - TILE_WIDTH / 2 - 1 if player.rect.y > SCREEN_HEIGHT - TILE_WIDTH / 2 and current_level_y > 0: level_changed = True current_level_y -= 1 player.rect.y = -TILE_WIDTH / 2 + 1 for bullet in bullet_list: bullet.update(current_level.wall_tiles) # --- Drawing --- # draw walls and player for bg_tile in bg_to_draw: bg_tile.draw_to_screen(screen) for bullet in bullet_list: screen.blit(bullet.image, bullet.rect) screen.blit(player.image, player.rect) # print(dirty_rects) if SHOW_FPS: fps = font.render(str(int(clock.get_fps())), True, pygame.Color('white')) fps_bg_image = pygame.Surface([32, 32]) fps_bg_image.fill(BLACK) screen.blit(fps_bg_image, (0, 0)) screen.blit(fps, (0, 0)) dirty_rects.append(fps_bg_image.get_rect()) pygame.display.update(dirty_rects) clock.tick(60) pygame.quit()
def displayLevel(numLevel, window): """Display the level the player has selected """ print("Chargement du niveau " + str(numLevel)) loadLevel = True #While we need to reload the same level (for restart or a death for example) #We reload it while loadLevel == True: #String that will go back to main and let the program knows what to do next #Go to next level? Quit the game? action = "" #We create the object Level and load its elements level = Level(numLevel) #If it couldn't find a level in levelFile, it means the game is finished and #we display the title screen if level.csvPath is None: return "Title_Screen" else: level.loadingLevelForDisplay() #We calculate where should be the center of the game on the screen in order #to display correctly all elements gameWidth = len(level._get_grille()[0]) * 30 firstPixel = centerTheGameOnTheScreen(window.get_width(), gameWidth) #We set a new background image window.fill(pygame.Color("black")) background = pygame.image.load("resources/img/fond.jpg").convert() window.blit(background, (firstPixel, 0)) pygame.display.flip() #We place each element with their pixels position on the screen displayGrille(level, firstPixel, window) #We place the player on the table player = Player() playerPNG = pygame.image.load(player.character.skin).convert_alpha() player.positionRect = playerPNG.get_rect(x=level.start[0], y=level.start[1]) window.blit(playerPNG, (firstPixel + player.positionRect.x * 30, player.positionRect.y * 30)) pygame.display.flip() continuer = 1 #We display the level while the player hasn't finished it while continuer: #We display background and elements of the level again window.fill(pygame.Color("Black")) #We load the background image window.blit(background, (firstPixel, 0)) #We load the table of elements with their graphics displayGrille(level, firstPixel, window) #We load the player character (donkey kong) playerPNG = pygame.image.load( player.character.skin).convert_alpha() window.blit(playerPNG, (firstPixel + player.positionRect.x * 30, player.positionRect.y * 30)) #If the player walked on a scroll, we display its message level.checkPlayerOnScroll(player, window) pygame.display.flip() for event in pygame.event.get(): if event.type == QUIT: action = "Quit_the_game" loadLevel = False continuer = 0 #If the player presses a key, we check if he can move elif event.type == KEYDOWN: if event.key == K_r: continuer = 0 elif event.key == K_LEFT or event.key == K_RIGHT or event.key == K_UP or event.key == K_DOWN: #If the player will move on a cell where there is a box potentialBox = level.checkPlayerBoxes(player, event) if potentialBox is not None: box = potentialBox if box.canMove(player, level, event): player.move(level, event) else: player.move(level, event) #If the player dies, he goes back to the starting point of the current level if level.checkPlayerDies(player): continuer = 0 #If player walks on the finish line, he goes to next level if level.checkEndLevel(player): continuer = 0 loadLevel = False action = "Next_level" return action