我是大学的学生,我有一个具体的问题。
目前,我在窗口中央显示一个白色矩形,背景为黑色背景上方的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()
感谢您的帮助社区。 p>
答案 0 :(得分:2)
非常流行的控制元素的方法是使用时间。
您设置下一个更改状态的时间,然后将其与当前时间进行比较。这样你就可以控制对象而不会停止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()
编辑:使用类的版本。但这次有不同的频率
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()
答案 1 :(得分:0)
我对您的代码进行了一些编辑,以满足您的需求并对其进行测试。
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秒出现的矩形