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"