Я разрабатываю игру-кликер для школьного проекта. Есть кнопка, которую вы можете нажать, чтобы повысить силу нажатия, но назначенный ей прямоугольник находится не в том месте. Прямоугольник кнопки находится не на самой кнопке. Вот часть кода.
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()
Я назначил прямоугольник кнопки кнопке, но по какой-то причине он перекрывает изображение щелчка. Почему это происходит?
Вы проверяете, щелкнул ли пользователь блок, проверяя прямоугольник 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)
# [...]