Pygame Touble при рисовании прямоугольника - PullRequest
0 голосов
/ 13 июня 2019

Итак, я случайным образом генерирую «мир» и рисую его с помощью pygame.Эта часть работала прекрасно, пока я не решил добавить что-то сверх того, что уже нарисовал.

Код выглядит следующим образом.Каждая вещь не имеет значения, но DISPLAY - это поверхность, над которой я работаю, y.colour - это кортеж размера 3, y.coord - это (x, y) кортеж

for x in W_Map:
    for y in x:
        DISPLAY.fill(y.colour, pygame.Rect(y.coord[0]-tile_size, 
                                           y.coord[1]-tile_size, 
                                           y.coord[0]+tile_size, 
                                           y.coord[1]+tile_size))  

DISPLAY.fill(lime, pygame.Rect(300,300,310,310))

Согласнок вышеприведенной игре это должно создать квадрат 10х10, окрашенный в лайм, с центром в 305х305.В результате получается следующая картина:

This is the result

Как видите, первая часть кода отлично рисует ландшафт, но при создании квадрата извести сверхуто, что уже нарисовано, сходит с ума.Вся функция:

pygame.init()
DISPLAY = pygame.display.set_mode(
    (shape[0]*2*tile_size, shape[1]*2*tile_size))
DISPLAY.fill((0,0,0))
#Make and draw the Rects
for x in W_Map:
    for y in x:
        DISPLAY.fill(y.colour, pygame.Rect(y.coord[0]-tile_size, 
                                           y.coord[1]-tile_size, 
                                           y.coord[0]+tile_size, 
                                           y.coord[1]+tile_size))  

DISPLAY.fill(lime, pygame.Rect(300,300,310,310))

1 Ответ

2 голосов
/ 13 июня 2019

Pygame's Rect принимает четыре аргумента: x, y, width и height, где x и y относятся к верхнему левому углу области просмотра. Ваш прямоугольник извести создан с pygame.Rect(300,300,310,310), что означает ширину и высоту 310 пикселей и местоположение (300, 300).

Чтобы создать прямоугольник 10x10 с центром в (305, 305), вам нужно будет использовать pygame.Rect(300, 300, 10, 10). Вы также можете создать вспомогательную функцию для перевода размера и центральной точки в необходимые параметры прямоугольника:

def center_rect(x, y, width, height):
    return pygame.Rect(x - width / 2, y - height / 2, width, height)

Тогда вы можете использовать эту вспомогательную функцию следующим образом:

DISPLAY.fill(lime, center_rect(305, 305, 10, 10))
...