为什么我的sprite翻转代码在python中工作?

时间:2014-06-18 00:02:40

标签: python sprite

请帮助我这段代码不能正常工作,我已经失去了人们的睡眠之夜:(我希望我的精灵翻转,我明白我有所有的代码在这里做,但是有什么东西阻止它?

import pygame



# Colours
black=(0,0,0)
white=(255,255,255)
blue=(0,0,255)
green=(0,255,0)
red=(255,0,0)
purple=( 97,0,160)
lightgrey=(173,173,173)
grey=(87,83,85)
bronze=(201,106,75)
rock=(219,79,3)
steel=(220,229,221)
ice=(198,231,249)
giygas=(128,0,16)


class Wall(pygame.sprite.Sprite):
    """This class represents the bar at the bottom that the player controls """

    def __init__(self, x, y, width, height, color):
        """ Constructor function """

        # Call the parent's constructor
        pygame.sprite.Sprite.__init__(self)

        # Create a wall, of the size specified in the parameters
        self.image = pygame.Surface([width, height])
        self.image.fill(color)

        # Make our top-left corner the passed-in location.
        self.rect = self.image.get_rect()
        self.rect.y = y
        self.rect.x = x

class SpriteSheet(object):
    """ Class used to grab images out of a sprite sheet. """
    # This points to our sprite sheet image
    sprite_sheet = None

    def __init__(self, filename):
        """ Constructor. Pass in the file name of the sprite sheet. """

        # Load the sprite sheet.
        self.sprite_sheet = pygame.image.load(filename).convert_alpha()    # Set speed vector



    def get_image(self, x, y, width, height):
        """ Grab a single image out of a larger spritesheet
            Pass in the x, y location of the sprite
            and the width and height of the sprite. """

        # Create a new blank image
        image = pygame.Surface([width, height]).convert()
        image.fill(white)
        image.set_colorkey(white)

        # Copy the sprite from the large sheet onto the smaller image
        image.blit(self.sprite_sheet, (0, 0), (x, y, width, height))     

        # Return the image
        return image
class Player(pygame.sprite.Sprite):

    change_x = 0
    change_y = 0
    sword_x = "off"
    sword_y = "off"
    shield_x = "off"
    shield_y = "off"

    toasterwalking_frames_l = []
    toasterwalking_frames_r = []
    #This holds all the images for the animated walk up/down
    #of our player
    toasterwalking_frames_u = []
    toasterwalking_frames_d = []

    # This holds all the images for the buttery coating walk left/right
    #of our player
    buttertoasterwalking_frames_l = []
    buttertoasterwalking_frames_r = []

    # This holds all the images for the buttery coating walk up/down
    buttertoasterwalking_frames_u = []
    buttertoasterwalking_frames_d = []
    def __init__(self):
        """ Constructor function """


        # Call the parent's constructor
        pygame.sprite.Sprite.__init__(self)


        '''sides'''
        sprite_sheet = SpriteSheet("toasterwalksprite.png")
        # Load all the right facing images into a list
        image = sprite_sheet.get_image(0, 0, 13, 20)
        self.toasterwalking_frames_r.append(image)
        image = sprite_sheet.get_image(14, 0, 13, 20)
        self.toasterwalking_frames_r.append(image)



        # Load all the right facing images, then flip them
        # to face left.
        image = sprite_sheet.get_image(0, 0, 13, 20)
        image = pygame.transform.flip(image, True, False)
        self.toasterwalking_frames_l.append(image)
        image = sprite_sheet.get_image(14, 0, 13, 20)
        image = pygame.transform.flip(image, True, False)
        self.toasterwalking_frames_l.append(image)


        '''down'''
        sprite_sheet = SpriteSheet("toasterwalksprite.png")
        # Load all the right facing images into a list
        image = sprite_sheet.get_image(0, 20, 13, 19)
        self.toasterwalking_frames_d.append(image)

        #Load all the down facing images, then flip them
        #to face other way.
        image = sprite_sheet.get_image(0, 20, 13, 19)
        image = pygame.transform.flip(image, True, False)
        self.toasterwalking_frames_d.append(image)

        '''up'''
        sprite_sheet = SpriteSheet("toasterwalksprite.png")
        # Load all the right facing images into a list
        image = sprite_sheet
        image = sprite_sheet.get_image(14, 19, 13, 21)
        self.toasterwalking_frames_u.append(image)

        #Load all the down facing images, then flip them
        #to face other way.
        image = sprite_sheet.get_image(14, 19, 13, 21)
        image = pygame.transform.flip(image, True, False)
        self.toasterwalking_frames_u.append(image)

        self.image = self.toasterwalking_frames_r[0]


        # Set a referance to the image rect.
        self.rect = self.image.get_rect()




    def update(self):
        """ Move the player. """

        # Move left/right/up/down
        self.rect.x += self.change_x
        pos = self.rect.x + self.level.world_shift
        if self.direction == "R":
            frame = (pos // 30) % len(self.toasterwalking_frames_r)
            self.image = self.toasterwalking_frames_r[frame]
        else:
            frame = (pos // 30) % len(self.toasterwalking_frames_l)
            self.image = self.toasterwalking_frames_l[frame]

        self.rect.y += self.change_y
        pos = self.rect.y + self.level.world_shift
        if self.direction == "U":
            frame = (pos // 30) % len(self.toasterwalking_frames_u)
            self.image = self.toasterwalking_frames_u[frame]

        self.rect.y += self.change_y
        pos = self.rect.y + self.level.world_shift
        if self.direction == "D":
            frame = (pos // 30) % len(self.toasterwalking_frames_d)
            self.image = self.toasterwalking_frames_d[frame]


    # Player-controlled movement:
    def go_left(self):
        """ Called when the user hits the left arrow. """
        self.change_x = -2
        self.direction = "L"

    def go_right(self):
        """ Called when the user hits the right arrow. """
        self.change_x = 2
        self.direction = "R"

    def go_down(self):
        """ Called when the user hits the left arrow. """
        self.change_y = 1
        self.direction = "D"

    def go_up(self):
        """ Called when the user hits the right arrow. """
        self.change_y = -1
        self.direction = "U"

    def stop(self):
        """ Called when the user lets off the keyboard. """
        self.change_x = 0
        self.change_y = 0
        self.sword_x = "off"
        self.sword_y = "off"


    def changespeed(self, x, y):
        """ Change the speed of the player. Called with a keypress. """
        self.change_x += x
        self.change_y += y

    def move(self, walls):
        """ Find a new position for the player """

        # Move left/right
        self.rect.x += self.change_x

        # Collision detection
        # Did this update cause us to hit a wall?
        block_hit_list = pygame.sprite.spritecollide(self, walls, False)
        for block in block_hit_list:
            # If we are moving right, set our right side to the left side of
            # the item we hit
            if self.change_x > 0:
                self.rect.right = block.rect.left
            else:
                # Otherwise if we are moving left, do the opposite.
                self.rect.left = block.rect.right
            #music = pygame.mixer.Sound("RSE Bump.wav")
            #music.play()

        # Move up/down
        self.rect.y += self.change_y

        pos = self.rect.y 
        if self.direction == "U":
            frame = (pos // 30) % len(self.toasterwalking_frames_u)
            self.image = self.toasterwalking_frames_u[frame]

        self.rect.y += self.change_y
        pos = self.rect.y 
        if self.direction == "D":
            frame = (pos // 30) % len(self.toasterwalking_frames_d)
            self.image = self.toasterwalking_frames_d[frame]

        # Check and see if we hit anything
        block_hit_list = pygame.sprite.spritecollide(self, walls, False)
        for block in block_hit_list:

            # Reset our position based on the top/bottom of the object.
            if self.change_y > 0:
                self.rect.bottom = block.rect.top
            else:
                self.rect.top = block.rect.bottom

            #music = pygame.mixer.Sound("RSE Bump.wav")
            #music.play()

'''___________________Walls+Rooms_____________________'''                

class Room(object):
    """ Base class for all rooms. """

    """ Each room has a list of walls, and of enemy sprites. """
    wall_list = None
    enemy_sprites = None

    def __init__(self):
        """ Constructor, create our lists. """
        self.wall_list = pygame.sprite.Group()
        self.enemy_sprites = pygame.sprite.Group()
#Room 1 
class Room1(Room):
    """This creates all the walls in room 1"""
    def __init__(self):
        Room.__init__(self)
        # Make the walls. (x_pos, y_pos, width, height)

        # This is a list of walls. Each is in the form [x, y, width, height]
        walls = [[0, 0, 20, 350, lightgrey],
                 [0, 350, 20, 250, lightgrey],
                 [780, 0, 20, 250, lightgrey],
                 [780, 350, 20, 250, lightgrey],
                 [20, 0, 760, 20, lightgrey],
                 [20, 580, 760, 20,lightgrey],
                 [95, 20, 20, 500, lightgrey],
                 [175, 500, 20, 100, lightgrey],
                 [195, 410, 20, 110, lightgrey],
                 [215, 320, 20, 110, lightgrey],
                 [235, 245, 20, 100, lightgrey],
                 [235, 230, 120, 20,lightgrey],
                 [400, 230, 400, 20,lightgrey],
                 [335, 180, 20, 50, lightgrey],
                 [350, 180, 385, 20,lightgrey],
                 [335, 180, 20, 50, lightgrey],
                 [435, 245, 20, 95, lightgrey],
                 [455, 320, 20, 110, lightgrey],
                 [475, 400, 20, 110, lightgrey],
                 [575, 300, 20, 280, lightgrey],
                 [703, 250, 20, 280, lightgrey],
                    ]

     # Loop through the list. Create the wall, add it to the list
        for item in walls:
            wall = Wall(item[0], item[1], item[2], item[3], item[4])
            self.wall_list.add(wall)
# Room 2 
class Room2(Room):
    """This creates all the walls in room 2"""
    def __init__(self):
        Room.__init__(self)

        walls = [[0, 0, 20, 250, bronze],
                 [0, 350, 20, 250, bronze],
                 [780, 0, 20, 250, bronze],
                 [780, 350, 20, 250, bronze],
                 [20, 0, 760, 20, bronze],
                 [20, 580, 760, 20, bronze],
                 [80, 50, 18, 95, rock],
                 [191, 50, 18, 95, rock],
                 [80, 30, 129, 20, rock],
                 [335, 50, 18, 95, steel],
                 [446, 50, 18, 95, steel],
                 [335, 30, 129, 20, steel],
                 [591, 50, 18, 95, ice],
                 [703, 50, 18, 95, ice],
                 [591, 30, 130, 20, ice],
                 ]



        for item in walls:
            wall = Wall(item[0], item[1], item[2], item[3], item[4])
            self.wall_list.add(wall)


#Room 3 
class Room3(Room):
    """This creates all the walls in room 3"""
    def __init__(self):
        Room.__init__(self)

        walls = [[0, 0, 20, 250, giygas],
                 [0, 350, 20, 250, giygas],
                 [780, 0, 20, 400, giygas],
                 [780, 350, 20, 250, giygas],
                 [20, 0, 760, 70, giygas],
                 [20, 530, 760, 80, giygas],
                 [20, 350, 20, 20, purple],
                 [40, 370, 20, 20, purple],
                 [60, 390, 20, 20, purple],
                 [80, 410, 20, 20, purple],
                 [100, 430, 20, 20, purple],
                 [120, 450, 20, 20, purple],
                 [140, 470, 20, 20, purple],
                 [160, 490, 20, 20, purple],
                 [180, 510, 20, 20, purple],
                 [760, 350, 20, 20, purple],
                 [740, 370, 20, 20, purple],
                 [720, 390, 20, 20, purple],
                 [700, 410, 20, 20, purple],
                 [680, 430, 20, 20, purple],
                 [660, 450, 20, 20, purple],
                 [640, 470, 20, 20, purple],
                 [620, 490, 20, 20, purple],
                 [600, 510, 20, 20, purple],
                 [20, 230, 20, 20, purple],
                 [40, 210, 20, 20, purple],
                 [60, 190, 20, 20, purple],
                 [80, 170, 20, 20, purple],
                 [100, 150, 20, 20, purple],
                 [120, 130, 20, 20, purple],
                 [140, 110, 20, 20, purple],
                 [160, 90, 20, 20, purple],
                 [180, 70, 20, 20, purple],
                 [760, 230, 20, 20, purple],
                 [740, 210, 20, 20, purple],
                 [720, 190, 20, 20, purple],
                 [700, 170, 20, 20, purple],
                 [680, 150, 20, 20, purple],
                 [660, 130, 20, 20, purple],
                 [640, 110, 20, 20, purple],
                 [620, 90, 20, 20, purple],
                 [600, 70, 20, 20, purple],
                 [200, 50, 400, 20, purple],
                 [200, 530, 400, 20, purple],
                 [20, 510, 160, 20, giygas],
                 [20, 490, 140, 20, giygas],
                 [20, 470, 120, 20, giygas],
                 [20, 450, 100, 20, giygas],
                 [20, 430, 80, 20, giygas],
                 [20, 410, 60, 20, giygas],
                 [20, 390, 40, 20, giygas],
                 [20, 370, 20, 20, giygas],
                 [20, 210, 20, 20, giygas],
                 [20, 190, 40, 20, giygas],
                 [20, 170, 60, 20, giygas],
                 [20, 150, 80, 20, giygas],
                 [20, 130, 100, 20, giygas],
                 [20, 110, 120, 20, giygas],
                 [20, 90, 140, 20, giygas],
                 [20, 70, 160, 20, giygas],
                 [620, 70, 160, 20, giygas],
                 [640, 90, 140, 20, giygas],
                 [660, 110, 120, 20, giygas],
                 [680, 130, 160, 20, giygas],
                 [700, 150, 180, 20, giygas],
                 [720, 170, 200, 20, giygas],
                 [740, 190, 210, 20, giygas],
                 [760, 210, 230, 20, giygas],
                 [760, 370, 230, 20, giygas],
                 [740, 390, 210, 20, giygas],
                 [720, 410, 190, 20, giygas],
                 [700, 430, 170, 20, giygas],
                 [680, 450, 150, 20, giygas],
                 [660, 470, 130, 20, giygas],
                 [640, 490, 180, 20, giygas],
                 [620, 510, 180, 20, giygas],
                 [760, 240, 20, 130, purple]
                  ]    

        for item in walls:
            wall = Wall(item[0], item[1], item[2], item[3], item[4])
            self.wall_list.add(wall)



def main():
    """ Main Program """

    # Call this function so the Pygame library can initialize itself
    pygame.init()

    # Create an 800x600 sized screen
    screen = pygame.display.set_mode([800, 600])
    map1 = pygame.mixer.Sound("Encounter - Fire Emblem Gaiden.wav")
    map1.play()

    # Set the title of the window
    pygame.display.set_caption('Toaster')

    # Create the player paddle object
    player = Player()
    moving_sprites = pygame.sprite.Group()
    moving_sprites.add(player)

    rooms = []

    room = Room1()
    rooms.append(room)

    room = Room2()
    rooms.append(room)


    room = Room3()
    rooms.append(room)


    current_room_no = 0
    current_room = rooms[current_room_no]

    clock = pygame.time.Clock()

    done = False

    while not done:

        # --- Event Processing ---

     while not done:
        for event in pygame.event.get(): # User did something
            if event.type == pygame.QUIT: # If user clicked close
                done = True # Flag that we are done so we exit this loop

            if event.type == pygame.KEYDOWN:
                #this means if the user holds down the key
                '''walking actions'''
                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.go_up()
                if event.key == pygame.K_DOWN:
                    player.go_down()

            if event.type == pygame.KEYUP:
                #this means if the user lets off of the key
                '''stopping walking actions'''
                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()
                if event.key == pygame.K_UP and player.change_y < 0:
                    player.stop()
                if event.key == pygame.K_DOWN and player.change_y > 0:
                    player.stop()

        # --- Game Logic ---

        player.move(current_room.wall_list)

        if player.rect.x < -15:
            if current_room_no == 0:
                current_room_no = 2
                current_room = rooms[current_room_no]
                player.rect.x = 790
            elif current_room_no == 2:
                current_room_no = 1
                current_room = rooms[current_room_no]
                player.rect.x = 790
            else:
                current_room_no = 0
                current_room = rooms[current_room_no]
                player.rect.x = 790

        if player.rect.x > 801:
            if current_room_no == 0:
                current_room_no = 1
                current_room = rooms[current_room_no]
                player.rect.x = 0
            elif current_room_no == 1:
                current_room_no = 2
                current_room = rooms[current_room_no]
                player.rect.x = 0
            else:
                current_room_no = 0
                current_room = rooms[current_room_no]
                player.rect.x = 0

        # --- Drawing ---
        screen.fill(grey)

        for y_offset in range(0,772,16):
            pygame.draw.line(screen, black, [16+y_offset,0], [16+y_offset,600])
        for x_offset in range(0,732,16):
            pygame.draw.line(screen, black, [0,16+x_offset], [800,16+x_offset])



        moving_sprites.draw(screen)
        current_room.wall_list.draw(screen)


        pygame.display.flip()

        clock.tick(60)

    pygame.quit()

if __name__ == "__main__":
    main()

1 个答案:

答案 0 :(得分:1)

我运行你的代码,我得到追溯

Traceback (most recent call last):
  File "main.py", line 558, in <module>
    main()
  File "main.py", line 509, in main
    player.move(current_room.wall_list)
  File "main.py", line 242, in move
    if self.direction == "U":
AttributeError: 'Player' object has no attribute 'direction'

可能你没有在控制台/终端中运行你的代码 因为你会立即发现这个问题。

我在self.direction = ""中添加了Player.__init__(),但它确实有效。