Pygame:如何改变背景颜色

时间:2016-12-16 17:56:06

标签: python python-3.x pygame

import pygame, sys
pygame.init()
screen = pygame.display.set_mode([800,600])
white = [255, 255, 255]
red = [255, 0, 0]
screen.fill(white)
pygame.display.set_caption("My program")
pygame.display.flip()



background = input("What color would you like?: ")
if background == "red":
    screen.fill(red)

running = True
while running:
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
        running = False
        pygame.quit()

我试图询问用户他想要的背景颜色。如果用户写入红色,则颜色不会改变,仍然保持白色。

3 个答案:

答案 0 :(得分:3)

下次更新显示时,它将重绘为红色。添加pygame.display.update()

background = input("What color would you like?: ")
if background == "red":
    screen.fill(red)
    pygame.display.update()

或者,您可以在{有条件地]更改背景颜色后移动pygame.display.flip()

另见Difference between pygame.display.update and pygame.display.flip

答案 1 :(得分:0)

创建一个变量来存储当前颜色:

currentColor = (255,255,255) # or 'white', since you created that value

background = input("What color would you like?: ")
if background == "red":
    currentColor = red # The current color is now red

在循环中:

while running:
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
            running = False
            pygame.quit()

    screen.fill(currentColor) # Fill the screen with whatever the stored color is. 

    pygame.display.update() # Refresh the screen, needed whatever the color is, so don't remove this

现在,当您需要重新着色屏幕时,只需将currentColor更改为您需要的任何颜色,屏幕将自动转换该颜色。 示例:

if foo:
    currentColor = (145, 254, 222)
elif bar:
    currentColor = (215, 100, 91)
顺便说一句,我认为将颜色存储为元组而不是列表更好 red = (255, 0, 0)

此外,除了循环之外,你不需要pygame.display.update(或翻转)。这个功能只需要获取每个绘制项目的最新形状/值并将其推送到屏幕,因此您只需将它作为循环中的最后一项,因此它会显示所有内容。

答案 2 :(得分:0)

实际上,screen.fill(red)更改了 Surface 对象screen中像素的颜色。您需要在更改颜色后更新显示。
但是请注意,您仅应在应用程序循环结束时更新一次显示。每帧显示多次更新会导致闪烁。另请参见Why is the PyGame animation is flickering

backcolor = white
if background == "red":
    backcolor = red

running = True
while running:
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
        running = False

    # clear background
    screen.fill(backcolor)

    # draw scene
    # [...]

    # update display
    pygame.display.flip() 

说明:

您实际上是在Surface对象上绘图。如果您在与PyGame显示器关联的 Surface 上绘画,则该信息不会立即显示在显示器中。当使用pygame.display.update()pygame.display.flip()更新显示时,更改将变为可见。

请参见pygame.display.flip()

这将更新整个显示的内容。

虽然pygame.display.flip()将更新整个显示的内容,但是pygame.display.update()仅允许将屏幕的一部分更新为已更新,而不是整个区域。 pygame.display.update()pygame.display.flip()的优化版本,适用于软件显示,但不适用于硬件加速的显示。