以特定频率闪烁矩形白色 pygame

Blinking rectangle white pygame with specific frequency

我是一名大学生,我有一个具体的问题。

目前,我在 window 的中心显示一个白色矩形,在黑色背景上方显示 pygame。但目前我想以特定频率闪烁我的白色矩形,这就是我需要帮助的原因。

目前我实现了:

import pygame, sys
from pygame.locals import *

def main():
    pygame.init()

    fenetre = pygame.display.set_mode((500,400),0,32)

    black=(0,0,0)
    white=(255,255,255)

    fenetre.fill(black)

    pygame.draw.rect(fenetre, white,(200,150,100,50))


    while True:
        for event in pygame.event.get():
            if event.type==QUIT:
                pygame.quit()
                sys.exit()
        pygame.display.update()

main()

感谢社区的帮助。

我对您的代码进行了一些编辑以满足您的需要并对其进行了测试。

代码

import pygame
import sys
import time
from pygame.locals import *

pygame.init()

fenetre = pygame.display.set_mode((500, 400), 0, 32)
black = (0, 0, 0)
white = (255, 255, 255)
clock = pygame.time.Clock()

frequency = 1


def main():

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

        pygame.draw.rect(fenetre, black, (200, 150, 100, 50))
        pygame.display.update()
        time.sleep(frequency)
        pygame.draw.rect(fenetre, white, (200, 150, 100, 50))
        pygame.display.update()
        time.sleep(frequency)
        clock.tick(30)


main()
    

结果应该是矩形每 1 秒出现一次

非常流行的控制元素的方法是使用时间。

您设置下一次更改状态的时间,然后将其与当前时间进行比较。这样你就可以控制对象并且你不会停止 while True 循环所以它可以做其他事情。

import pygame
import sys

# --- constants ---

BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)

# --- main ---

def main():
    pygame.init()

    fenetre = pygame.display.set_mode((500, 400), 0, 32)

    # time in millisecond from start program 
    current_time = pygame.time.get_ticks()

    # how long to show or hide
    delay = 500 # 500ms = 0.5s

    # time of next change 
    change_time = current_time + delay
    show = True

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        # --- updates ---

        current_time = pygame.time.get_ticks()

        # is time to change ?
        if current_time >= change_time:
            # time of next change 
            change_time = current_time + delay
            show = not show

        # --- draws ---

        fenetre.fill(BLACK)

        if show:
            pygame.draw.rect(fenetre, WHITE,(200,150,100,50))

        pygame.display.update()

main()

编辑:更多元素相同

import pygame
import sys

# --- constants ---

BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

# --- main ---

def main():
    pygame.init()

    fenetre = pygame.display.set_mode((500, 400), 0, 32)

    current_time = pygame.time.get_ticks()

    # time of show or hide
    delay = 500 # 500ms = 0.5s

    # time of next change (WHITE)
    change_time = current_time + delay
    show = True

    # time of next change (RED)
    red_change_time = current_time + delay + 150
    red_show = False

    # time of next change (GREEN)
    green_change_time = current_time + delay + 300
    green_show = False

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        # --- updates ---

        current_time = pygame.time.get_ticks()

        # is time to change ? (WHITE)
        if current_time >= change_time:
            change_time = current_time + delay
            show = not show

        # is time to change ? (RED)
        if current_time >= red_change_time:
            red_change_time = current_time + delay
            red_show = not red_show

        # is time to change ? (GREEN)
        if current_time >= green_change_time:
            green_change_time = current_time + delay
            green_show = not red_show

        # --- draws ---

        fenetre.fill(BLACK)

        if show: # (WHITE)
            pygame.draw.rect(fenetre, WHITE, (200,150,100,50))

        if red_show: # (RED)
            pygame.draw.rect(fenetre, RED, (100,150,100,50))

        if green_show: # (GREEN)
            pygame.draw.rect(fenetre, GREEN, (300,150,100,50))

        pygame.display.update()

main()

编辑: 版本使用 class。但是这次频率不同

import pygame
import sys

# --- constants ---

BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)
RED   = (255,   0,   0)
GREEN = (  0, 255,   0)

# --- classes ---

class Rectangle():

    def __init__(self, color, rect, time, delay):
        self.color = color
        self.rect = rect
        self.time = time
        self.delay = delay
        self.show = False

    def draw(self, screen):
        if self.show:
            pygame.draw.rect(screen, self.color, self.rect)

    def update(self, current_time):
        if current_time >= self.time:
             self.time = current_time + self.delay
             self.show = not self.show

# --- main ---

def main():
    pygame.init()

    fenetre = pygame.display.set_mode((500, 400), 0, 32)

    current_time = pygame.time.get_ticks()

    # time of show or hide
    delay = 500 # 5000ms = 0.5s

    # objects    
    rect_white = Rectangle(WHITE, (200,150,100,50), current_time, 500)
    rect_red = Rectangle(RED, (100,150,100,50), current_time + 150, 100)
    rect_green = Rectangle(GREEN, (0, 0, 500, 400), current_time + 300, 2000)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        # --- updates ---

        current_time = pygame.time.get_ticks()

        rect_white.update(current_time)
        rect_red.update(current_time)
        rect_green.update(current_time)

        # --- draws ---

        fenetre.fill(BLACK)

        rect_green.draw(fenetre)
        rect_white.draw(fenetre)
        rect_red.draw(fenetre)

        pygame.display.update()

main()