微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pygame 中的多个显示对象

如何解决Pygame 中的多个显示对象

我知道在 Pygame 中不可能有多个窗口:Multiple Displays in Pygame

但是,是否可以有多个显示对象,而实际上只向用户显示其中一个

例如,假设我有以下代码,它显示 2 个绿色圆圈和 2 个红色三角形:

import pygame

WIDTH,HEIGHT = 800,600
WIN = pygame.display.set_mode((WIDTH,HEIGHT))
FPS = 60
BLACK = (0,0)
GREEN = (0,128,0)
RED = (255,0)


def draw_window():

    # Set display background
    WIN.fill(BLACK)  
    
    # Draw shapes
    pygame.draw.circle(surface=WIN,center=(400,300),radius=20,color=GREEN)
    pygame.draw.polygon(surface=WIN,points=((410,270),(460,320),(390,290)),color=RED)
    pygame.draw.circle(surface=WIN,center=(200,150),radius=30,points=((180,190),(200,140),(190,270)),color=RED)
    
    # Update display
    pygame.display.update() 


def main():

    clock = pygame.time.Clock()
    run = True
    while run:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
        draw_window()

enter image description here

如果我想将像素数据导出到一个 numpy 数组,并计算每种颜色的出现次数,我可以使用 pygame.surfarray.pixels2dnp.unique

data = pygame.surfarray.pixels2d(WIN)
unique,counts = np.unique(data,return_counts=True)
print(dict(zip(unique,counts)))

返回每种颜色的像素数:

{0: 474303,32768: 3380,16711680: 2317}

但是,假设我想计算 4 个形状(而不是显示用户的每种颜色)的像素数,我可以简单地分配每个形状都有一种独特的颜色,例如在下面的代码中,它会给我我需要的东西(即 4 个形状中的每一个的像素数)。但这样做时,我向用户显示了“错误”的颜色(即他们应该只看到绿色和红色,而不是绿色、红色、黄色和蓝色)。

是否可以创建单独的“隐藏”版本的绘图(例如,为了分析目的而使用不同的颜色),这些版本与用户显示是分开的?我知道在 Pygame 中我不能有多个 窗口,但我想知道是否仍然可以创建多个显示对象 - 其中只有一个实际显示用户

我想一种解决方法可能是仅为单个帧绘制每个“隐藏”版本(即,当我导出到一个 numpy 数组时),但这似乎不是一个非常优雅的解决方案。暂时显示隐藏的图画时,用户可能会注意到突然“闪烁”,这将是很差的用户体验。

有没有更好的方法来做到这一点?

import pygame
import numpy as np

WIDTH,HEIGHT))
FPS = 60


BLACK = (0,0)
YELLOW = (255,255,0)
BLUE = (0,255)


def draw_window():

    # Set display background
    WIN.fill(BLACK)

    # Draw shapes
    pygame.draw.circle(surface=WIN,color=YELLOW)
    pygame.draw.polygon(surface=WIN,color=BLUE)

    # Update display
    pygame.display.update()


def main():

    clock = pygame.time.Clock()
    run = True
    count_colours = True
    while run:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
        draw_window()

        while count_colours:  # Run once only
            data = pygame.surfarray.pixels2d(WIN)
            unique,return_counts=True)
            print(dict(zip(unique,counts)))
            count_colours = False


if __name__ == "__main__":
    main()

输出

{0: 474303,255: 1256,32768: 867,16711680: 1061,16776960: 2513}

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。