예제 #1
0
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
예제 #2
0
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