pygame, рисующий заполненный прямоугольник, перезаписывает границу, но только иногда?

У меня есть класс в моей программе pygame, который расширяет спрайт и эффективно дает столкновение и еще много чего прямоугольнику. __init__ класса выглядит следующим образом:

def __init__(self,topleft,size,label):
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.Surface(size)
    self.rect = self.image.get_rect()
    self.rect.topleft = topleft
    self.image.fill([128,128,128])
    pygame.draw.rect(self.image, [200,200,200], self.rect, 5)

И это прекрасно работает... для одного прямоугольника. Проблема в том, что после этого прямоугольника все остальные представляют собой прямоугольники сплошного цвета с цветом заливки (128,128,128), а не закрашенным прямоугольником с границей другого цвета (200,200,200). Я ожидаю, что это какая-то проблема с переменными класса, а не с переменными экземпляра, но я не уверен, в чем проблема.


person Matthew Fournier    schedule 02.02.2015    source источник
comment
вы явно устанавливаете цвет заливки постоянным ... почему вы ожидаете разные цвета?   -  person Joran Beasley    schedule 02.02.2015
comment
Заливка постоянна, но граница прямоугольника является другой константой. Проблема в том, что для каждого прямоугольника после первого граница устанавливается в цвет заливки вместо предполагаемого значения 200 200 200.   -  person Matthew Fournier    schedule 02.02.2015
comment
хорошо, теперь я понимаю ...   -  person Joran Beasley    schedule 02.02.2015
comment
Если вы используете self.rect = pygame.Rect(0,0,*size) вместо self.image.get_rect(), возникает ли та же проблема? Все, что я могу думать, это то, что прямоугольник рисуется не в том месте, хотя его верхний левый угол должен быть равен 0,0. (Если вы где-то применяете этот аргумент topleft к self.rect, то, возможно, функция отводит прямоугольник от источника self.image?)   -  person Augusta    schedule 02.02.2015
comment
Ах да, я забыл добавить в эту строку, что у меня есть self.rect.topleft = topleft, прежде чем я заполню поверхность. Я добавлю это в ОП. Изменение способа получения прямоугольника также не исправляет границу. Я только что провел быстрый эксперимент, я удалил заливку, и похоже, что второй прямоугольник вообще не рисуется. У него есть местоположение и прямоугольник, потому что я все еще могу столкнуться с ним, но он просто не рисует границу вообще.   -  person Matthew Fournier    schedule 02.02.2015


Ответы (1)


Хорошо, я понял это. Аргумент Rect в функции рисования относительно положения изображения. Поскольку я установил его прямоугольник в его положение на экране, он рисовал прямоугольник со смещением от угла. Это сработало на моем первом только потому, что оно началось с [0,0]. Вот фиксированный код отрисовки:

pygame.draw.rect(self.image, [200,200,200],pygame.Rect([0,0],size), 5)
person Matthew Fournier    schedule 02.02.2015