You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pygame中实现星星随机闪烁效果?

实现星星闪烁效果的解决方案

原代码生成的星星始终静止在屏幕上,要实现星星偶尔闪烁的效果,核心思路是随机控制部分星星的显示/隐藏状态,同时用时间控制闪烁间隔,避免阻塞主循环。以下是具体实现方案:

关键修改点

  • 移除原代码中阻塞主循环的time.sleep(1),改用Pygame的pygame.time.get_ticks()控制闪烁触发间隔
  • 给两种星星分别添加状态列表,标记每颗星星是否处于显示状态
  • 在主循环中定时随机切换1-2颗星星的显示状态,模拟闪烁效果

修改后的完整代码

import pygame
from random import randint, choice

pygame.init()

display_width = 800
display_height = 600

gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption("My God, it's full of stars!")

med_star_img = pygame.image.load('images/medium_star.png')
tiny_star_img = pygame.image.load('images/tiny_star.png')

black = (0, 0, 0)
white = (255, 255, 255)
gray = (50, 50, 50)

tiny_stars_width = tiny_star_img.get_width()
tiny_stars_height = tiny_star_img.get_height()

med_stars_width = med_star_img.get_width()
med_stars_height = med_star_img.get_height()

# 存储星星位置
tiny_stars_location = []
med_stars_location = []

# 存储星星显示状态:True=显示,False=隐藏
tiny_star_visible = []
med_star_visible = []

clock = pygame.time.Clock()
running = True

# 初始化星星位置和显示状态
for i in range(25):
    rect = pygame.Rect(randint(1, 800), randint(1, 600), tiny_stars_width, tiny_stars_height)
    tiny_stars_location.append(rect)
    tiny_star_visible.append(True)

for i in range(10):
    rect = pygame.Rect(randint(1, 800), randint(1, 600), med_stars_width, med_stars_height)
    med_stars_location.append(rect)
    med_star_visible.append(True)

# 闪烁控制参数
last_blink_time = 0
# 闪烁间隔:1000-3000毫秒(1-3秒)
blink_interval_range = (1000, 3000)
# 每次闪烁切换1-2颗星星
blink_count_range = (1, 2)

def make_med_star(x, y):
    gameDisplay.blit(med_star_img, (x, y))
    
def make_tiny_star(x, y):
    gameDisplay.blit(tiny_star_img, (x, y))
    
while running:
    current_time = pygame.time.get_ticks()
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    # 检查是否到了闪烁时间
    if current_time - last_blink_time > randint(*blink_interval_range):
        last_blink_time = current_time
        blink_count = randint(*blink_count_range)
        
        # 随机切换指定数量的星星显示状态
        for _ in range(blink_count):
            # 随机选一种星星类型
            star_type = choice(['tiny', 'med'])
            if star_type == 'tiny' and tiny_stars_location:
                idx = randint(0, len(tiny_stars_location)-1)
                tiny_star_visible[idx] = not tiny_star_visible[idx]
            elif star_type == 'med' and med_stars_location:
                idx = randint(0, len(med_stars_location)-1)
                med_star_visible[idx] = not med_star_visible[idx]
    
    # 清空屏幕
    gameDisplay.fill(gray)
    
    # 绘制可见的星星
    for idx, star in enumerate(med_stars_location):
        if med_star_visible[idx]:
            make_med_star(star.x, star.y)
            
    for idx, star in enumerate(tiny_stars_location):
        if tiny_star_visible[idx]:
            make_tiny_star(star.x, star.y)
            
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quit()

代码说明

  1. 显示状态管理:新增tiny_star_visible和med_star_visible两个列表,对应每颗星星的显示状态,切换状态即可实现闪烁
  2. 时间控制:用pygame.time.get_ticks()获取当前时间,与上次闪烁时间对比,达到随机间隔后触发闪烁
  3. 随机选择:每次闪烁随机选择1-2颗不同类型的星星,切换其显示状态,模拟真实的星星闪烁效果
  4. 主循环优化:移除time.sleep(),避免阻塞事件处理,保证窗口响应流畅

内容的提问来源于stack exchange,提问作者ghulseman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:30:57