两个对象碰撞后,其余未碰撞的对象不会出现在屏幕上

时间:2019-04-26 15:40:43

标签: pygame python-3.6

我正在制作外星人入侵游戏。在屏幕上移动了外星人的舰队之后,我应用了碰撞属性,但是当两个对象碰撞(子弹与外星人碰撞)时,剩余的外星人不会出现在屏幕上。

settings.py文件包含代码中将使用的大多数变量。

alien.py包含外来对象的属性。

ship.py文件包含飞船属性和与其相关的功能。

bullet.py

    import pygame
    from pygame.sprite import Sprite

    class Bullet(Sprite):
        """ A class to manage bullets fired from the ship. """

        def __init__(self, ai_settings, screen, ship):
            """ Create a bullet object at the ship's current position. """
            super(Bullet, self).__init__()
            self.screen = screen 

            # Create a bullet rect at (0, 0) and then set correct position. 
            self.rect = pygame.Rect (0, 0, ai_settings.bullet_width, ai_settings.bullet_height)
            self.rect.centerx = ship.rect.centerx
            self.rect.top = ship.rect.top

            # Store the bullet's position as a decimal value.
            self.y = float(self.rect.y)

            self.color = ai_settings.bullet_color
            self.speed_factor = ai_settings.bullet_speed_factor

        def update(self):
            """ Move the bullet up the screen. """

            # Update the decimal position of the bullet
            self.y -= self.speed_factor
            # Update the rect position.
            self.rect.y = self.y


        def draw_bullet(self):
            """ Draw the bullet to the screen. """
            pygame.draw.rect(self.screen, self.color, self.rect)

ship.py

    import pygame
    class Ship():

        def __init__(self, ai_settings, screen):
            """  Initialize the ship and set it's starting position.  """
            self.screen = screen
            self.ai_settings = ai_settings

            # Load the ship and get it's rect
            self.image = pygame.image.load("images\ship.bmp" )
            self.rect = self.image.get_rect()
            self.screen_rect = screen.get_rect()

            # start each new ship at the bottom center of the screen. 
            self.rect.centerx = self.screen_rect.centerx
            self.rect.bottom = self.screen_rect.bottom

            # Store a decimal value for the ship's center.
            self.center = float(self.rect.centerx)

            # Movement flag
            self.moving_right = False
            self.moving_left = False

        def update(self):
            """ Update the ship's position based on the movement flag. """
            # Update the ship's center value, not the rect.
            if self.moving_right and self.rect.right < self.screen_rect.right:
                self.center += self.ai_settings.ship_speed_factor
            if self.moving_left and self.rect.left > 0:
                self.center -= self.ai_settings.ship_speed_factor

            # Update rect object from self.center.
            self.rect.centerx = self.center
        def blitem(self):
            """  Draw the ship at it's current location.   """
            self.screen.blit(self.image, self.rect)

alien.py

    import pygame
    from pygame.sprite import Sprite

    class Alien(Sprite):
        """ A class to represent a single alien in the fleet. """

        def __init__(self, ai_settings, screen):
            """ Initialize the alien and set its starting position. """
            super(Alien, self).__init__()
            self.screen = screen
            self.ai_settings = ai_settings

            #Load the alien image and set its rect attribute.
            self.image = pygame.image.load("images/alien.bmp")
            self.rect = self.image.get_rect()

            #Start each new alien near the top left of the screen.
            self.rect.x = self.rect.width
            self.rect.y = self.rect.height

            #Store the alien exact positioon
            self.x = float(self.rect.x)

        def blitem(self):
            """ Draw the alien at its current location. """
            self.screen.blit(self.image, self.rect)

        def update(self):
            """ Move the alien right or left. """
            self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)
            self.rect.x = self.x

        def check_edges(self):
            """ Return True if alien is at edge of screen. """
            screen_rect = self.screen.get_rect()
            if self.rect.right >= screen_rect.right:
                return True
            elif self.rect.left <= 0:
                return True

settings.py

    class Settings():
        """  A class to store all the settings of Alien Invasion.   """

        def __init__(self):
            """  Initialize the game settings.  """
            # Screen settings
            self.screen_width = 1200
            self.screen_height = 680
            self.bg_color = (230,230,230)

            # Ship settings
            self.ship_speed_factor = 1.5
            # Bullet settings
            self.bullet_speed_factor = 3
            self.bullet_width = 5
            self.bullet_height = 15
            self.bullet_color = 60, 60, 60
            self.bullets_allowed = 3

            #Alien Settins
            self.alien_speed_factor = 1
            self.fleet_drop_speed = 10
            # Fleet direction of 1 represent right ; -1 represent left
            self.fleet_direction = 1

