Python 3.x pygame中的精灵表帮助

Python 3.x pygame中的精灵表帮助,python-3.x,pygame,sprite,sprite-sheet,Python 3.x,Pygame,Sprite,Sprite Sheet,我目前正在制作一个游戏,试图提高我的python初学者技能。我的游戏在其最基本的层面上运行-在我能够为我的精灵设置动画之前,我无法让自己在它的发展中前进。这让我感到最头疼的是——长时间盯着别人的代码,复制粘贴都没有用,还看了无数的youtube视频。由于某些原因,我似乎无法理解如何从精灵表中剥离图像的基本概念。我看过pygame的网站,我就是不明白。我跟孩子们一起写代码,但是他的精灵表有一个“xml”?附加文件,以便他可以复制和粘贴坐标。我的spritesheet是192x192像素,所以我尝试

我目前正在制作一个游戏,试图提高我的python初学者技能。我的游戏在其最基本的层面上运行-在我能够为我的精灵设置动画之前,我无法让自己在它的发展中前进。这让我感到最头疼的是——长时间盯着别人的代码,复制粘贴都没有用,还看了无数的youtube视频。由于某些原因,我似乎无法理解如何从精灵表中剥离图像的基本概念。我看过pygame的网站,我就是不明白。我跟孩子们一起写代码,但是他的精灵表有一个“xml”?附加文件,以便他可以复制和粘贴坐标。我的spritesheet是192x192像素,所以我尝试按48分隔的坐标加载/分割图像。例如-(0,0,48,0)。我假设这些变量是x,y,PreviousSpriteIndingx,PreviousSpriteIndingy,根据他的例子,也是因为这是我唯一能理解的东西。我将每个精灵位置分组到相应方向的列表中-上、下、左和右。(我不想翻译和翻转我的L/R,但现在我正在考虑,这会让我的游戏更快吗?因为它不需要加载4张新图片?)

我终于让它实际运行了,但它并没有显示我的精灵,它只是一个黑匣子,随着它的移动,它的宽度会增加,但看起来它太大了,无法成为我的精灵。所以我知道我的坐标有问题(当我按下按钮时,框消失了)。如果有人能给我一个工作示例,我可以复制粘贴以运行和剖析它,解释它以便初学者能够轻松理解,或者(我把最好的保存到最后)在下面粘贴的代码中实现一些东西,我将永远感激。上次我在这里发帖时,我得到了很大的帮助,我希望复制这些结果。这是指向我的精灵表的链接

