star set_alpha jpg event python pygame rectangles

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()