Работа кнопки мыши Pygame на одном щелчке мыши

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

def newRound():
    pos = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()
    print(click)
    if 730 < pos[0] < 850 and 650 < pos[1] < 800:
        pygame.draw.rect(Background, (150,150,150), (730,650,120,50))
        if click[0] == 1:
            startGame() 

while intro == 1:            
    if endRound == True:
        Background.blit(mapImg, (0,0))
        newRound()
        text()

    if startRound == True:
        for enemy in enemies:
            enemy.update()
        Background.blit(mapImg, (0,0))
        for enemy in enemies:
            enemy.draw(Background)

Полный код с неважными битами

import pygame

def text():
    font = pygame.font.SysFont("monospace", 14)
    text = font.render("Start Round", True, black)
    textpos = text.get_rect()
    textpos.center = (790,675)
    Background.blit(text, textpos)

def newRound():
    pos = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()
    print(click)
    if 730 < pos[0] < 850 and 650 < pos[1] < 800:
        pygame.draw.rect(Background, (150,150,150), (730,650,120,50))
        if click[0] == 1:
            startGame()          
    else:
        pygame.draw.rect(Background, (100,100,100), (730,650,120,50))

def startGame():
    global startRound, endRound, intro, whichRound
    intro = 0       
    createRound()
    intro = 1
    startRound = True
    endRound = False

def life(self):
    global hit, endRound, startRound
    if self.rect.x == 960:
        hit = hit + 1
    if hit == 6:
        startRound = False
        endRound = True

def createRound():
    x = -80
    y = 210
    for e in range(6):
        x = x - 80
        enemies.append(RedEnemy(x, y, Background))

class RedEnemy(object):

    image1 = pygame.image.load("enemySpriteFullHealth.jpg")
    image2 = pygame.image.load("enemySpriteHalfHealth.jpg")
    image3 = pygame.image.load("enemySpriteDead.jpg")

    def __init__(self, x, y, Background):
        self.Background = Background
        self.Background_rect = Background.get_rect()
        self.rect = self.image1.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.health = 20
        self.dist_x = 2
        self.dist_y = 0

    def update(self):
        self.rect.x += self.dist_x
        self.rect.y += self.dist_y
    def draw(self, Background):
        Background.blit(self.image1, self.rect)
        life(self)

pygame.init()

width = 960
height = 720

black = (0,0,0)
lifes = 30
hit = 0
intro = 1
enemies = []
FPS = 200

endRound = True
startRound = False

clock = pygame.time.Clock()
mapImg = pygame.image.load("mapimage.jpg")
Background = pygame.display.set_mode((width, height))
Background_rect = Background.get_rect()

while intro == 1:
    for event in pygame.event.get():
        if event.type == quit:
            pygame.quit()

    if endRound == True:
        Background.blit(mapImg, (0,0))
        newRound()
        text()

    if startRound == True:
        for enemy in enemies:
            enemy.update()
        Background.blit(mapImg, (0,0))
        for enemy in enemies:
            enemy.draw(Background)

    pygame.display.update()
    clock.tick(FPS)

1 ответ

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

    Вы перемещаете врагов, пока вы не получитеhit == 6, и когда вы нажимаете кнопку снова, то hitуже 6так hit == 6заканчивается перемещение врагов, и вы не видите его.

    Так что вам нужно

    if hit == 6:
        startRound = False
        endRound = True
        hit = 0
    

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


    Когда вы заканчиваете перемещение врагов, вы не удаляете их из спискаenemies, и когда вы нажимаете кнопку снова, вы добавляете новых врагов в список, и у вас есть все больше и больше врагов в списке. Проверить len(enemies). то есть.

    def createRound():
        x = -80
        y = 210
        for e in range(6):
            x = x - 80
            enemies.append(RedEnemy(x, y, Background))
        print('enemies:', len(enemies))
    

    Так очистить список, прежде чем использовать его снова

    def createRound():
        global enemies
    
        enemies = []
    
        x = -80
        y = 210
        for e in range(6):
            x = x - 80
            enemies.append(RedEnemy(x, y, Background))
        print('enemies:', len(enemies))
    

    Кстати: вы могли бы использовать intro = Trueвместо intro = 1. А while intro:вместо while intro == 1:этого . Он более удобочитаем.