コード例 #1
0
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()
コード例 #2
0
ファイル: displayDK.py プロジェクト: jringenbach/DK_Labyrinth
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