Установите ширину и высоту поверхности pygame - PullRequest
1 голос
/ 19 июня 2020

Я создаю свою собственную GUI библиотеку с pygame. У меня есть класс UIComponent, который создает элементы пользовательского интерфейса. Сам элемент пользовательского интерфейса создается через self.image с width и height. Проблема в том, что изменение ширины и высоты, похоже, не работает. Я использую self.rect.x, чтобы изменить его координаты, но когда я попытался использовать self.rect.width, это не дало результата.

ui_elements = pg.sprite.Group()


class UIComponent(pg.sprite.Sprite):

    def __init__(self, width, height):
        pg.sprite.Sprite.__init__(self)
        self.width_percent, height_percent = 0, 0
        self.alignments = []
        self.image = pg.Surface((width, height))
        self.rect = self.image.get_rect()
        ui_elements.add(self)

    def set_colour(self, colour_value):
        self.image.fill(colour_value)

    def update(self, win):
        for i in self.alignments:
            i(win)

    def center_x(self, win):
        self.rect.x = (win.s_width/2)-self.image.get_width()/2

    def center_y(self, win):
        self.rect.y = (win.s_height/2)-self.image.get_height()/2

    def relative_width(self, win):
        self.rect.width = 25

    def relative_height(self, win):
        self.rect.height = 25

1 Ответ

1 голос
/ 19 июня 2020

Изменение ширины и высоты атрибута self.rect влияет на размер pygame.Surface. Даже если прямоугольник передается аргументу dest из pygame.Surface.blit, учитывается только положение прямоугольника, когда поверхность _blit__ на целевой поверхности.
У вас есть для масштабирования исходного изображения до желаемого размера либо pygame.transform.scale, либо pygame.transform.smoothscale.
Сохраните исходное изображение (self.original_image) и создайте масштабированное изображение, когда размер изменяется ширина или высота:

self.image = pygame.transform.smoothscale(self.original_image, self.rect.size)

Класс UIComponent:

class UIComponent(pg.sprite.Sprite):

    def __init__(self, width, height):
        pg.sprite.Sprite.__init__(self)
        self.width_percent, height_percent = 0, 0
        self.alignments = []
        self.original_image = pg.Surface((width, height))
        self.image = self.original_image
        self.rect = self.image.get_rect()
        ui_elements.add(self)

    def set_colour(self, colour_value):
        self.image.fill(colour_value)

    def update(self, win):
        for i in self.alignments:
            i(win)

    def center_x(self, win):
        self.rect.x = (win.s_width/2)-self.image.get_width()/2

    def center_y(self, win):
        self.rect.y = (win.s_height/2)-self.image.get_height()/2

    def relative_width(self, win):
        self.rect.width = 25
        self.image = pygame.transform.smoothscale(self.original_image, self.rect.size)

    def relative_height(self, win):
        self.rect.height = 25
        self.image = pygame.transform.smoothscale(self.original_image, self.rect.size)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...