Прямоугольник кнопки находится не в том месте

Я разрабатываю игру-кликер для школьного проекта. Есть кнопка, которую вы можете нажать, чтобы повысить силу нажатия, но назначенный ей прямоугольник находится не в том месте. Прямоугольник кнопки находится не на самой кнопке. Вот часть кода.

import pygame

pygame.init()
pygame.font.init()

screen = pygame.display.set_mode((800, 600))
clickimage = pygame.image.load('block.png')
button = pygame.image.load('button.png')
boxclip = clickimage.get_rect()
buttonclip = button.get_rect()
myfont = pygame.font.SysFont('Comic Sans MS', 50)
coins = 0
cost = 15

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if pygame.mouse.get_pressed()[0] and boxclip.collidepoint(pygame.mouse.get_pos()):
            coins = coins+1
        if pygame.mouse.get_pressed()[0] and buttonclip.collidepoint(pygame.mouse.get_pos()):
            coins = coins-cost
    screen.fill((255, 255, 255))
    screen.blit(clickimage, (50, 50))
    screen.blit(button, (500, 50))
    coindisplay = myfont.render(f'Coins: {coins}', False, (0, 0, 0))
    costdisplay = myfont.render(f'Cost: {cost}', False, (0, 0, 0))
    screen.blit(coindisplay, (50, 310))
    screen.blit(costdisplay, (500, 200))
    pygame.display.update()

Я назначил прямоугольник кнопки кнопке, но по какой-то причине он перекрывает изображение щелчка. Почему это происходит?

Почему в 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
0
105
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы проверяете, щелкнул ли пользователь блок, проверяя прямоугольник boxclip. Вы устанавливаете boxclip = clickimage.get_rect() до того, как переместите изображение на место на экране, так как прямоугольник может знать, в какой он позиции? Его позиция, вероятно, установлена ​​​​на 0, 0.

Вы можете исправить это, определив свой собственный прямоугольник для блока.

boxclip = pygame.Rect(50, 50, clickimage.get_rect().width, clickimage.get_rect().height)

Первые 2 аргумента — это позиции x и y, а 50, 50 — это то место, где вы это сделали. Затем вы можете проверить, сталкивается ли мышь с этим прямоугольником. Вам также необходимо применить это к столкновениям кнопок.

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

pygame.Surface.get_rect.get_rect() возвращает прямоугольник с размером объекта Surface, который всегда начинается с (0, 0), поскольку объект Surface не имеет позиции. Поверхность помещается в положение, когда она находится blit на дисплее. Положение прямоугольника может быть указано аргументом ключевого слова. Например, верхний светодиод прямоугольника можно указать с помощью аргумента ключевого слова topleft. Эти аргументы ключевого слова применяются к атрибутам pygame.Rect перед его возвратом (полный список аргументов ключевого слова см. в pygame.Rect).

Вам нужно всего лишь изменить 2 строки кода:

clickimage = pygame.image.load('block.png')
button = pygame.image.load('button.png')
boxclip = clickimage.get_rect(topleft = (50, 50)) # <---
buttonclip = button.get_rect(topleft = (500, 50)) # <---

# [...]
running = True
while running:
    # [...]

    screen.blit(clickimage, boxclip)
    screen.blit(button, buttonclip)

    # [...]

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