在Pygame中使用get_clip()时,表面区域外的地下矩形?

时间:2017-04-10 17:12:25

标签: python pygame pygame-surface

我正在制作一个pygame,试图为我的角色设置动画,以便当玩家移动他时,程序将循环通过四个精灵图像子表面。我已经为此设置了一个类:

import pygame
from pygame.locaks import *

class Prota:

    def __init__(self, sheet):
        self.sheet = pygame.image.load(sheet).convert_alpha()
        self.image_rect = self.sheet.get_rect()
        self.image_rect_h = (self.image_rect.height) #num of rows
        self.image_rect_w = (self.image_rect.width/16) #num of columns
        self.image_reel = self.fetch()
        self.image_cue = 0 #index: 0 - 3 (Right), 4 - 7 (Left), 8 - 11 (Front), 12 - 15 (Back)
        self.clock = pygame.time.Clock()

    def draw(self, screen):
        self.clock.tick(60)
        screen.blit(self.image_reel[self.image_cue], (400, 300))

    def fetch(self):
        sprites = []

        for x in range(0, 15):
            self.sheet.set_clip(pygame.Rect(self.image_rect_h*x, 0, self.image_rect_w, self.image_rect_h))
            sprite = self.sheet.subsurface(self.sheet.get_clip())
            sprites.append(sprite)
        return sprites

当我使用虚拟精灵表(只是一个改变颜色的简单50 x 50方形精灵)时,它工作得很好,但是当我尝试实现我的(部分完整的)实际角色表时,我回来了

ValueError: subsurface rectangle outside surface area

我不确定它是否是纸张的大小(虚拟纸张是832 x 52px,字符表是1008 x 79px),或者什么,我似乎找不到任何解决此问题的文章。 (我在快速搜索中找到的最接近的是How to rotate images in pygame

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

错误是使用self.image_rect_h*x作为pygame.Rect的第一个参数(x-coord)。将其更改为self.image_rect_w*x修复它。

self.sheet.set_clip(pygame.Rect(self.image_rect_w*x, 0, self.image_rect_w, self.image_rect_h))

我不确定错误发生的原因,因为pygame.Surface.set_clip.get_clip应限制在表面区域。您应该发布完整的回溯(错误消息)。

我实际上认为如果图像加载和剪切出错,让程序崩溃会更好,这样就更容易找到错误,否则你会得到不正确的精灵。因此,您可以使用pygame.Surface.subsurface代替set_clipget_clip

rect = (self.image_rect_w*x, 0, self.image_rect_w, self.image_rect_h)
sprite = self.sheet.subsurface(rect)