У меня есть код для обертывания прямоугольником текста в pygame:
import pygame as pg
font = pg.font.SysFont("Comic Sans MS", 30)
def wrapRect(obj, color='Black'):
rect = obj.get_rect()
pg.draw.rect(obj, color, rect.inflate(10,10), 2)
return obj
playButton = wrapRect(font.render('Play', True, 'Black'))
screen.blit(playButton, (200, 170))
Я сделал WrapRect, чтобы обернуть прямоугольником объект, заданный в качестве параметра.
Этот код не работает, потому что до того, как функция blit() поместит текст в нужные координаты, я предполагаю, что координаты кнопки воспроизведения по умолчанию были (0,0), поэтому, когда я использовал функцию inflate(), она сделала эти координаты отрицательные. В результате окружающий прямоугольник не отображался. Как мне сделать так, чтобы WrapRect учитывал тот факт, что я могу захотеть переместить объект за пределы (0,0)?
Вы можете интерпретировать эту строку кода «pg.draw.rect(object, color[r,g,b], rect[x,y,w,h], width)» как рисование размера (w,h), ( r,g,b) цвет, (ширина) размер прямоугольника границы в позиции (x,y) объекта на объекте.
Да, он находится в позиции (x,y) объекта, а это означает, что поверхность имеет отдельную от экрана систему координат. Подобно тому, как вы не можете видеть часть, нарисованную за пределами экрана, вы не можете видеть часть, нарисованную за пределами поверхности (т. е. отрицательную координату).
В функции «wrapRect» вы раздуваете прямоугольник текстовой поверхности, в результате чего координата прямоугольника становится отрицательной. Вы также устанавливаете ширину границы равной 2, чтобы вы не могли видеть ничего нарисованного на поверхности текста. Если вы установите ширину на 0, что означает заливку, вы увидите, что поверхность текста залита цветом.
Чтобы решить эту проблему, вы можете создать прямоугольную поверхность (фон), а затем нарисовать границу и поверхность текста на прямоугольной поверхности.
def wrapRect(obj,color='Black'):
obj_rect=obj.get_rect()
inflated_rect=obj_rect.inflate((10,10))
nw,nh=inflated_rect.size
# create a new surface called rect_surf
# you can think of it as the background of the button
rect_surf=pygame.Surface((nw,nh))
rect_surf.fill('White')
# draw the border on rect_surf
pygame.draw.rect(rect_surf,color,(0,0,nw,nh),2)
# draw obj on the center of rect_surf
obj_rect.center=nw//2,nh//2
rect_surf.blit(obj,obj_rect)
return rect_surf
Теперь вы можете нарисовать кнопку не только в точке (0,0), но и в других координатах. (просто измените координату «screen.blit()»)
Этот дизайн просто не может работать —
wrapRect()
не имеет абсолютно никакой возможности узнать, где вы в конечном итоге собираетесь копировать текст, так как же он может расположить прямоугольник так, чтобы он совпадал? Вероятно, ему следует принять координаты отражения в качестве параметра, чтобы он мог соответствующим образом смещать прямоугольник - и, возможно, копировать сам текст, поскольку теперь у него есть вся необходимая для этого информация.