如何解决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()
如果我想将像素数据导出到一个 numpy 数组,并计算每种颜色的出现次数,我可以使用 pygame.surfarray.pixels2d 和 np.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}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。