Я разрабатываю инкрементальную игру / кликер в 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
gnawydna 1 Янв 2018 в 00:16

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() может быть проблематичным, если вы хотите использовать его с кнопками, потому что он проверяет только то, удерживается ли кнопка мыши нажатой, а не то, что она была нажата только один раз.

2
skrx 31 Дек 2017 в 21:34

В вашем операторе button.check() if он должен прибавить единицу к деньгам, а затем подождать, пока не будет нажата мышь:

if button.check()==True:
     money+=1
     while pygame.mouse.get_pressed()[0]==True:
         clock.tick(10)

Это правильно?

-2
user8821163 31 Дек 2017 в 21:29