我不知道如何使用按钮功能将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函数中使用它。
答案 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信息,而不是普通列表。)
您可能还会在这里找到一些有用的想法: