Python 如何在Pygame中使用精灵表创建动画精灵?

Python 如何在Pygame中使用精灵表创建动画精灵?,python,python-3.x,pygame,sprite-sheet,Python,Python 3.x,Pygame,Sprite Sheet,所以我一直在测试这段代码,我找到了一个关于如何在pygame中添加SpriteSheet的教程,并决定试试这个: 我按照视频所说的做了,数了数列和行,这是我的代码: pygame.init() CLOCK = pygame.time.Clock() DS = pygame.display.set_mode((W, H)) FPS = 60 class spritesheet: def __init__(self, filename, cols, rows): self

所以我一直在测试这段代码,我找到了一个关于如何在pygame中添加SpriteSheet的教程,并决定试试这个:

我按照视频所说的做了,数了数列和行,这是我的代码:

pygame.init()
CLOCK = pygame.time.Clock()
DS = pygame.display.set_mode((W, H))
FPS = 60

class spritesheet:
    def __init__(self, filename, cols, rows):
        self.sheet = pygame.image.load(filename).convert_alpha()

        self.cols = cols
        self.rows = rows
        self.totalCellCount = cols * rows

        self.rect = self.sheet.get_rect()
        w = self.cellWidth = self.rect.width / cols
        h = self.cellHeight = self.rect.height / rows
        hw, hh = self.cellCenter = (w / 2, h / 2)

        self.cells = list([(index % cols * w, index / cols * h, w, h) for index in range(self.totalCellCount)])
        self.handle = list([
            (0,0), (-hw, 0), (-w, 0),
            (0, -hh), (-hw, -hh), (-w, -hh),
            (0, -h), (-hw, -h), (-w, -h),])

    def draw(self, surface, cellIndex, x, y, handle = 0):
        surface.blit(self.sheet, 
        (x + self.handle[handle][0], y + self.handle[handle][1],
         self.cells[cellIndex][2], self.cells[cellIndex][3]))


s = spritesheet('Number18.png', 58, 6)

CENTER_HANDLE = 6

Index = 0

#mainloop
run = True
while run:

    s.draw(DS, Index % s.totalCellCount, HW, HH, CENTER_HANDLE)
    Index +=1

    #pygame.draw.circle(DS, WHITE, (HW, HW), 20, 10)
    DS.blit(bg,(0,0))

    pygame.display.update()
    CLOCK.tick(FPS)
    DS.fill(BLACK)
s=spritesheet(“Number18.png”,58,6)
中的数字58,6基本上就是我在这个spritesheet块上计算的行数和列数,但是我遇到了一些问题,例如pygame窗口“无响应”、图像无法加载以及我无法移动pygame屏幕

我遇到了一些问题,比如pygame窗口显示“没有响应”[…]

您要做的第一件事是将en事件循环添加到应用程序的主循环中。
pygame.event
从队列中删除挂起的事件消息并将其返回。 至少你应该处理这个事件。设置主循环的控制变量值
False

run=True
运行时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
“精灵”表中的瓷砖大小不相等。将
单元格
列表限制为工作表中大小相等的部分。
请尝试以下操作:

类精灵表:
定义初始化(self、文件名、py、tw、th、tiles):
self.sheet=pygame.image.load(文件名).convert_alpha()
self.py=py
self.tw=tw
self.th=th
self.totalCellCount=tiles
self.rect=self.sheet.get_rect()
w、 h=tw,th
hw,hh=self.cellCenter=(w/2,h/2)
self.cells=[(1+i*tw,self.py,tw-1,th-1)表示范围内的i(平铺)]
self.handle=list([
(0,0),(-hw,0),(-w,0),
(0,-hh),(-hw,-hh),(-w,-hh),
(0,-h),(-hw,-h),(-w,-h),]
s=spritesheet('Number18.png',1085,80,134,8)

[…]图像未加载[…]

确保映像位于应用程序的工作目录中。
如果要绘制小图纸的子图像,则必须将的
区域
参数(第3个参数)设置为子图像的矩形区域:

def draw(self, surface, cellIndex, x, y, handle = 0):
    hdl = self.handle[handle]
    surface.blit(self.sheet, (x + hdl[0], y + hdl[1]), area=self.cells[cellIndex])

我不能动了

你必须改变精灵的位置。处理
KEYDOWN
事件。存储精灵的位置(
px
py
)。按下
K_向上
K_向下
K_向左
K_向右
键时,更改位置:

run=True
px,py,速度=HW,HH,10
运行时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
elif event.type==pygame.KEYDOWN:
如果event.key==pygame.K_UP:
py-=速度
elif event.key==pygame.K_向下:
py+=速度
elif event.key==pygame.K_左:
px-=速度
elif event.key==pygame.K_RIGHT:
px+=速度

最小精灵表示例:

导入操作系统
导入pygame
类别精神表:
def uuu init uuuu(self,filename,px,py,tw,th,m,tiles,color_key=None):
self.sheet=pygame.image.load(文件名)
如果是颜色键:
self.sheet=self.sheet.convert()
self.sheet.set_颜色键(颜色键)
其他:
self.sheet=self.sheet.convert_alpha()
self.cells=[(px+tw*i,py,tw-m,th)表示范围内的i(tiles)]
self.index=0
def更新(自我):
self.tile_rect=self.cells[self.index%len(self.cells)]
自索引+=1
def绘图(自身、曲面、x、y):
rect=pygame.rect(self.tile_rect)
rect.center=(x,y)
表面blit(self.sheet、rect、self.tile\u rect)
pygame.init()
window=pygame.display.set_模式((400300))
clock=pygame.time.clock()
sprite_sheet=SpriteSheet('awesomepossum sheet.bmp',18580,64,66,0,6,(0,128,0))
运行=真
运行时:
时钟滴答(10)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
sprite_sheet.update()
窗口填充(0)
sprite_sheet.draw(窗口,*window.get_rect().center)
pygame.display.update()
pygame.quit()
退出()
雪碧表格式:

我遇到了一些问题,比如pygame窗口显示“没有响应”[…]

您要做的第一件事是将en事件循环添加到应用程序的主循环中。
pygame.event
从队列中删除挂起的事件消息并将其返回。 至少你应该处理这个事件。设置主循环的控制变量值
False

run=True
运行时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
“精灵”表中的瓷砖大小不相等。将
单元格
列表限制为工作表中大小相等的部分。
请尝试以下操作:

类精灵表:
定义初始化(self、文件名、py、tw、th、tiles):
self.sheet=pygame.image.load(文件名).convert_alpha()
self.py=py
self.tw=tw
self.th=th
self.totalCellCount=tiles
self.rect=self.sheet.get_rect()
w、 h=tw,th
hw,hh=self.cellCenter=(w/2,h/2)
self.cells=[(1+i*tw,self.py,tw-1,th-1)表示范围内的i(平铺)]
self.handle=list([
(0,0),(-hw,0),(-w,0),
(0,-hh),(-hw,-hh),(-w,-hh),
(0,-h),(-hw,-h),(-w,-h),]
s=spritesheet('Number18.png',1085,80,134,8)

[…]图像未加载[…]

确保映像位于应用程序的工作目录中。
如果要绘制小图纸的子图像,则必须将的
区域
参数(第三个参数)设置为矩形