Ошибка типа Pygame: аргумент должен быть объектом прямоугольного стиля - PullRequest
2 голосов
/ 08 мая 2020

Я создал этот класс, чтобы работать с ним лучше

class Block:
  def __init__(self, top, left):
    self.Rect = pygame.Rect((top,left),(10,10))

Затем я хотел создать простую функцию, которая отсекает прямоугольник вот так

def clip(rect_obj):
  return pygame.Rect.clip(rect_obj)

Но когда я передаю прямо в мою функцию я получаю ошибку в заголовке. Я даже напечатал тип

my_block = Block()
print(type(my_block.Rect))    --> <Class Pygame.Rect>
my_rect = clip(my_block.Rect) --> TypeError: Argument must be a rect style Object

. Я хочу знать, есть ли разница между объектом стиля Rect и объектом Rect, потому что я так запутался. Также рисование прямоугольников на экране было бы лучшим способом разметки ti c ta c toe GUI или проще рисовать линии.

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Ошибка - строка pygame.Rect.clip(rect_obj)

def clip(rect_obj):
   return pygame.Rect.clip(rect_obj)  

Эта строка вообще не имеет смысла, потому что pygame.Rect.clip - это метод экземпляра . pygame.Rect.clip():

Возвращает новый прямоугольник, обрезанный так, чтобы он полностью находился внутри аргумента Rect. Если два прямоугольника вначале не перекрываются, возвращается Rect с размером 0.

Метод пересекает 2 pygame.Rect объектов:

rect_1 = pygame.Rect(0, 0, 20, 20)
rect_2 = pygame.Rect(10, 10, 30, 30)
rect_and = rect_1.clip(rect_2 )

rect_and - это прямоугольник в (10, 10) с размером (10, 10).

Вероятно, вы пытаетесь установить область отсечения на поверхность дисплея. Это можно сделать по pygame.Surface.set_clip(). Например:

screen = display.set_mode((width, height))

clip_rect = pygame.Rect(x, y, w, h)
screen.set_clip(clip_rect )
0 голосов
/ 08 мая 2020

Это должно работать:

my_block = Block(25, 25)
my_block1 = Block(25, 25)
my_block1.Rect.clip(my_block.Rect)

Примечание: clip() - это метод pygame.Rect. Кроме того, возможно, было бы проще наследовать от pg.Rect:

class Block(pygame.Rect):
    def __init__(self, rect):
        super().__init__(rect)

и добавлять необходимые атрибуты. Наверняка есть способы получше, это всего лишь идея.

...