game_functions.py

    import sys
    import pygame
    from bullet import Bullet
    from alien import Alien

    def check_keydown_events(event, ai_settings, screen, ship, bullets):
        """ Respond to keypresses."""
        if event.key == pygame.K_RIGHT:
            ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            ship.moving_left = True
        elif event.key == pygame.K_SPACE:
            fire_bullet(ai_settings, screen, ship, bullets)
        elif event.key == pygame.K_q:
                sys.exit()

    def check_keyup_events(event, ship):
        """ Respond to keyreleases. """
        if event.key == pygame.K_RIGHT:
            ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            ship.moving_left = False

    def check_events(ai_settings, screen, ship, bullets):
        """   Respond to keypresses and mouse events.   """
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                check_keydown_events(event, ai_settings, screen, ship, bullets)
            elif event.type == pygame.KEYUP:
                check_keyup_events(event, ship)

    def fire_bullet(ai_settings, screen, ship, bullets):
        """ Fire a bullet if limit not reached yet. """
        # Create a new bullet and add it to the bullets group.
        if len(bullets) < ai_settings.bullets_allowed:
            new_bullet = Bullet(ai_settings, screen, ship)
            bullets.add(new_bullet)

    def update_bullets(ai_settings, screen, ship, aliens, bullets):
        """ Update position of bullets and get rid of old bullets. """
        # Update bullet position
        bullets.update()
        # Get rid of bullets that have disappeared. 
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        # check for any bullets that have hit the alien.
        # If so, get rid of the alien and the bullet.
        check_bullet_alien_collision(ai_settings, screen, ship, aliens, bullets)

    def check_bullet_alien_collision(ai_settings, screen, ship, aliens, bullets):
        """ Respond to bullet alien collision. """
        # Remove any bullets and aliens that have collided.
        collision = pygame.sprite.groupcollide(bullets, aliens, True, True)
        if len(aliens) == 0:
            print("something bad")
            # Destroy existing bullets and create new fleet.
            bullets.empty()
            create_fleet(ai_settings, screen, ship, aliens)


    def update_screen(ai_settings, screen, ship, aliens, bullets):
        """  Update images on the screen and flip to the new screen.  """
        # Redraw the screen during the each pass through the loop.
        screen.fill(ai_settings.bg_color)
        # Redraw all bullets behind ship and aliens.
        for bullet in bullets.sprites():
            bullet.draw_bullet()
        ship.blitem()
        aliens.draw(screen)
        # Make the most recently drawn screen visible.
        pygame.display.flip()


    def get_number_aliens_x(ai_settings, alien_width):
        """ Determine the number of aliens that fit in a row. """
        available_space_x = ai_settings.screen_width - (2 * alien_width)
        number_aliens_x = int(available_space_x / (2 * alien_width))
        return number_aliens_x

    def get_number_rows(ai_settings, ship_height, alien_height):
        """ Determine the number of rows of aliens that fit on the screen. """
        available_space_y = (ai_settings.screen_height - (3 * alien_height) - ship_height)
        number_rows = int(available_space_y / (2 * alien_height))
        return number_rows 


    def create_alien(ai_settings, screen, aliens, alien_number, row_number):
        """ Create an alien and place it in the row. """
        alien = Alien(ai_settings, screen)
        alien_width = alien.rect.width
        alien.x = alien_width + (2 * alien_width * alien_number)
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + (2 * alien.rect.height * row_number)
        aliens.add(alien)

    def create_fleet(ai_settings, screen, ship, aliens):
        """ Create a full fleet of aliens. """
        #Create an alien and find the number of aliens in a row.
        alien = Alien(ai_settings, screen)
        number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)
        number_rows = get_number_rows(ai_settings, ship.rect.height, alien.rect.height)
        # Create the fleet of aliens
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                # Create an alien and place it in the row.
                create_alien(ai_settings, screen, aliens, alien_number, row_number)

    def update_aliens(ai_settings, aliens):
        """ Check if the fleet is at an edge,
            and then update the position of all aliens in the fleet."""
        check_fleet_edges(ai_settings, aliens)
        aliens.update()

    def check_fleet_edges(ai_settings, aliens):
        """ Respond appropriately if any alien have reached an edge. """
        for alien in aliens.sprites():
            if alien.check_edges():
                change_fleet_direction(ai_settings, aliens)
                break

    def change_fleet_direction(ai_settings, aliens):
        """ Drop the entire fleet and change the fleet's direction. """
        for alien in aliens.sprites():
            alien.rect.y += ai_settings.fleet_drop_speed
            ai_settings.fleet_direction *= -1

alien_invasion.py

    import pygame
    from pygame.sprite import Group
    from settings import Settings
    from ship import Ship
    import game_functions as gf


    def run_game():
        # Initialize pygame, settings and screen objects.
        pygame.init()
        ai_settings = Settings()
        screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
        pygame.display.set_caption("Alien Invasion")
        # Make a ship, a group of bullets, and a group of aliens.
        ship = Ship(ai_settings, screen)
        bullets = Group()
        aliens = Group()
        #Create the fleet of aliens.
        gf.create_fleet(ai_settings, screen, ship, aliens)
        # Start the main loop for the game.
        while True:
            # Watch for keyboard and mouse events.
            gf.check_events(ai_settings, screen, ship, bullets)
            ship.update()
            collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
            gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
            gf.update_aliens(ai_settings, aliens)
            gf.update_screen(ai_settings, screen, ship, aliens, bullets)

    run_game()

0 个答案:

没有答案