动画使用不同的精灵表pygame

时间:2016-05-31 05:17:22

标签: python animation pygame

所以我正在写一个侧面滚动平台游戏,我遇到了一个问题,当我按下空格键时,主角应该能够攻击。我有运行动画的精灵表以及攻击动画但是,当我按空格键时没有任何反应。我是否需要将所有精灵放在一张纸上,还是可以在不同的精灵表之间切换?

以下是代码:

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"

0 个答案:

没有答案
相关问题