Как работать с прямоугольником с оберткой для объекта в pygame, если координаты объекта равны (0,0)

У меня есть код для обертывания прямоугольником текста в 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)?

Этот дизайн просто не может работать — wrapRect() не имеет абсолютно никакой возможности узнать, где вы в конечном итоге собираетесь копировать текст, так как же он может расположить прямоугольник так, чтобы он совпадал? Вероятно, ему следует принять координаты отражения в качестве параметра, чтобы он мог соответствующим образом смещать прямоугольник - и, возможно, копировать сам текст, поскольку теперь у него есть вся необходимая для этого информация.

jasonharper 19.05.2024 04:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете интерпретировать эту строку кода «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()»)

Другие вопросы по теме