Python 无法获取按钮来切换pygame中的更改

Python 无法获取按钮来切换pygame中的更改,python,button,pygame,transition,Python,Button,Pygame,Transition,我想知道为什么我的“GO”按钮不会切换 def game_start() 它会在按住按钮的同时进行永久性切换,但当您松开按钮时,它会返回主菜单 我也很好奇,是否有一种方法可以使文本和按钮消失时 游戏开始时,你按下“开始”按钮 我对python非常陌生,因此对于任何我犯了错误或需要添加/更改的代码,都可以进行解释 import sys import pygame from pygame.locals import * pygame.init() size = width, height = 7

我想知道为什么我的“GO”按钮不会切换

def game_start()
它会在按住按钮的同时进行永久性切换,但当您松开按钮时,它会返回主菜单

我也很好奇,是否有一种方法可以使文本和按钮消失时 游戏开始时,你按下“开始”按钮

我对python非常陌生,因此对于任何我犯了错误或需要添加/更改的代码,都可以进行解释

import sys
import pygame
from pygame.locals import *
pygame.init()

size = width, height = 720, 480
speed = [2, 2]

#Colours
black = (0,0,0)
blue = (0,0,255)
green = (0,200,0)
red = (200,0,0)
green_bright = (0,255,0)
red_bright = (255,0,0)

screen = pygame.display.set_mode(size)

#Pictures
road = pygame.image.load(r"C:\Users\John\Desktop\Michael\V'Room External\1.png")
BackgroundPNG = pygame.image.load(r"C:\Users\John\Desktop\Michael\V'Room External\BackgroundPNG.png")
carImg = pygame.image.load(r"C:\Users\John\Desktop\Michael\V'Room External\Sp1.png").convert_alpha()


pygame.display.set_caption("Broom! || BETA::00.0.3")

clock = pygame.time.Clock()

def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()

def game_intro():
    intro = True

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

        mouse = pygame.mouse.get_pos()
        click = pygame.mouse.get_pressed()

        print(mouse)
        print(click)

        screen.fill(blue)
        screen.blit(BackgroundPNG,(0,0))

        largeText = pygame.font.Font('freesansbold.ttf',115)
        TextSurf, TextRect = text_objects("V'Room!", largeText)
        TextRect.center = ((width/2),(height/2))
        screen.blit(TextSurf, TextRect)

        #Button
        if 75+100 > mouse[0] > 75 and 400+50 > mouse[1] > 400:
            pygame.draw.rect(screen, green_bright,(75,400,100,50))

            if click != None and click[0] == 1:
                print("GO == 1 ! == None")
                x = 350
                y = 370
                game_start()
        else:
            pygame.draw.rect(screen, green,(75,400,100,50))

        smallText = pygame.font.Font("freesansbold.ttf",20)
        TextSurf, TextRect = text_objects("GO", smallText)
        TextRect.center = ((75+(100/2)),(400+(50/2)))
        screen.blit(TextSurf, TextRect)

        if 550+100 > mouse[0] > 550 and 400+50 > mouse[1] > 400:
            pygame.draw.rect(screen, red_bright,(550,400,100,50))

            if click != None and click[0] == 1:
                pygame.quit()
                quit()
        else:
            pygame.draw.rect(screen, red,(550,400,100,50))

        TextSurf, TextRect = text_objects("Exit", smallText)
        TextRect.center = ((550+(100/2)),(400+(50/2)))
        screen.blit(TextSurf, TextRect)

        pygame.display.flip()
        pygame.display.update()
        clock.tick(15)

def game_start():
   print("Car Loaded Sucessfully")
   screen.blit(road, (0,0))
   screen.blit(carImg, (350,370))

game_intro()

解决方案之一是使用
game\u start
变量而不是函数
game\u start()
,并使用它来决定要绘制的内容-标题、汽车和道路、前进或停止按钮等

我使用矩形代替位图来制作完整的工作示例

