So I'm writing a side scrolling platformer and I ran into one issue, the main character should be able to attack when I press the space bar. I have the sprite sheets for the running animation as well as the attack animation however, when I press the space bar nothing happens. Do I need to have all the sprites on one sheet or can I switch between different sprite sheets ?
Here is the code:
main.py
import pygame
import os
import sys
import final.constants as constants
import final.levels as levels
from final.player import *
def main():
    pygame.init()
    size = [constants.SCREEN_WIDTH, constants.SCREEN_HEIGHT]
    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("The Way of Vikings")
    player = Player()
    level_list = []
    level_list.append(levels.Level_01(player))
    level_list.append(levels.Level_02(player))
    # set current level
    current_level_no = 0
    current_level = level_list[current_level_no]
    active_sprite_list = pygame.sprite.Group()
    player.level = current_level
    player.rect.x = 100
    player.rect.y = constants.SCREEN_HEIGHT - player.rect.height
    active_sprite_list.add(player)
    done = False
    clock = pygame.time.Clock()
    # ---- main game loop ----
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    player.attack()
                if event.key == pygame.K_LEFT:
                    player.go_left()
                if event.key == pygame.K_RIGHT:
                    player.go_right()
                if event.key == pygame.K_UP:
                    player.jump()
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT and player.change_x < 0:
                    player.stop()
                if event.key == pygame.K_RIGHT and player.change_x > 0:
                    player.stop()
        active_sprite_list.update()
        current_level.update()
         # If the player gets near the right side, shift the world left (-x)
        if player.rect.x >= 500:
            diff = player.rect.x - 500
            player.rect.x = 500
            current_level.shift_world(-diff)
        # If the player gets near the left side, shift the world right (+x)
        if player.rect.x <= 120:
            diff = 120 - player.rect.x
            player.rect.x = 120
            current_level.shift_world(diff)
        # If the player gets to the end of the level, go to the next level
        current_position = player.rect.x + current_level.world_shift
        if current_position < current_level.level_limit:
            player.rect.x = 120
            if current_level_no < len(level_list)-1:
                current_level_no += 1
                current_level = level_list[current_level_no]
                player.level = current_level
   # ALL CODE TO DRAW SHOULD GO BELOW THIS COMMENT
        current_level.draw(screen)
        active_sprite_list.draw(screen)
        # ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT
        # Limit to 60 frames per second
        clock.tick(30)
        # Go ahead and update the screen with what we've drawn.
        pygame.display.flip()
    # Be IDLE friendly. If you forget this line, the program will 'hang'
    # on exit.
    pygame.quit()
if __name__ == "__main__":
    main()
