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

时间:2016-11-21 18:25:21

标签: python pygame rectangles

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

目前,我在窗口中央显示一个白色矩形,背景为黑色背景上方的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()

enter image description here

感谢您的帮助社区。

2 个答案:

答案 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秒出现的矩形