Example #1
0
class SpinningBase(State):
    """State 2: Spins in place for a period of time. In the original game the
    base should continue to move as in MovingBase, but currently it becomes
    stationary for simplicity reasons.
    
    SpinningBase should not be followable by the shield.
    
    Note:SpinningBase.sprite is an AnimatedFacingSprite that only faces NORTH
    """
    def __init__(self, manager, position, target, sprite_sheet, height, width,
                 delay, targ_time, shoot_time):
        """manager is the root EnemyBase object
        position is the sprite's rect.center coordinates (taken from the moving state)
        sprite_sheet, etc are AnimatedFacingSprite args
        
        targ_time is the frame (from start) when target direction is taken
        shoot_time is the frame (from start) when spinner becomes shooter and begins movement
        """

        State.__init__(self, manager)

        self.sprite = AnimatedFacingSprite(sprite_sheet, height, width, delay,
                                           0)
        self.sprite.rect.center = position

        self.target = target

        self.targ_time = targ_time
        self.shoot_time = shoot_time
        self.tick = 0

        self.STATE_NUMBER = manager.SPINNING
        self.IS_FOLLOWABLE = False

    def update(self):
        self.sprite.update()

        self.tick += 1

        if self.tick == self.targ_time:
            self.target_direction = vector.normalize(
                vector.get_direction(self.sprite.rect.center,
                                     self.target.rect.center))
        if self.tick == self.shoot_time:
            self.transition_to(self.manager.SHOOTING)

    def transition_to(self, new_state_number):
        if new_state_number == self.manager.SHOOTING:
            self.manager.start_shooter(self.sprite.rect.center,
                                       self.target_direction)

        return False
Example #2
0
class SpinningBase(State):
    """State 2: Spins in place for a period of time. In the original game the
    base should continue to move as in MovingBase, but currently it becomes
    stationary for simplicity reasons.
    
    SpinningBase should not be followable by the shield.
    
    Note:SpinningBase.sprite is an AnimatedFacingSprite that only faces NORTH
    """
    
    def __init__(self, manager, position, target, sprite_sheet, height, width, delay,
                targ_time, shoot_time):
        """manager is the root EnemyBase object
        position is the sprite's rect.center coordinates (taken from the moving state)
        sprite_sheet, etc are AnimatedFacingSprite args
        
        targ_time is the frame (from start) when target direction is taken
        shoot_time is the frame (from start) when spinner becomes shooter and begins movement
        """
        
        State.__init__(self, manager)

        self.sprite = AnimatedFacingSprite(sprite_sheet, height, width, delay, 0)
        self.sprite.rect.center = position

        self.target = target
        
        self.targ_time = targ_time
        self.shoot_time = shoot_time
        self.tick = 0
        
        self.STATE_NUMBER = manager.SPINNING
        self.IS_FOLLOWABLE = False
        
        
    def update(self):
        self.sprite.update()
        
        self.tick += 1
        
        if self.tick == self.targ_time:
            self.target_direction = vector.normalize(vector.get_direction(self.sprite.rect.center, self.target.rect.center))
        if self.tick == self.shoot_time:
            self.transition_to(self.manager.SHOOTING)


    def transition_to(self, new_state_number):
        if new_state_number == self.manager.SHOOTING:
            self.manager.start_shooter(self.sprite.rect.center, self.target_direction)

        return False
Example #3
0
class ShootingBase(State):
    """State 3: Moves ("shoots") in the given direction until offscreen.
    
    ShootingBase should not be followable by the shield.
    
    Note:ShootingBase.sprite is an AnimatedFacingSprite that only faces NORTH
    """
    
    def __init__(self, manager, position, direction, sprite_sheet, height, width, delay, speed):
        """manager is the base EnemyBase object
        position is the rect.center coordinates (taken from the spinning state)
        direction is a vector
        """
        
        State.__init__(self, manager)

        self.sprite = AnimatedFacingSprite(sprite_sheet, height, width, delay, speed)
        self.sprite.rect.center = position

        self.direction = direction
        
        self.STATE_NUMBER = manager.SHOOTING
        self.IS_FOLLOWABLE = False
        
        
    def update(self):
        self.sprite.update()
        ASprite.move(self.sprite, self.direction)

        rect = self.sprite.rect
        
        if rect.left <= 0 or rect.top <= 0 or rect.bottom >= options.height:
            self.transition_to(self.manager.MOVING)


    def transition_to(self, new_state_number):
        if new_state_number == self.manager.MOVING:
            self.manager.resume_mover_state()
            return True

        if new_state_number == self.manager.SPINNING:
            self.manager.start_spinner(self.sprite.rect.center)

        return False
Example #4
0
class ShootingBase(State):
    """State 3: Moves ("shoots") in the given direction until offscreen.
    
    ShootingBase should not be followable by the shield.
    
    Note:ShootingBase.sprite is an AnimatedFacingSprite that only faces NORTH
    """
    def __init__(self, manager, position, direction, sprite_sheet, height,
                 width, delay, speed):
        """manager is the base EnemyBase object
        position is the rect.center coordinates (taken from the spinning state)
        direction is a vector
        """

        State.__init__(self, manager)

        self.sprite = AnimatedFacingSprite(sprite_sheet, height, width, delay,
                                           speed)
        self.sprite.rect.center = position

        self.direction = direction

        self.STATE_NUMBER = manager.SHOOTING
        self.IS_FOLLOWABLE = False

    def update(self):
        self.sprite.update()
        ASprite.move(self.sprite, self.direction)

        rect = self.sprite.rect

        if rect.left <= 0 or rect.top <= 0 or rect.bottom >= options.height:
            self.transition_to(self.manager.MOVING)

    def transition_to(self, new_state_number):
        if new_state_number == self.manager.MOVING:
            self.manager.resume_mover_state()
            return True

        if new_state_number == self.manager.SPINNING:
            self.manager.start_spinner(self.sprite.rect.center)

        return False