class Ship: def __init__(self, setting: settings): self.velocity = pygame.Vector2(0, 0) self.sprite_sheet = spriteSheet(setting.ship_filename, 5, 4) self.position = Vector2( setting.screen_width / 2 - self.sprite_sheet.cell_width / 2, setting.screen_height - self.sprite_sheet.cell_height) self.rect = pygame.Rect(self.position.x, self.position.y, self.sprite_sheet.cell_width, self.sprite_sheet.cell_height) self.ship_speed = setting.ship_speed self.life = setting.ship_life self.setting = setting self.gun = Gun(setting) self.moving_right = False self.moving_left = False self.score = score(0, Vector2()) pygame.font.init() self.font = pygame.font.SysFont('Comic Sans', 24, True) def draw(self, surface, frame): # pygame.draw.rect(surface, Color('#ff0000'), self.rect) for bullet in self.gun.bullet_list: bullet.draw(surface) self.sprite_sheet.draw(surface, ((frame % 4) * 5), self.position.x, self.position.y) self.score.draw(surface, self.setting) def draw_score(self, surface): title = self.font.render("SCORE", False, Color('#000000')) surface.blit(title, (self.setting.screen_width - 64, 0)) def move(self): if self.moving_right and self.rect.right < self.setting.screen_width: self.position.x += self.ship_speed if self.moving_left and self.rect.left > 0: self.position.x -= self.ship_speed self.rect.x = self.position.x for bullet in self.gun.bullet_list: bullet.move() self.gun.out_of_bound() def draw_life(self, surface, frame): for i in range(self.life): self.sprite_sheet.draw(surface, ((frame % 4) * 5), 64 * i, 0) def shoot(self): self.gun.shoot(self.setting, Vector2(self.rect.centerx, self.rect.top), 'up') def draw_death(self, surface, frame): row = ((frame % 3) * 5) for i in range(1, 5): print(row + i) self.sprite_sheet.draw(surface, row + i, self.sprite_sheet.cell_width, self.sprite_sheet.cell_height) time.sleep(0.1) def check_alive(self): if self.life == 0: return True return False
class Fleet: def __init__(self, setting: settings, shoot_sound): self.shoot_sound = shoot_sound self.fleet = list() self.move_speed = setting.alien_speed self.creep_speed = setting.creep_speed self.gun = Gun(setting) self.setting = setting self.saucer = Saucer(setting, Vector2(-64, 64 * 2)) for i in range(10): self.fleet.append(Squid(setting, pygame.Vector2(70 * i, 70))) for i in range(10): self.fleet.append(Squid(setting, pygame.Vector2(70 * i, 70 * 2))) for i in range(10): self.fleet.append(Jelly(setting, pygame.Vector2(70 * i, 70 * 3))) for i in range(10): self.fleet.append(Jelly(setting, pygame.Vector2(70 * i, 70 * 4))) for i in range(10): self.fleet.append(Crab(setting, pygame.Vector2(70 * i, 70 * 5))) for i in range(10): self.fleet.append(Crab(setting, pygame.Vector2(70 * i, 70 * 6))) def draw(self, surface, frame): for alien in self.fleet: alien.draw(surface, frame) self.gun.draw(surface) if self.saucer.spawned and not self.saucer.despawned: self.saucer.draw(surface, frame) def move(self): for alien in self.fleet: alien.move(self.move_speed) if check_shoot(): self.shoot_sound.play() self.gun.shoot( self.setting, Vector2( alien.position.x + alien.sprite_sheet.cell_width / 2, alien.position.y + alien.sprite_sheet.cell_height), 'down') for bullet in self.gun.bullet_list: bullet.move() self.gun.out_of_bound() if self.saucer.spawned and not self.saucer.despawned: self.saucer.move() else: self.saucer.start_move() def creep(self): for alien in self.fleet: alien.creep(self.creep_speed) def out_of_bound(self, setting: settings): hit = False for alien in self.fleet: if alien.rect.left < 0: hit = True if alien.rect.right > setting.screen_width: hit = True if hit: self.move_speed = self.move_speed * -1 self.creep() def speedup(self): self.move_speed *= self.setting.speedup_scale