导入pygame
宽度=1000
高度=700
FPS=60
白色=(255,255,255)
黑色=(0,0,0)
红色=(255,0,0)
绿色=(0,255,0)
蓝色=(0,0255)
pygame.init()
pygame.mixer.init()
screen=pygame.display.set_模式((宽度、高度))
pygame.display.set_标题(“游戏”)
clock=pygame.time.clock()
职业玩家(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
宽度=25
高度=25
image=pygame.image.load(“CharacterSprite.png”)
self.image=pygame.transform.scale(图像,(宽度,高度))
self.image.set_颜色键(黑色)
self.rect=self.image.get_rect()
self.rect.centerx=宽度/2-480#矩形中心
self.rect.bottom=高度-从底部向上5像素
self.speedx=0
self.speeded=0
self.walkingright=[]
self.walkingleft=[]
self.walkingup=[]
self.walkingdown=[]
self.direction='R'
#面朝下
sprite_sheet=SpriteSheet('CharacterSprite.png')
图像=精灵图。获取图像(0,0,48,0)
self.walkingdown.append(图像)
图像=精灵图。获取图像(48,0,96,0)
self.walkingdown.append(图像)
图像=精灵图。获取图像(96,0144,0)
self.walkingdown.append(图像)
图像=精灵图。获取图像(144,0192,0)
self.walkingdown.append(图像)
#面朝上
图像=精灵图。获取图像(192144,48144)
self.walkingup.append(图像)
图像=精灵图。获取图像(48144,96144)
self.walkingup.append(图像)
图像=精灵图。获取图像(96144144)
self.walkingup.append(图像)
图像=精灵图。获取图像(144192144)
self.walkingup.append(图像)
#向右
图像=精灵表。获取图像(192,96,48,96)
self.walkingright.append(图像)
图像=精灵图。获取图像(48,96,96)
self.walkingright.append(图像)
图像=精灵图。获取图像(96,96144,96)
self.walkingright.append(图像)
图像=精灵图。获取图像(144,96192,96)
self.walkingright.append(图像)
#FacingLeft
图像=精灵图。获取图像(192,48,48)
self.walkingleft.append(图像)
图像=精灵图。获取图像(48,48,96,48)
self.walkingleft.append(图像)
图像=精灵图。获取图像(96,48144,48)
self.walkingleft.append(图像)
图像=精灵图。获取图像(144,48192,48)
self.walkingleft.append(图像)
def更新(自我):
pos=自校正x
如果self.direction==“R”:
帧=(位置//30)%len(自走右)
self.image=self.walkingright[帧]
如果self.direction==“L”:
帧=(位置//30)%len(自走左)
self.image=self.walkingleft[帧]
如果self.direction==“U”:
帧=(位置//30)%len(自走)
self.image=self.walkingup[frame]
如果self.direction==“D”:
帧=(位置//30)%len(自走下)
self.image=self.walkingdown[帧]
self.speedx=0#需要这些来确保
self.speedy=0#精灵在键控键上停止移动
keystate=pygame.key.get_pressed()
如果keystate[pygame.K_左]:
self.speedx=-5
self.direction='L'
如果keystate[pygame.K_RIGHT]:
self.speedx=5
self.direction='R'
如果keystate[pygame.K_UP]:
self.speedy=-5
self.direction='U'
如果键状态[pygame.K_DOWN]:
self.speeded=5
self.direction='D'
self.rect.x+=self.speedx
self.rect.y+=自加速
#设置墙的宽度和高度
如果self.rect.right>宽度:
self.rect.rect=宽度
如果self.rect.left<0:
self.rect.left=0
如果self.rect.top<0:
self.rect.top=0
如果self.rect.bottom>高度:
self.rect.bottom=高度
类精灵表(对象):
定义初始化(自我,文件名):
self.sprite\u sheet=pygame.image.load(文件名)
def get_图像(自身、x、y、宽度、高度):
image=pygame.Surface([宽度,高度])
图像.blit(self.sprite_表,(0,0),(x,y,宽度,高度))
import pygame

WIDTH = 1000
HEIGHT = 700
FPS = 60

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Game")
clock = pygame.time.Clock()

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        width = 25
        height = 25
        image = pygame.image.load("CharacterSprite.png")
        self.image = pygame.transform.scale(image, (width, height))
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2 - 480   #center of rectangle
        self.rect.bottom = HEIGHT - 5  #pixels up from the bottom
        self.speedx = 0
        self.speedy = 0
        self.walkingright = []
        self.walkingleft = []
        self.walkingup = []
        self.walkingdown = []
        self.direction = 'R'


    #Facing Down
    sprite_sheet = SpriteSheet('CharacterSprite.png')
    image = sprite_sheet.get_image(0,0,48,0)
    self.walkingdown.append(image) 
    image = sprite_sheet.get_image(48,0,96,0)
    self.walkingdown.append(image)
    image = sprite_sheet.get_image(96,0,144,0)
    self.walkingdown.append(image)
    image = sprite_sheet.get_image(144,0,192,0)
    self.walkingdown.append(image)


    #Facing Up
    image = sprite_sheet.get_image(192,144,48,144)
    self.walkingup.append(image) 
    image = sprite_sheet.get_image(48,144,96,144)
    self.walkingup.append(image)
    image = sprite_sheet.get_image(96,144,144,144)
    self.walkingup.append(image)
    image = sprite_sheet.get_image(144,144,192,144)
    self.walkingup.append(image)


    #Facing Right
    image = sprite_sheet.get_image(192,96,48,96)
    self.walkingright.append(image)
    image = sprite_sheet.get_image(48,96,96,96)
    self.walkingright.append(image)
    image = sprite_sheet.get_image(96,96,144,96)
    self.walkingright.append(image)
    image = sprite_sheet.get_image(144,96,192,96)
    self.walkingright.append(image)

    #FacingLeft
    image = sprite_sheet.get_image(192,48,48,48)
    self.walkingleft.append(image)
    image = sprite_sheet.get_image(48,48,96,48)
    self.walkingleft.append(image)
    image = sprite_sheet.get_image(96,48,144,48)
    self.walkingleft.append(image)
    image = sprite_sheet.get_image(144,48,192,48)
    self.walkingleft.append(image)


def update(self):
    pos = self.rect.x
    if self.direction == "R":
        frame = (pos // 30) % len(self.walkingright)
        self.image = self.walkingright[frame]
    if self.direction == "L":
        frame = (pos // 30) % len(self.walkingleft)
        self.image = self.walkingleft[frame]
    if self.direction == "U":
        frame = (pos // 30) % len(self.walkingup)
        self.image = self.walkingup[frame]
    if self.direction == "D":
        frame = (pos // 30) % len(self.walkingdown)
        self.image = self.walkingdown[frame]

    self.speedx = 0 #Need these to make sure
    self.speedy = 0 #Sprite stops moving on keyup
    keystate = pygame.key.get_pressed()
    if keystate[pygame.K_LEFT]:
        self.speedx = -5
        self.direction = 'L'
    if keystate[pygame.K_RIGHT]:
        self.speedx = 5
        self.direction = 'R'
    if keystate[pygame.K_UP]:
        self.speedy = -5
        self.direction = 'U'
    if keystate[pygame.K_DOWN]:
        self.speedy = 5
        self.direction = 'D'
    self.rect.x += self.speedx
    self.rect.y += self.speedy

    #Set Walls for Width and Height
    if self.rect.right > WIDTH:
        self.rect.rect = WIDTH
    if self.rect.left < 0:
        self.rect.left = 0
    if self.rect.top < 0:
        self.rect.top = 0
    if self.rect.bottom > HEIGHT:
        self.rect.bottom = HEIGHT


class SpriteSheet(object):
    def __init__(self, file_name):
        self.sprite_sheet = pygame.image.load(file_name)
    def get_image(self, x, y, width, height):
        image = pygame.Surface([width, height])
        image.blit(self.sprite_sheet, (0,0), (x, y, width, height))
        image.set_colorkey(BLUE)
        return image

def update(self):
    if self.rect.right > WIDTH:
        self.rect.right = WIDTH
    if self.rect.top < 0:
        self.rect.top = 0
    if self.rect.bottom > HEIGHT:
        self.rect.bottom = HEIGHT
    self.rect.x += self.speedx
    #kill if it goes off screen
    if self.rect.left > WIDTH:
        self.kill()  

#Loading Graphics
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
projectiles = pygame.sprite.Group()

#Spawn x amount of mobs, add to all sprites and mobs
running = True
while running:
    clock.tick(FPS)
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE:
            player.shoot()

 #Update Game Loop           
all_sprites.update()
screen.fill(WHITE)
all_sprites.draw(screen)
pygame.display.flip()
pygame.quit()
self.sprite_sheet = pygame.image.load(file_name).convert_alpha()
if self.direction == "U":
    frame = (pos_y // 30) % len(self.walkingup)
import pygame

WIDTH = 1000
HEIGHT = 700
FPS = 60

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()


class Player(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        width = 25
        height = 25
        sheet = pygame.image.load('Character_Sprite.png').convert_alpha()
        self.image = pygame.transform.scale(sheet, (48, 48))
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2 - 480   #center of rectangle
        self.rect.bottom = HEIGHT - 5  #pixels up from the bottom
        self.speedx = 0
        self.speedy = 0
        self.walkingright = []
        self.walkingleft = []
        self.walkingup = []
        self.walkingdown = []
        self.direction = 'R'

        sprite_sheet = SpriteSheet('Character_Sprite.png')
        #Facing Down
        # Start at x = 0. Pass 48 as the third and
        # fourth argument (width and height).
        image = sprite_sheet.get_image(0,0,48,48)
        self.walkingdown.append(image) 
        image = sprite_sheet.get_image(48,0,48,48)
        self.walkingdown.append(image)
        image = sprite_sheet.get_image(96,0,48,48)
        self.walkingdown.append(image)
        image = sprite_sheet.get_image(144,0,48,48)
        self.walkingdown.append(image)

        #Facing Up
        image = sprite_sheet.get_image(0,144,48,48)
        self.walkingup.append(image) 
        image = sprite_sheet.get_image(48,144,48,48)
        self.walkingup.append(image)
        image = sprite_sheet.get_image(96,144,48,48)
        self.walkingup.append(image)
        image = sprite_sheet.get_image(144,144,48,48)
        self.walkingup.append(image)

        #Facing Right
        image = sprite_sheet.get_image(0,96,48,48)
        self.walkingright.append(image)
        image = sprite_sheet.get_image(48,96,48,48)
        self.walkingright.append(image)
        image = sprite_sheet.get_image(96,96,48,48)
        self.walkingright.append(image)
        image = sprite_sheet.get_image(144,96,48,48)
        self.walkingright.append(image)

        #Facing Left
        image = sprite_sheet.get_image(0,48,48,48)
        self.walkingleft.append(image)
        image = sprite_sheet.get_image(48,48,48,48)
        self.walkingleft.append(image)
        image = sprite_sheet.get_image(96,48,48,48)
        self.walkingleft.append(image)
        image = sprite_sheet.get_image(144,48,48,48)
        self.walkingleft.append(image)

    def update(self):
        pos_x = self.rect.x
        # You also need the y position for the vertical movement.
        pos_y = self.rect.y
        if self.direction == "R":
            frame = (pos_x // 30) % len(self.walkingright)
            self.image = self.walkingright[frame]
        if self.direction == "L":
            frame = (pos_x // 30) % len(self.walkingleft)
            self.image = self.walkingleft[frame]
        if self.direction == "U":
            frame = (pos_y // 30) % len(self.walkingup)
            self.image = self.walkingup[frame]
        if self.direction == "D":
            frame = (pos_y // 30) % len(self.walkingdown)
            self.image = self.walkingdown[frame]

        self.speedx = 0 #Need these to make sure
        self.speedy = 0 #Sprite stops moving on keyup
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx = -5
            self.direction = 'L'
        if keystate[pygame.K_RIGHT]:
            self.speedx = 5
            self.direction = 'R'
        if keystate[pygame.K_UP]:
            self.speedy = -5
            self.direction = 'U'
        if keystate[pygame.K_DOWN]:
            self.speedy = 5
            self.direction = 'D'
        self.rect.x += self.speedx
        self.rect.y += self.speedy

        #Set Walls for Width and Height
        if self.rect.right > WIDTH:
            self.rect.rect = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.top < 0:
            self.rect.top = 0
        if self.rect.bottom > HEIGHT:
            self.rect.bottom = HEIGHT


class SpriteSheet(object):
    def __init__(self, file_name):
        # You have to call `convert_alpha`, so that the background of
        # the surface is transparent.
        self.sprite_sheet = pygame.image.load(file_name).convert_alpha()

    def get_image(self, x, y, width, height):
        # Use a transparent surface as the base image (pass pygame.SRCALPHA).
        image = pygame.Surface([width, height], pygame.SRCALPHA)
        image.blit(self.sprite_sheet, (0,0), (x, y, width, height))
        return image


all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)

running = True
while running:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    all_sprites.update()
    screen.fill(WHITE)
    all_sprites.draw(screen)
    pygame.display.flip()

pygame.quit()
# Facing Up
for x in range(0, 144+1, 48):  # 144+1 because the `stop` is exclusive.
    self.walkingdown.append(sprite_sheet.get_image(x, 0, 48, 48))
# Facing Up
for x in range(0, 144+1, 48):
    self.walkingup.append(sprite_sheet.get_image(x, 144, 48, 48))
# Facing Right
for x in range(0, 144+1, 48):
    self.walkingright.append(sprite_sheet.get_image(x, 96, 48, 48))
# Facing Left
for x in range(0, 144+1, 48):
    self.walkingleft.append(sprite_sheet.get_image(x, 48, 48, 48))
image_lists = (self.walkingdown, self.walkingleft, self.walkingright, self.walkingup)
for y, img_list in enumerate(image_lists):  # Enumerate to get the y-position.
    for x in range(4):
        # Multiply x and y by 48 to get the correct coords and use the
        # `subsurface` to cut the sheet into separate images.
        img_list.append(sheet.subsurface(x*48, y*48, 48, 48))
class SpriteSheet(object):

    def __init__(self, file_name):
        self.sprite_sheet = pygame.image.load(file_name).convert_alpha()

    def get_image(self, x, y, width, height):
        return self.sprite_sheet.subsurface((x, y, width, height))