import os.path import pygame from pygame.sprite import Sprite from game_stats import GameStats from settings import Settings class Alien(Sprite): """A class to represent a single alien in a fleet.""" def __init__(self, ai_settings: Settings, screen: pygame.SurfaceType, image_name='images/alien1.png'): """Initialize the alien and set its starting position.""" super().__init__() self.screen = screen self.ai_settings = ai_settings self.screen_rect = screen.get_rect() # Load the alien image and set its rect attribute. fullname = os.path.join('.', image_name) try: self.image = pygame.image.load(fullname) except pygame.error: print('Cannot load image:', image_name) raise SystemExit self.image = pygame.transform.scale(self.image, ai_settings.alien_size) 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 self.x = float(self.rect.x) self.y = float(self.rect.y) self.drop_dist = self.y + self.ai_settings.alien_drop_dist def blitme(self): """Draw the alien at its current position.""" self.screen.blit(self.image, self.rect) def update(self, stats: GameStats): """Move the alien.""" self.x += self.ai_settings.alien_speed_factor_x * self.ai_settings.alien_direction_x * stats.time_passed self.rect.x = self.x if self.y > self.drop_dist: self.drop_dist += self.ai_settings.alien_drop_dist self.y += self.ai_settings.alien_speed_factor_y * self.ai_settings.alien_direction_y * stats.time_passed self.rect.y = self.y def check_edges(self, edge='both'): """Returns True if alien is at edge of screen.""" left_edge = self.rect.left <= self.screen_rect.left right_edge = self.rect.right >= self.screen_rect.right if edge == 'left': return left_edge elif edge == 'right': return right_edge else: return left_edge or right_edge