import pygame

# --- constants ----

size = width, height = 720, 480
speed = [2, 2]

#Colours

black = (0,0,0)
blue = (0,0,255)
green = (0,200,0)
red = (200,0,0)
green_bright = (0,255,0)
red_bright = (255,0,0)

# --- functions ---

def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()


def game_intro():

    largeText = pygame.font.Font('freesansbold.ttf',115)
    smallText = pygame.font.Font("freesansbold.ttf",20)

    text_vroom, text_vroom_rect = text_objects("V'Room!", largeText)
    text_vroom_rect.center = ((width/2),(height/2))

    text_go, text_go_rect = text_objects("GO", smallText)
    text_go_rect.center = ((75+(100/2)),(400+(50/2)))

    text_stop, text_stop_rect = text_objects("STOP", smallText)
    text_stop_rect.center = ((75+(100/2)),(400+(50/2)))

    text_exit, text_exit_rect = text_objects("Exit", smallText)
    text_exit_rect.center = ((550+(100/2)),(400+(50/2)))

    game_started = False 

    intro = True

    while intro:

        for event in pygame.event.get():
            print(event)
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        mouse = pygame.mouse.get_pos()
        click = pygame.mouse.get_pressed()

        screen.fill(blue)
        #screen.blit(BackgroundPNG,(0,0))


        # road and car - or title

        if game_started:
           screen.blit(road, (0,0))
           screen.blit(carImg, (350,370))
        else:
            screen.blit(text_vroom, text_vroom_rect)

        # Button GO/STOP

        if 75+100 > mouse[0] > 75 and 400+50 > mouse[1] > 400:
            pygame.draw.rect(screen, green_bright,(75,400,100,50))

            if click != None and click[0] == 1:
                # toggle True/False
                game_started = not game_started
        else:
            pygame.draw.rect(screen, green,(75,400,100,50))

        # draw GO or STOP
        if not game_started:
            screen.blit(text_go, text_go_rect)
        else:
            screen.blit(text_stop, text_stop_rect)

        # Button EXIT

        if 550+100 > mouse[0] > 550 and 400+50 > mouse[1] > 400:
            pygame.draw.rect(screen, red_bright,(550,400,100,50))

            if click != None and click[0] == 1:
                pygame.quit()
                quit()
        else:
            pygame.draw.rect(screen, red,(550,400,100,50))

        screen.blit(text_exit, text_exit_rect)

        pygame.display.flip()

        clock.tick(15)

# --- main ---

pygame.init()

screen = pygame.display.set_mode(size)
pygame.display.set_caption("Broom! || BETA::00.0.3")

#Pictures
road = pygame.surface.Surface( size )
road.fill(black)

carImg =  pygame.surface.Surface( (10,10) )
road.fill(green)

clock = pygame.time.Clock()

game_intro()
编辑:第二种解决方案是创建功能(
game\u running
),同时使用自己的
循环、自己的按钮等

我不得不使用
pygame.time.wait()
,因为
pygame.mouse.get\u pressed()
对于单击按钮来说不是一个好功能。计算机(和
while
循环)太快(对于人类点击)和
pygame.mouse.get_pressed()
切换按钮多次。最好使用
pygame.event.get()
进行单击

import pygame

# --- constants ----

size = width, height = 720, 480
speed = [2, 2]

#Colours

black = (0,0,0)
blue = (0,0,255)
green = (0,200,0)
red = (200,0,0)
green_bright = (0,255,0)
red_bright = (255,0,0)

# --- functions ---

def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()