player.py
import pygame
import final.constants as constants
from final.spriteSheet import SpriteSheet
import os
class Player(pygame.sprite.Sprite):
    """ This class represents the bar at the bottom that the player
    controls. """
    # -- Attributes
    # Set speed vector of player
    change_x = 0
    change_y = 0
    # holds frames for idle animation when player is still
    idle_frames_l = []
    idle_frames_r = []
    # This holds all the images for the animated walk left/right
    # of our player
    running_frames_l = []
    running_frames_r = []
    # holds images for attack animation when player attacks
    attack_frames_l = []
    attack_frames_r = []
    # What direction is the player facing?
    direction = "R"
    attacking = "N"
    # List of sprites we can bump against
    level = None
    # -- Methods
    def __init__(self):
        """ Constructor function """
        # Call the parent's constructor
        pygame.sprite.Sprite.__init__(self)
        dir = os.path.dirname(__file__)
        idle = os.path.join(dir, "images/idleSprite.png")
        sprite_sheet = SpriteSheet(idle)
        # Load all the right facing images into a list
        image = sprite_sheet.get_image(0, 0, 190, 132)
        self.idle_frames_r.append(image)
        image = sprite_sheet.get_image(0,0, 190,132)
        image = pygame.transform.flip(image, True, False)
        self.idle_frames_l.append(image)
        run = os.path.join(dir, "images/runSheet.png")
        sprite_sheet = SpriteSheet(run)
        image = sprite_sheet.get_image(0,0, 200,147)
        self.running_frames_r.append(image)
        image = sprite_sheet.get_image(201,0, 200,147)
        self.running_frames_r.append(image)
        image = sprite_sheet.get_image(0,148, 200,147)
        self.running_frames_r.append(image)
        image = sprite_sheet.get_image(0,296, 200,147)
        self.running_frames_r.append(image)
        image = sprite_sheet.get_image(201,148, 200,147)
        self.running_frames_r.append(image)
        image = sprite_sheet.get_image(201,296, 200,147)
        self.running_frames_r.append(image)
        image = sprite_sheet.get_image(402,0, 200,147)
        self.running_frames_r.append(image)
        image = sprite_sheet.get_image(402,148, 200,147)
        self.running_frames_r.append(image)
        image = sprite_sheet.get_image(402,296, 200,147)
        self.running_frames_r.append(image)
        image = sprite_sheet.get_image(0,444, 200,147)
        self.running_frames_r.append(image)
        image = sprite_sheet.get_image(201,444, 200,147)
        self.running_frames_r.append(image)
        image = sprite_sheet.get_image(402, 444, 200,147)
        self.running_frames_r.append(image)
        image = sprite_sheet.get_image(0,0, 200,147)
        image = pygame.transform.flip(image, True, False)
        self.running_frames_l.append(image)
        image = sprite_sheet.get_image(201,0, 200,147)
        image = pygame.transform.flip(image, True, False)
        self.running_frames_l.append(image)
        image = sprite_sheet.get_image(0,148, 200,147)
        image = pygame.transform.flip(image, True, False)
        self.running_frames_l.append(image)
        image = sprite_sheet.get_image(0,296, 200,147)
        image = pygame.transform.flip(image, True, False)
        self.running_frames_l.append(image)
        image = sprite_sheet.get_image(201,148, 200,147)
        image = pygame.transform.flip(image, True, False)
        self.running_frames_l.append(image)
        image = sprite_sheet.get_image(201,296, 200,147)
        image = pygame.transform.flip(image, True, False)
        self.running_frames_l.append(image)
        image = sprite_sheet.get_image(402,0, 200,147)
        image = pygame.transform.flip(image, True, False)
        self.running_frames_l.append(image)
        image = sprite_sheet.get_image(402,148, 200,147)
        image = pygame.transform.flip(image, True, False)
        self.running_frames_l.append(image)
        image = sprite_sheet.get_image(402,296, 200,147)
        image = pygame.transform.flip(image, True, False)
        self.running_frames_l.append(image)
        image = sprite_sheet.get_image(0,444, 200,147)
        image = pygame.transform.flip(image, True, False)
        self.running_frames_l.append(image)
        image = sprite_sheet.get_image(201,444, 200,147)
        image = pygame.transform.flip(image, True, False)
        self.running_frames_l.append(image)
        image = sprite_sheet.get_image(402, 444, 200,147)
        image = pygame.transform.flip(image, True, False)
        self.running_frames_l.append(image)
        attackSheet = os.path.join(dir, "images/attackSheet.png")
        sprite_sheet = SpriteSheet(attackSheet)
        image = sprite_sheet.get_image(0,0, 200, 147)
        self.attack_frames_r.append(image)
        image = sprite_sheet.get_image(201,0, 200, 147)
        self.attack_frames_r.append(image)
        image = sprite_sheet.get_image(0,148, 200, 147)
        self.attack_frames_r.append(image)
        image = sprite_sheet.get_image(0,296, 200, 147)
        self.attack_frames_r.append(image)
        image = sprite_sheet.get_image(201,148, 200, 147)
        self.attack_frames_r.append(image)
        image = sprite_sheet.get_image(201, 296, 200, 147)
        self.attack_frames_r.append(image)
        image = sprite_sheet.get_image(402, 0, 200, 147)
        self.attack_frames_r.append(image)
        image = sprite_sheet.get_image(402,148, 200, 147)
        self.attack_frames_r.append(image)
        image = sprite_sheet.get_image(603,0, 200, 147)
        self.attack_frames_r.append(image)
        image = sprite_sheet.get_image(402,296, 200, 147)
        self.attack_frames_r.append(image)
        image = sprite_sheet.get_image(603,148, 200, 147)
        self.attack_frames_r.append(image)
        image = sprite_sheet.get_image(804,0, 200, 147)
        self.attack_frames_r.append(image)
        # Set the image the player starts with
        self.image = self.idle_frames_r[0]
        # Set a reference to the image rect.
        self.rect = self.image.get_rect()
        f = 0
    def update(self):
        """ Move the player. """
        # Gravity
        self.calc_grav()
        # Move left/right
        self.rect.x += self.change_x
        pos = self.rect.x + self.level.world_shift
        if self.attacking == "Y":
            frame = (pos // 30) % len(self.attack_frames_r)
            self.image = self.attack_frames_r[frame]
        if self.direction == "R":
            frame = (pos // 30) % len(self.running_frames_r)
            #print(frame)
            self.image = self.attack_frames_r[frame]
        else:
            frame = (pos // 30) % len(self.running_frames_l)
            self.image = self.running_frames_l[frame]
        # Move up/down
        self.rect.y += self.change_y
    def calc_grav(self):
        """ Calculate effect of gravity. """
        if self.change_y == 0:
            self.change_y = 1
        else:
            self.change_y += .35
        # See if we are on the ground.
        if self.rect.y >= constants.SCREEN_HEIGHT - self.rect.height and self.change_y >= 0:
            self.change_y = 0
            self.rect.y = constants.SCREEN_HEIGHT - self.rect.height
    def jump(self):
        """ Called when user hits 'jump' button. """
        # move down a bit and see if there is a platform below us.
        # Move down 2 pixels because it doesn't work well if we only move down 1
        # when working with a platform moving down.
        self.rect.y += 2
        platform_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)
        self.rect.y -= 2
        # If it is ok to jump, set our speed upwards
        if len(platform_hit_list) > 0 or self.rect.bottom >= constants.SCREEN_HEIGHT:
            self.change_y = -10
    # Player-controlled movement:
    def go_left(self):
        """ Called when the user hits the left arrow. """
        self.change_x = -6
        self.direction = "L"
    def go_right(self):
        """ Called when the user hits the right arrow. """
        self.change_x = 6
        self.direction = "R"
    def stop(self):
        """ Called when the user lets off the keyboard. """
        self.change_x = 0
        self.attacking = "N"
    def attack(self):
        self.attacking = "Y"