单击“播放”后,如何清除游戏屏幕并移至新场景

时间:2019-04-02 13:01:37

标签: python pygame

我不知道如何使用按钮功能将background.jpg重新覆盖在按钮上,或者擦除当前屏幕,并在清除场景后将背景放回原处。

import pygame


pygame.init()


screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()



BLACK = (0, 0, 0)
BACKGROUND = (200, 230, 234)
WHITE = (255, 255, 255)
HOVER_COLOUR = (50, 70, 90)
# Text Variables 
FONT = pygame.font.SysFont ("Times New Norman", 60)
TEXT = FONT.render ("", True, WHITE)
background_images = pygame.image.load("background.jpg").convert()
screen.blit(background_images, [0,0])
screen.blit(TEXT, (150, 50))
# Text & Rectangles construction
text1 = FONT.render("PlAY", True, WHITE)
text2 = FONT.render("CONTROLS", True, WHITE)
text3 = FONT.render("DIFFICULTY", True, WHITE)
text4 = FONT.render("SCOREBOARD", True, WHITE)

rect1 = pygame.Rect(250,200,300,80)
rect2 = pygame.Rect(250,300,300,80)
rect3 = pygame.Rect(250,400,300,80)
rect4 = pygame.Rect(250,500,300,80)
# The button construction arry. Text and Rectangle 
buttons = [
        [text1, rect1, BACKGROUND, 1],
        [text2, rect2, BACKGROUND, 2],
        [text3, rect3, BACKGROUND, 3],
        [text4, rect4, BACKGROUND, 4],
        ]

# Function for button printing (testing)
def on_button(buttons):
        print(buttons[3])


def game_intro():
        while True:
                for event in pygame.event.get():
                        if event.type == pygame.QUIT:
                                return
                        elif event.type == pygame.MOUSEMOTION:
                                for button in buttons:
                                        # Uses collisionpoint to detect mouse position collisions
                                        if button[1].collidepoint(event.pos):
                                                # Set the button's colour to the hover colour.
                                                button[2] = HOVER_COLOUR
                                        else:
                                                # resets the colour to normal.
                                                button[2] = BACKGROUND
                        # Button Controls 
                        elif event.type == pygame.MOUSEBUTTONDOWN:
                                for button in buttons:
                                        # Uses collisionpoint to detect mouse position collisions
                                        if button[1].collidepoint(event.pos):
                                                on_button(button)
                                        if button == buttons[0]:
                                                screen.fill(0,0,0)


                # Draws the buttons with their current colours (normal & collisions)
                for text, rect, colour, button_id in buttons:
                        pygame.draw.rect(screen, colour, rect)
                        screen.blit(text, rect)

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


#Run Game
game_intro()
pygame.quit()

如您所见,操作:

if button == buttons[0]:
screen.fill(0,0,0)

我正在使用的是什么。 if语句可以正常工作,并且iv通过打印操作测试了它的反馈,但是我不能在Pygame函数中使用它。

2 个答案:

答案 0 :(得分:1)

问题是由

引起的
screen.fill(0,0,0)

因为假设pygame.Surface.fill()的第二个参数是矩形(例如pygame.Rect),该矩形将填充限制为特定区域。

pygame.Surface.fill()的第一个参数必须是RGB序列,RGBA序列或颜色索引。

所以必须是

screen.fill( (0,0,0) )

screen.fill(0)

按钮仍然是它们,因为它们在每一帧中都连续绘制:

for text, rect, colour, button_id in buttons:
    pygame.draw.rect(screen, colour, rect)
    screen.blit(text, rect)

添加一个全局状态变量(play),该状态变量在按下播放按钮时设置。更改功能on_button中的状态,使用global statement更改全局变量play的值。根据状态绘制场景:

play = False
def on_button(buttons):
    global play 
    play = buttons[3] == 1
    print(buttons[3], play)
def game_intro():

    # [...]

    if play:
        screen.fill(0)

        # [...]            

    else: 
        for text, rect, colour, button_id in buttons:
            pygame.draw.rect(screen, colour, rect)
            screen.blit(text, rect)

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

答案 1 :(得分:0)

直接回答问题:

if button[1].collidepoint(event.pos):
    on_button(button)
if button == buttons[0]:
    screen.fill(0,0,0)

检查您的缩进。对于每个按钮,代码都会进行.collidepoint检查,并可能调用on_button,然后它还会检查正在检查的按钮-无论.collidepoint结果如何

if button[1].collidepoint(event.pos):
    on_button(button)
    if button == buttons[0]:
        screen.fill(0,0,0)

现在,screen.fill仅在两个条件都成立的情况下才会发生-即正在检查的按钮为buttons[0],而event.pos(即用户单击的位置)位于其中按钮。


但是要处理问题-您确实应该使用更复杂的方式来表示按钮。基本上,on_button代码是我们想要发生的事情,它根据单击哪个按钮来决定单击按钮时要执行的操作。为了使该工作顺利进行,buttons信息需要包含一些内容来告诉on_button该怎么做。

Python允许我们在这里做一些巧妙的事情:事物的名称就是名称,即使被命名的事物是一个函数-举例来说,这意味着我们可以将这些名称放入列表中,然后拉出他们出来,并使用它们来调用函数。例如,如果我们有一个解释“播放”按钮应该做什么的功能:

def do_play():
    # up to you ;)

然后设置按钮来存储该名称,而不是按钮ID:

play_button = [text1, rect1, BACKGROUND, do_play]

现在我们可以通过on_button为我们解决这个问题:

def on_button(button):
    button[3]()

当通过该按钮的.collidepoint测试通过时,它将传递到on_button,后者将查询函数名称do_play并调用该函数。简单:)

(下一个复杂程度是使用一个类来表示Button信息,而不是普通列表。)

您可能还会在这里找到一些有用的想法:

How to make buttons in python/pygame?

https://www.pygame.org/tags/button