python - set_alpha - Pygame blanco rectángulo parpadeante con frecuencia específica
python pygame documentation (2)
Soy estudiante en la universidad y tengo una pregunta específica.
Actualmente, muestro un rectángulo blanco en el centro de una ventana con pygame sobre un fondo negro. Pero en este momento me gustaría parpadear mi rectángulo blanco a una frecuencia específica, y es por eso que necesito ayuda.
Actualmente implemento eso:
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()
Gracias por su comunidad de ayuda.
Hice algunas modificaciones a su código para adaptarlo a sus necesidades y lo probé.
El código
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()
El resultado debe ser la rect que aparece cada 1 seg.
Método muy popular para controlar elementos es usar el tiempo.
Establece la hora del próximo estado de cambio y luego la compara con la hora actual. De esta forma, usted controla el objeto y no se detiene while True
loop para cando otras cosas.
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()
EDITAR: lo mismo con más elementos
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()
EDITAR: versión usando clase. Pero esta vez con diferentes frecuencias
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()