Как получить кнопку Pygame, чтобы зарегистрировать только один клик?

python pygame mouseevent

2237 просмотра

2 ответа

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

import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((640, 480),0,32)
clock = pygame.time.Clock()

def makeButton(x,y,width,height):
    if x + width > cur[0] > x and y + height > cur[1] > y:
        if click == (1,0,0):
            print "button pressed"


square = pygame.Rect((0,0), (32,32))

while True:
    cur = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()
    makeButton(square.left,square.top,square.width,square.height)

    screen.fill((255,255,255))
    screen.fill((55,155,0), square)
    pygame.display.update()
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
Автор: user3150635 Источник Размещён: 12.11.2019 09:03

Ответы (2)


4 плюса

Решение

Простой и более эффективный способ сделать то, что вы хотите, - это явно проверять наличие pygame.MOUSEBUTTONDOWNсобытий и выполнять обработку событий мыши только при необходимости. Вы также можете упростить логику makeButton()с помощью Rectкласса pygame, который знает, как обнаруживать столкновения.

Вот что я имею в виду:

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((640, 480),0,32)
clock = pygame.time.Clock()

def makeButton(cur, rect):
    if rect.collidepoint(cur):
        print "button pressed"

square = pygame.Rect((0,0), (32,32))

while True:
    screen.fill((255,255,255))
    screen.fill((55,155,0), square)
    pygame.display.update()
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:  # left mouse button?
                makeButton(event.pos, square)
Автор: martineau Размещён: 08.07.2015 07:15

0 плюса

Вместо того, чтобы просто иметь метод, я бы создал класс кнопки и создал его для каждой нужной кнопки. Вы также пытаетесь создать свою собственную обработку событий мыши, которая запускается каждый раз, когда выполняется игровой цикл, но в pygame лучше передавать информацию о мыши в такой объект кнопки только при событии мыши. Типы событий MOUSEBUTTONDOWN и MOUSEBUTTONUP будут передаваться в очередь событий при каждом щелчке. Чтобы создать описанное вами поведение, вы можете выполнить действие кнопки только в том случае, если мышь находится в пределах кнопки в событии MOUSEBUTTONUP. Эта страница обеспечивает хорошее введение в обращение ввода Pygame и эта страница содержит подробное (хотя и несколько передового) обсуждение создания общего класса кнопки в Pygame.

Автор: csunday95 Размещён: 08.07.2015 06:31
Вопросы из категории :
32x32