繁体   English   中英

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

[英]Cannot get button to toggle a change in pygame

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

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_started变量而不是function game_start()并使用它来决定要绘制的内容-标题或汽车和道路,GO或STOP按钮等。

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

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()

编辑:第二种解决方案是使用自己的while循环,自己的按钮等创建函数( game_running )。

我必须使用pygame.time.wait()因为pygame.mouse.get_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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM