Python随机颜色在对象上闪烁

时间:2015-07-18 00:52:54

标签: python random colors

以下函数定义矩形,它们的x / y位置,宽度和高度以及颜色。我希望每次随机选择颜色

def things(thingx, thingy, thingw, thingh, color):
    rand_color = (random.randrange(0,255),random.randrange(0,255),random.randrange(0,255))
    pygame.draw.rect(gameDisplay, rand_color, [thingx, thingy, thingw, thingh])

当前代码导致程序闪烁不同的颜色。即使我将rand_color更改为在黑色和白色之间进行选择的变体,矩形也会在黑色和白色之间闪烁。这里发生了什么?

2 个答案:

答案 0 :(得分:2)

正如我在评论中所说,每次调用时,您的函数会生成不同的颜色,而闪烁问题可能是因为过于频繁地调用它而导致的。您可以通过使rand_color成为全局变量来解决这个问题,并在它被调用之前在函数之外定义它的值。

但是我认为在John Rodger's answer中使用类的想法很好,但是会以不同的方式实现它并尝试利用面向对象的编程而不是重新发明整个轮子。下面是我的意思的可运行的例子。每次运行时,它都会生成一个随机颜色的矩形来表示Thing个对象,当显示更新时,此颜色不会改变或闪烁。

import pygame, sys
from pygame.locals import *
import random

FPS = 30  # frames per second
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

class Thing(pygame.Rect):
    def __init__(self, *args, **kwargs):
        super(Thing, self).__init__(*args, **kwargs)  # init Rect base class
        # define additional attributes
        self.color = tuple(random.randrange(0, 256) for _ in range(3))
        self.x_speed, self.y_speed = 5, 5  # how fast it moves

    def draw(self, surface, width=0):
        pygame.draw.rect(surface, self.color, self, width)

def main():
    pygame.init()
    fpsclock = pygame.time.Clock()
    pygame.key.set_repeat(250)  # enable keyboard repeat for held down keys
    gameDisplay = pygame.display.set_mode((500,400), 0,32)
    gameDisplay.fill(WHITE)

    thingx,thingy, thingw,thingh = 200,150, 100,50
    thing = Thing(thingx, thingy, thingw, thingh)  # create an instance

    while True:  # display update loop
        gameDisplay.fill(WHITE)

        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_DOWN:
                    thing.y += thing.y_speed
                elif event.key == K_UP:
                    thing.y -= thing.y_speed
                elif event.key == K_RIGHT:
                    thing.x += thing.x_speed
                elif event.key == K_LEFT:
                    thing.x -= thing.x_speed

        thing.draw(gameDisplay)  # display at current position
        pygame.display.update()
        fpsclock.tick(FPS)

main()

答案 1 :(得分:0)

使用您发布的代码,您可以获得的最佳答案是每次循环迭代时都会重新评估rand_color,从而导致分配不同的颜色。

我的建议是只在初始化事物时调用随机函数,并且该事物应该是一个类:

class thing(width, height):
    def __init__(width, height):
        self.width = width
        self.height = height
        self.color = <random color logic>
    def getHeight(): return self.height
    def getWidth(): return self.width
    def getColor(): return self.color

如果要重用矩形,将它们存储为可以调用其属性的类是一种更好的结构。矩形类应该知道它自己的宽度/高度/颜色,而其他东西则跟踪它的位置。

如果您需要更多帮助,请发布更多代码。