Я разрабатываю инкрементальную игру / кликер в pygame, и я хочу изменять счетчик $ на 1 каждый щелчок. Однако я могу удерживать кнопку нажатой и не могу найти способ ограничить это.
Мой класс кнопок ниже:
class Button(object):
def __init__(self,x,y,width,height,color):
self.rect=(x,y,width,height)
self.image=pygame.draw.rect(screen, color,(self.rect),)
self.x=x
self.y=y
self.width=width
self.height=height
def check(self):
mouse=pygame.mouse.get_pos()
if self.x+self.width >mouse[0] > self.x and self.y+self.height >mouse[1] > self.y:
if pygame.mouse.get_pressed()[0]==True:
return True
Есть ли способ остановить нажатие кнопки?
Любая помощь приветствуется!
Полный код:
import pygame, sys
from pygame.locals import *
pygame.init()
light_gray=(211,211,211)
black=(0,0,0)
white=(255,255,255)
def terminate():
pygame.quit()
sys.exit()
def drawText(text, font, screen, x, y,color):
textobj = font.render(text,True, color)
textrect = textobj.get_rect(center=(x,y))
screen.blit(textobj, textrect)
class Button(object):
def __init__(self,x,y,width,height,color):
self.rect=(x,y,width,height)
self.image=pygame.draw.rect(screen, color,(self.rect),)
self.x=x
self.y=y
self.width=width
self.height=height
def check(self):
mouse=pygame.mouse.get_pos()
if self.x+self.width >mouse[0] > self.x and self.y+self.height >mouse[1] > self.y:
if pygame.mouse.get_pressed()[0]==True:
return True
clock=pygame.time.Clock()
font=pygame.font.SysFont(None,50)
screen_width=1300
screen_height=700
screen=pygame.display.set_mode([screen_width,screen_height])
pygame.display.set_caption('Clicker')
done=False
money=0
sprites=pygame.sprite.Group()
button=Button(25,screen_height-125,500,100,light_gray)
while not done:
for event in pygame.event.get():
if event.type==QUIT:
terminate()
if button.check()==True:
money+=1
screen.fill(light_gray)
sprites.draw(screen)
pygame.draw.rect(screen,black,button.rect, 3)
text_width, text_height=font.size('Click!')
drawText('Click!', font,screen,button.x+button.width/2,button.y+button.height/2,black)
drawText('$'+str(money),font,screen,screen_width/2,25,black)
pygame.display.flip()
clock.tick(15)
pygame.quit()
2 ответа
Если вы переместите вызов button.check()
в цикл событий, он будет вызываться только один раз для каждого щелчка мыши, а не для каждого кадра.
while not done:
for event in pygame.event.get():
if event.type == QUIT:
terminate()
elif event.type == pygame.MOUSEBUTTONDOWN:
if button.check():
money += 1
Я также рекомендую использовать pygame.Rect
в классе Button
, тогда вы можете просто вызвать метод pygame.Rect.collidepoint
, чтобы увидеть, не сталкивается ли мышь с кнопкой.
class Button(object):
def __init__(self,x,y,width,height,color):
self.rect = pygame.Rect(x,y,width,height)
self.image=pygame.draw.rect(screen, color,(self.rect),)
self.x=x
self.y=y
self.width=width
self.height=height
def check(self):
return self.rect.collidepoint(pygame.mouse.get_pos())
pygame.mouse.get_pressed()
может быть проблематичным, если вы хотите использовать его с кнопками, потому что он проверяет только то, удерживается ли кнопка мыши нажатой, а не то, что она была нажата только один раз.
В вашем операторе button.check()
if он должен прибавить единицу к деньгам, а затем подождать, пока не будет нажата мышь:
if button.check()==True:
money+=1
while pygame.mouse.get_pressed()[0]==True:
clock.tick(10)
Это правильно?
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.