以特定频率闪烁矩形白色 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()
我是一名大学生,我有一个具体的问题。
目前,我在 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()