python - 单击“播放”时如何清除我的游戏屏幕并移动到新场景
问题描述
我不知道如何使用按钮功能将 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 函数工作。
解决方案
该问题是由
screen.fill(0,0,0)
因为第二个参数 topygame.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
语句改变globale变量的值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)
推荐阅读
- docker - Nginx反向代理不重定向?
- mysql - SQL查询生成排行榜并选择一个玩家信息
- loopback - 具有不同关系属性名称的环回中的多对多关系
- typescript - 打字稿泛型和类属性
- javascript - D3 js条形图平移
- python - 无法从 Python 中的 S3 存储桶下载图像/代码已经有访问密钥
- arraylist - 如何使对象在处理中的特定时间后出现
- android - Android 在 RecycleView 中处理 Google Map 的滚动
- boolean-logic - 布尔表达式简化作业 - 你能指出我的错误吗?
- r - ggboxplot 显着性括号位置太高