def game_intro():

    text_vroom, text_vroom_rect = text_objects("V'Room!", largeText)
    text_vroom_rect.center = ((width/2),(height/2))

    text_go, text_go_rect = text_objects("GO", smallText)
    text_go_rect.center = ((75+(100/2)),(400+(50/2)))

    text_exit, text_exit_rect = text_objects("Exit", smallText)
    text_exit_rect.center = ((550+(100/2)),(400+(50/2)))

    running = True

    while running:

        for event in pygame.event.get():
            print(event)
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        mouse = pygame.mouse.get_pos()
        click = pygame.mouse.get_pressed()

        screen.fill(blue)
        screen.blit(text_vroom, text_vroom_rect)

        # Button GO

        if 75+100 > mouse[0] > 75 and 400+50 > mouse[1] > 400:
            pygame.draw.rect(screen, green_bright,(75,400,100,50))

            if click != None and click[0] == 1:
                # wait because `pygame.mouse.get_pressed()` is too fast for human clik
                pygame.time.wait(100)
                # run game
                game_running()
        else:
            pygame.draw.rect(screen, green,(75,400,100,50))

        screen.blit(text_go, text_go_rect)

        # Button EXIT

        if 550+100 > mouse[0] > 550 and 400+50 > mouse[1] > 400:
            pygame.draw.rect(screen, red_bright,(550,400,100,50))

            if click != None and click[0] == 1:
                pygame.quit()
                quit()
        else:
            pygame.draw.rect(screen, red,(550,400,100,50))

        screen.blit(text_exit, text_exit_rect)

        pygame.display.flip()

        clock.tick(15)

def game_running():

    text_stop, text_stop_rect = text_objects("STOP", smallText)
    text_stop_rect.center = ((75+(100/2)),(400+(50/2)))

    text_exit, text_exit_rect = text_objects("Exit", smallText)
    text_exit_rect.center = ((550+(100/2)),(400+(50/2)))

    running = True

    while running:

        for event in pygame.event.get():
            print(event)
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        mouse = pygame.mouse.get_pos()
        click = pygame.mouse.get_pressed()

        screen.fill(blue)
        #screen.blit(BackgroundPNG,(0,0))


        # road and car - or title

        screen.blit(road, (0,0))
        screen.blit(carImg, (350,370))

        # Button STOP

        if 75+100 > mouse[0] > 75 and 400+50 > mouse[1] > 400:
            pygame.draw.rect(screen, green_bright,(75,400,100,50))

            if click != None and click[0] == 1:
                # return to menu
                return
        else:
            pygame.draw.rect(screen, green,(75,400,100,50))

        # draw STOP
        screen.blit(text_stop, text_stop_rect)

        # Button EXIT

        if 550+100 > mouse[0] > 550 and 400+50 > mouse[1] > 400:
            pygame.draw.rect(screen, red_bright,(550,400,100,50))

            if click != None and click[0] == 1:
                pygame.quit()
                quit()
        else:
            pygame.draw.rect(screen, red,(550,400,100,50))

        screen.blit(text_exit, text_exit_rect)

        pygame.display.flip()

        clock.tick(15)


# --- main ---

pygame.init()

screen = pygame.display.set_mode(size)
pygame.display.set_caption("Broom! || BETA::00.0.3")

# pictures
road = pygame.surface.Surface( size )
road.fill(black)

carImg =  pygame.surface.Surface( (10,10) )
road.fill(green)

# fonts
largeText = pygame.font.Font('freesansbold.ttf',115)
smallText = pygame.font.Font("freesansbold.ttf",20)

# others

clock = pygame.time.Clock()

game_intro()

在游戏开始时,没有什么可以让它保持切换。它需要使用自己的
pygame.event.get()
screen.blit
pygame.display.flip()
pygame.display.flip()
pygame.display.update()
正在做几乎相同的事情-只使用其中一个。另一个解决方案:使用变量
game\u start=True
而不是函数
game\u start()
,然后使用
如果game\u启动:
在介绍循环时将汽车拉入
。我已将其更改为“def game\u start”():'但它将简介更改为false。因此,代码只会一直跳到游戏开始,而不会一直循环并重新启动主菜单。我不太确定这是否正确。我已经尝试过这个游戏了,它给了我一个黑屏