Python pygame 主副屏编程时 在副屏上全屏窗口的方法
Python在windows环境中编程时,用pygame工具包能够很轻易的完成2D游戏的简单设计,非常好用,相关帖子很多。
而当电脑连接了多块显示器时(注意不是windows的多桌面),系统选择扩展这些显示器后,可以利用的屏幕空间变大,用pygame设计程序窗口的尺寸也可以同步增加,但在设定为全屏时,却无法指定具体的显示器,查找了很多帖子,都未能很好的解决。
最后,经过多次尝试后,发现有可能是因为pygame版本更新的原因,造成参数改变引起的。当前我用的版本是pygame 2.6.0 (SDL 2.28.4, Python 3.11.5),其它版本是否相同未曾试过。
具体办法是指定display函数的display_index =1 ,这个函数的参数为:
screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN | pygame.DOUBLEBUF | pygame.HWSURFACE,depth = 0,display_index = 0,vsync=0)
这里第二给参数列出了一些常用的flag,而关键的是第四个参数,之前找到的帖子中这个参数被前移到的第三个,所以一直试不出来。
完整的测试代码(如果你有两块或更多显示器,并在系统中选择的扩展这些显示器):
import pygame
import sys
import random# 初始化pygame
pygame.init()# 获取显示设备数量
num_displays = pygame.display.get_num_displays()
if num_displays < 2:print("系统检测到的显示设备数量少于2个。")exit(0)# 设置窗口在第二块显示器上显示
screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN | pygame.DOUBLEBUF | pygame.HWSURFACE,0,1) # 设置窗口在第二块显示器上显示,display_index = 1
#screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN | pygame.DOUBLEBUF | pygame.HWSURFACE,depth = 0,display_index = 0,vsync=0)
pygame.display.set_caption('接苹果小游戏')
info = pygame.display.Info()
screen_width = info.current_w
screen_height = info.current_h
print(f"屏幕宽度:{screen_width},屏幕高度:{screen_height}")# 设置颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)# 设置苹果和篮子的图片(你需要准备这些图片并放在相应路径下)
apple_image = pygame.image.load('apple.png')
basket_image = pygame.image.load('basket.png')# 苹果类
class Apple:def __init__(self):self.pos_x = random.randint(0, screen_width - apple_image.get_width())self.pos_y = 0self.speed = random.randint(2, 5)def move(self):self.pos_y += self.speedif self.pos_y > screen_height:self.__init__() # 重置苹果位置和速度def draw(self):screen.blit(apple_image, (self.pos_x, self.pos_y))# 篮子类
class Basket:def __init__(self):self.pos_x = screen_width // 2 - basket_image.get_width() // 2self.pos_y = screen_height - basket_image.get_height() - 20self.speed = 5def move_left(self):self.pos_x -= self.speedif self.pos_x < 0:self.pos_x = 0def move_right(self):self.pos_x += self.speedif self.pos_x > screen_width - basket_image.get_width():self.pos_x = screen_width - basket_image.get_width()def draw(self):screen.blit(basket_image, (self.pos_x, self.pos_y))# 游戏主循环
def game_loop():apple = Apple()basket = Basket()score = 0clock = pygame.time.Clock()game_over = Falsewhile not game_over:for event in pygame.event.get():if event.type == pygame.QUIT:game_over = Trueelif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:basket.move_left()elif event.key == pygame.K_RIGHT:basket.move_right()apple.move()basket_rect = pygame.Rect(basket.pos_x, basket.pos_y, basket_image.get_width(), basket_image.get_height())apple_rect = pygame.Rect(apple.pos_x, apple.pos_y, apple_image.get_width(), apple_image.get_height())if basket_rect.colliderect(apple_rect):score += 1apple.__init__() # 重置苹果位置和速度screen.fill(WHITE)apple.draw()basket.draw()font = pygame.font.Font(None, 50)score_text = font.render(f"Score: {score}", 1, GREEN)screen.blit(score_text, (20, 20))pygame.display.flip()clock.tick(30) # 设置游戏帧率pygame.quit()sys.exit()game_loop()
这是一个AI生成的游戏代码,改动的部分就是pygame.display函数的参数设定。祝工作顺利!